GDBRemoteRegisterContext.cpp revision 74351ba53006b7fb17a5a32ac95c7af87bb03e8c
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" 2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes 2254e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/StringExtractorGDBRemote.h" 2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ProcessGDBRemote.h" 2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "ThreadGDBRemote.h" 2554e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_GCC_Registers.h" 2654e7afa84d945f9137f9372ecde432f9e1a702fcGreg Clayton#include "Utility/ARM_DWARF_Registers.h" 2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb; 2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerusing namespace lldb_private; 3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// GDBRemoteRegisterContext constructor 3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GDBRemoteRegisterContext 3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner( 3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ThreadGDBRemote &thread, 3708d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton uint32_t concrete_frame_idx, 3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner GDBRemoteDynamicRegisterInfo ®_info, 3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner bool read_all_at_once 4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner) : 4108d7d3ae16110aa68ed40c161eac8571aeb94cd9Greg Clayton RegisterContext (thread, concrete_frame_idx), 4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_info (reg_info), 4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid (), 4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data (), 4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_read_all_at_once (read_all_at_once) 4624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 4724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Resize our vector of bools to contain one bool for every register. 4824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // We will use these boolean values to know when a register value 4924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // is valid in m_reg_data. 5024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_valid.resize (reg_info.GetNumRegisters()); 5124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Make a heap based buffer that is big enough to store all registers 5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner DataBufferSP reg_data_sp(new DataBufferHeap (reg_info.GetRegisterDataByteSize(), 0)); 5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.SetData (reg_data_sp); 5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Destructor 6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//---------------------------------------------------------------------- 6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::~GDBRemoteRegisterContext() 6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 66a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::InvalidateAllRegisters () 6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::SetAllRegisterValid (bool b) 7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner std::vector<bool>::iterator pos, end = m_reg_valid.end(); 7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner for (pos = m_reg_valid.begin(); pos != end; ++pos) 7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner *pos = b; 7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterCount () 8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisters (); 8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 85b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonconst RegisterInfo * 8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterInfoAtIndex (uint32_t reg) 8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterInfoAtIndex (reg); 8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnersize_t 9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSetCount () 9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 9424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetNumRegisterSets (); 9524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 9624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 9824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 99b344843f75ef893762c93fd0a22d2d45712ce74dGreg Claytonconst RegisterSet * 10024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::GetRegisterSet (uint32_t reg_set) 10124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 10224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.GetRegisterSet (reg_set); 10324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 10424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 10724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 108061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::ReadRegister (const RegisterInfo *reg_info, RegisterValue &value) 10924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 11024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Read the register 111107e53da8bdca540db8b734ed237688eaeee85c5Greg Clayton if (ReadRegisterBytes (reg_info, m_reg_data)) 11224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 113061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const bool partial_data_ok = false; 114061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton Error error (value.SetValueFromData(reg_info, m_reg_data, reg_info->byte_offset, partial_data_ok)); 115061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return error.Success(); 11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 120c3c4661c6a7527580e605dbb69bef7634971fe13Greg Claytonbool 121a875b64ab8d258b28959d05eea37cb5dfdd72730Greg ClaytonGDBRemoteRegisterContext::PrivateSetRegisterValue (uint32_t reg, StringExtractor &response) 122a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton{ 123a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const RegisterInfo *reg_info = GetRegisterInfoAtIndex (reg); 124c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton if (reg_info == NULL) 125c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return false; 126a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 127a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Invalidate if needed 128a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 129a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 130a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 131a875b64ab8d258b28959d05eea37cb5dfdd72730Greg 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'); 132a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton bool success = bytes_copied == reg_byte_size; 133a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (success) 134a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 135a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_reg_valid[reg] = true; 136a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 137a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton else if (bytes_copied > 0) 138a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton { 139402607fe513617c06282d4ae479522e244a53b71Johnny Chen // Only set register is valid to false if we copied some bytes, else 140a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // leave it as it was. 141a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton m_reg_valid[reg] = false; 142a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton } 143c3c4661c6a7527580e605dbb69bef7634971fe13Greg Clayton return success; 144a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton} 145a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 14674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen// Helper function for GDBRemoteRegisterContext::ReadRegisterBytes(). 14774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenbool 14874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny ChenGDBRemoteRegisterContext::GetPrimordialRegister(const lldb_private::RegisterInfo *reg_info, 14974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GDBRemoteCommunicationClient &gdb_comm) 15074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{ 15174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen char packet[64]; 15274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen StringExtractorGDBRemote response; 15374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen int packet_len = 0; 15474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 15574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.GetThreadSuffixSupported()) 15674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet_len = ::snprintf (packet, sizeof(packet), "p%x;thread:%4.4llx;", reg, m_thread.GetID()); 15774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen else 15874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet_len = ::snprintf (packet, sizeof(packet), "p%x", reg); 15974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen assert (packet_len < (sizeof(packet) - 1)); 16074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.SendPacketAndWaitForResponse(packet, response, false)) 16174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return PrivateSetRegisterValue (reg, response); 16224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 16374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return false; 16474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen} 16524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 166107e53da8bdca540db8b734ed237688eaeee85c5Greg ClaytonGDBRemoteRegisterContext::ReadRegisterBytes (const RegisterInfo *reg_info, DataExtractor &data) 16724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 168f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 169402607fe513617c06282d4ae479522e244a53b71Johnny Chen 170f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 171f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 172f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 173f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 174f4124deeb9532044a38c0774ced872f2709347daGreg Clayton 175f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 17624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 177a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded(false); 178a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 179061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 180061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton 181a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!m_reg_valid[reg]) 18224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 18324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 18424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.GetSequenceMutex (locker)) 18524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 186c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 187f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 188f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetID())) 18924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 190c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[64]; 19124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 192c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 19324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 19424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 19524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get all registers in one packet 196c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 197444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4llx;", m_thread.GetID()); 198c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 199c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 20024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner assert (packet_len < (sizeof(packet) - 1)); 201c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, response, false)) 20224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 20361d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsNormalResponse()) 20424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (response.GetHexBytes ((void *)m_reg_data.GetDataStart(), m_reg_data.GetByteSize(), '\xcc') == m_reg_data.GetByteSize()) 20524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (true); 20624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 20874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen else if (!reg_info->value_regs) 20924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 21024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Get each register individually 21174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GetPrimordialRegister(reg_info, gdb_comm); 21274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 21374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen else 21474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 21574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Process this composite register request by delegating to the constituent 21674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // primordial registers. 21774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 21874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Index of the primordial register. 21974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen uint32_t prim_reg_idx; 22074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen bool success = true; 22174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen for (uint32_t idx = 0; 22274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen (prim_reg_idx = reg_info->value_regs[idx]) != LLDB_INVALID_REGNUM; 22374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen ++idx) 22474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 22574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // We have a valid primordial regsiter as our constituent. 22674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Grab the corresponding register info. 22774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg_idx); 22874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (!GetPrimordialRegister(prim_reg_info, gdb_comm)) 22974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 23074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen success = false; 23174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Some failure occurred. Let's break out of the for loop. 23274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen break; 23374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 23474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 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. 23974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen m_reg_valid[reg_info->kinds[eRegisterKindLLDB]] = true; 24074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 24124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 244a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 245a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // Make sure we got a valid register value after reading it 246a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (!m_reg_valid[reg]) 247a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return false; 24824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 24924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 250a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton if (&data != &m_reg_data) 25124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 252a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // If we aren't extracting into our own buffer (which 253a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // only happens when this function is called from 254a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // ReadRegisterValue(uint32_t, Scalar&)) then 255a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // we transfer bytes from our buffer into the data 256a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton // buffer that was passed in 257a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetByteOrder (m_reg_data.GetByteOrder()); 258a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton data.SetData (m_reg_data, reg_info->byte_offset, reg_info->byte_size); 25924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 260a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton return true; 26124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 26224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 26424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 265061b79dbf1fefaf157d414747e98a463a0f32edaGreg ClaytonGDBRemoteRegisterContext::WriteRegister (const RegisterInfo *reg_info, 266061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton const RegisterValue &value) 26724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 268061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton DataExtractor data; 269061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (value.GetData (data)) 270efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton return WriteRegisterBytes (reg_info, data, 0); 27124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 27224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 27324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 27474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen// Helper function for GDBRemoteRegisterContext::WriteRegisterBytes(). 27574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chenbool 27674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny ChenGDBRemoteRegisterContext::SetPrimordialRegister(const lldb_private::RegisterInfo *reg_info, 27774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen GDBRemoteCommunicationClient &gdb_comm) 27874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen{ 27974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen StreamString packet; 28074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen StringExtractorGDBRemote response; 28174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 28274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.Printf ("P%x=", reg); 28374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.PutBytesAsRawHex8 (m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size), 28474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen reg_info->byte_size, 28574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen lldb::endian::InlHostByteOrder(), 28674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen lldb::endian::InlHostByteOrder()); 28774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 28874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.GetThreadSuffixSupported()) 28974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.Printf (";thread:%4.4llx;", m_thread.GetID()); 29074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 29174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Invalidate just this register 29274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen m_reg_valid[reg] = false; 29374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 29474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen packet.GetString().size(), 29574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen response, 29674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen false)) 29774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 29874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (response.IsOKResponse()) 29974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return true; 30074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 30174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return false; 30274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen} 30324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 304efe0b80e66ce326b23ad070b4eebcd3070c310deGreg ClaytonGDBRemoteRegisterContext::WriteRegisterBytes (const lldb_private::RegisterInfo *reg_info, DataExtractor &data, uint32_t data_offset) 30524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 306f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 307402607fe513617c06282d4ae479522e244a53b71Johnny Chen 308f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 309f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 310f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 311f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 312402607fe513617c06282d4ae479522e244a53b71Johnny Chen 313f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 31424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// FIXME: This check isn't right because IsRunning checks the Public state, but this 315402607fe513617c06282d4ae479522e244a53b71Johnny Chen// is work you need to do - for instance in ShouldStop & friends - before the public 31624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// state has been changed. 31724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// if (gdb_comm.IsRunning()) 31824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// return false; 31924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 320061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton // Grab a pointer to where we are going to put this register 321061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton uint8_t *dst = const_cast<uint8_t*>(m_reg_data.PeekData(reg_info->byte_offset, reg_info->byte_size)); 32224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 323061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (dst == NULL) 324061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton return false; 325402607fe513617c06282d4ae479522e244a53b71Johnny Chen 326402607fe513617c06282d4ae479522e244a53b71Johnny Chen 327061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton if (data.CopyByteOrderedData (data_offset, // src offset 328061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_info->byte_size, // src length 329061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton dst, // dst 330061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton reg_info->byte_size, // dst length 331061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton m_reg_data.GetByteOrder())) // dst byte order 332061b79dbf1fefaf157d414747e98a463a0f32edaGreg Clayton { 33324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner Mutex::Locker locker; 33424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.GetSequenceMutex (locker)) 33524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 336c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 337f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 338f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetID())) 33924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner uint32_t offset, end_offset; 34124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StreamString packet; 34224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 34324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (m_read_all_at_once) 34424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 34574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Set all registers in one packet 34624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutChar ('G'); 34724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner offset = 0; 34824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner end_offset = m_reg_data.GetByteSize(); 34924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 35024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.PutBytesAsRawHex8 (m_reg_data.GetDataStart(), 35124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner m_reg_data.GetByteSize(), 352cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder(), 353cd548034fa23113e995b8463d14f910ba2f7298cGreg Clayton lldb::endian::InlHostByteOrder()); 354402607fe513617c06282d4ae479522e244a53b71Johnny Chen 355c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 356444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton packet.Printf (";thread:%4.4llx;", m_thread.GetID()); 357c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 35824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner // Invalidate all register values 359a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton InvalidateIfNeeded (true); 360a875b64ab8d258b28959d05eea37cb5dfdd72730Greg Clayton 36124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 36224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner packet.GetString().size(), 36324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner response, 36424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner false)) 36524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner SetAllRegisterValid (false); 36761d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 36824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 36924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return true; 37024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 37374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen else if (!reg_info->value_regs) 37474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 37574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Set each register individually 37674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return SetPrimordialRegister(reg_info, gdb_comm); 37774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 37824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner else 37924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 38074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Process this composite register request by delegating to the constituent 38174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // primordial registers. 38224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 38374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Invalidate this composite register first. 38474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen m_reg_valid[reg_info->kinds[eRegisterKindLLDB]] = false; 385c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 38674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Index of the primordial register. 38774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen uint32_t prim_reg_idx; 38874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // For loop index. 38974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen uint32_t idx; 39074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 39174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Invalidate the invalidate_regs, if present. 39274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (reg_info->invalidate_regs) 39324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen for (idx = 0; 39574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen (prim_reg_idx = reg_info->invalidate_regs[idx]) != LLDB_INVALID_REGNUM; 39674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen ++idx) 39724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 39874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Grab the invalidate register info. 39974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg_idx); 40074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen m_reg_valid[prim_reg_info->kinds[eRegisterKindLLDB]] = false; 40124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 40374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 40474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen bool success = true; 40574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen for (idx = 0; 40674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen (prim_reg_idx = reg_info->value_regs[idx]) != LLDB_INVALID_REGNUM; 40774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen ++idx) 40874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 40974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // We have a valid primordial regsiter as our constituent. 41074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Grab the corresponding register info. 41174351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen const RegisterInfo *prim_reg_info = GetRegisterInfoAtIndex(prim_reg_idx); 41274351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (!SetPrimordialRegister(prim_reg_info, gdb_comm)) 41374351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen { 41474351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen success = false; 41574351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Some failure occurred. Let's break out of the for loop. 41674351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen break; 41774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 41874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen } 41974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen return success; 42024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 42424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 42524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 42624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 42824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 42924943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ReadAllRegisterValues (lldb::DataBufferSP &data_sp) 43024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 431f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 432402607fe513617c06282d4ae479522e244a53b71Johnny Chen 433f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 434f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 435f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 436f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 437402607fe513617c06282d4ae479522e244a53b71Johnny Chen 438f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 439f4124deeb9532044a38c0774ced872f2709347daGreg Clayton 44024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 441402607fe513617c06282d4ae479522e244a53b71Johnny Chen 4424912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 4434912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 44424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 445c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton char packet[32]; 446c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 447f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 448f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetID())) 4494912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 450c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton int packet_len = 0; 451c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton if (thread_suffix_supported) 452444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g;thread:%4.4llx", m_thread.GetID()); 453c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton else 454c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton packet_len = ::snprintf (packet, sizeof(packet), "g"); 455c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton assert (packet_len < (sizeof(packet) - 1)); 456c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton 457c97bfdb5e9770f59872352197d277f9d7b1a9a49Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet, packet_len, response, false)) 4584912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 45961d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsErrorResponse()) 4604912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return false; 461402607fe513617c06282d4ae479522e244a53b71Johnny Chen 462139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton std::string &response_str = response.GetStringRef(); 463139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton if (isxdigit(response_str[0])) 464c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton { 465139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton response_str.insert(0, 1, 'G'); 466139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton if (thread_suffix_supported) 467139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton { 468139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton char thread_id_cstr[64]; 469444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton ::snprintf (thread_id_cstr, sizeof(thread_id_cstr), ";thread:%4.4llx;", m_thread.GetID()); 470139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton response_str.append (thread_id_cstr); 471139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton } 472139da72165577f073c14f2d5b86191e2c7b21d4cGreg Clayton data_sp.reset (new DataBufferHeap (response_str.c_str(), response_str.size())); 4733058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton return true; 4743058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 4754912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 4764912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 47724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 4783058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton data_sp.reset(); 47924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 48024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 48124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 48224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerbool 48324943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::WriteAllRegisterValues (const lldb::DataBufferSP &data_sp) 48424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 485f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton if (!data_sp || data_sp->GetBytes() == NULL || data_sp->GetByteSize() == 0) 486f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton return false; 487f3d0b0c8081691128626eb496fdfcbf8ae54c1deGreg Clayton 488f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ExecutionContext exe_ctx (CalculateThread()); 489402607fe513617c06282d4ae479522e244a53b71Johnny Chen 490f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Process *process = exe_ctx.GetProcessPtr(); 491f4124deeb9532044a38c0774ced872f2709347daGreg Clayton Thread *thread = exe_ctx.GetThreadPtr(); 492f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (process == NULL || thread == NULL) 493f4124deeb9532044a38c0774ced872f2709347daGreg Clayton return false; 494402607fe513617c06282d4ae479522e244a53b71Johnny Chen 495f4124deeb9532044a38c0774ced872f2709347daGreg Clayton GDBRemoteCommunicationClient &gdb_comm (((ProcessGDBRemote *)process)->GetGDBRemote()); 496f4124deeb9532044a38c0774ced872f2709347daGreg Clayton 49724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner StringExtractorGDBRemote response; 4984912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton Mutex::Locker locker; 4994912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton if (gdb_comm.GetSequenceMutex (locker)) 50024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 501c71899ef308e6134d1b0ca5f30cbc64414855e1aGreg Clayton const bool thread_suffix_supported = gdb_comm.GetThreadSuffixSupported(); 502f4124deeb9532044a38c0774ced872f2709347daGreg Clayton ProcessSP process_sp (m_thread.GetProcess()); 503f4124deeb9532044a38c0774ced872f2709347daGreg Clayton if (thread_suffix_supported || static_cast<ProcessGDBRemote *>(process_sp.get())->GetGDBRemote().SetCurrentThread(m_thread.GetID())) 5044912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 505efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // The data_sp contains the entire G response packet including the 506efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // G, and if the thread suffix is supported, it has the thread suffix 507efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // as well. 508efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const char *G_packet = (const char *)data_sp->GetBytes(); 509efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton size_t G_packet_len = data_sp->GetByteSize(); 510402607fe513617c06282d4ae479522e244a53b71Johnny Chen if (gdb_comm.SendPacketAndWaitForResponse (G_packet, 511402607fe513617c06282d4ae479522e244a53b71Johnny Chen G_packet_len, 512402607fe513617c06282d4ae479522e244a53b71Johnny Chen response, 513efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton false)) 5144912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton { 51561d043bbb1a1a20abf01dc73fa50c1ca0a46d71dGreg Clayton if (response.IsOKResponse()) 5164912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton return true; 517efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton else if (response.IsErrorResponse()) 518efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 519efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton uint32_t num_restored = 0; 520efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // We need to manually go through all of the registers and 521efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // restore them manually 522402607fe513617c06282d4ae479522e244a53b71Johnny Chen 5233058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response.GetStringRef().assign (G_packet, G_packet_len); 5243058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response.SetFilePos(1); // Skip the leading 'G' 5253058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton DataBufferHeap buffer (m_reg_data.GetByteSize(), 0); 526402607fe513617c06282d4ae479522e244a53b71Johnny Chen DataExtractor restore_data (buffer.GetBytes(), 527402607fe513617c06282d4ae479522e244a53b71Johnny Chen buffer.GetByteSize(), 5283058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_data.GetByteOrder(), 5293058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_data.GetAddressByteSize()); 530402607fe513617c06282d4ae479522e244a53b71Johnny Chen 531402607fe513617c06282d4ae479522e244a53b71Johnny Chen const uint32_t bytes_extracted = response.GetHexBytes ((void *)restore_data.GetDataStart(), 532402607fe513617c06282d4ae479522e244a53b71Johnny Chen restore_data.GetByteSize(), 5333058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton '\xcc'); 5343058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 5353058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (bytes_extracted < restore_data.GetByteSize()) 5363058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton restore_data.SetData(restore_data.GetDataStart(), bytes_extracted, m_reg_data.GetByteOrder()); 537efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton 538efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton //ReadRegisterBytes (const RegisterInfo *reg_info, RegisterValue &value, DataExtractor &data) 539efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const RegisterInfo *reg_info; 54004d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton // We have to march the offset of each register along in the 54104d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton // buffer to make sure we get the right offset. 54204d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton uint32_t reg_byte_offset = 0; 54304d397c5e251eaa5f520dbe6381d2a82303350e1Greg Clayton for (uint32_t reg_idx=0; (reg_info = GetRegisterInfoAtIndex (reg_idx)) != NULL; ++reg_idx, reg_byte_offset += reg_info->byte_size) 544efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 545efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const uint32_t reg = reg_info->kinds[eRegisterKindLLDB]; 546402607fe513617c06282d4ae479522e244a53b71Johnny Chen 54774351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen // Skip composite registers. 54874351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen if (reg_info->value_regs) 54974351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen continue; 55074351ba53006b7fb17a5a32ac95c7af87bb03e8cJohnny Chen 551402607fe513617c06282d4ae479522e244a53b71Johnny Chen // Only write down the registers that need to be written 552efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton // if we are going to be doing registers individually. 553efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton bool write_reg = true; 554efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton const uint32_t reg_byte_size = reg_info->byte_size; 5553058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 5563058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const char *restore_src = (const char *)restore_data.PeekData(reg_byte_offset, reg_byte_size); 5573058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (restore_src) 558efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton { 5593058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (m_reg_valid[reg]) 5603058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 5613058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton const char *current_src = (const char *)m_reg_data.PeekData(reg_byte_offset, reg_byte_size); 5623058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (current_src) 5633058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton write_reg = memcmp (current_src, restore_src, reg_byte_size) != 0; 5643058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 565402607fe513617c06282d4ae479522e244a53b71Johnny Chen 5663058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (write_reg) 5673058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 5683058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton StreamString packet; 5693058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.Printf ("P%x=", reg); 5703058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.PutBytesAsRawHex8 (restore_src, 5713058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton reg_byte_size, 5723058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton lldb::endian::InlHostByteOrder(), 5733058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton lldb::endian::InlHostByteOrder()); 5743058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 5753058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (thread_suffix_supported) 576444e35b5fdf15a25a427285650f06f1390e62c75Greg Clayton packet.Printf (";thread:%4.4llx;", m_thread.GetID()); 5773058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton 5783058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton m_reg_valid[reg] = false; 5793058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (gdb_comm.SendPacketAndWaitForResponse(packet.GetString().c_str(), 5803058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton packet.GetString().size(), 5813058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton response, 5823058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton false)) 5833058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton { 5843058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton if (response.IsOKResponse()) 5853058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton ++num_restored; 5863058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 5873058197753e56a7ea9f4c5784e460a3b977d7bd0Greg Clayton } 588efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 589efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 590efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton return num_restored > 0; 591efe0b80e66ce326b23ad070b4eebcd3070c310deGreg Clayton } 5924912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 5934912f39e324deab9fa5d2b4e114e017467c6b798Greg Clayton } 59424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 59524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return false; 59624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 59724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 59924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattneruint32_t 60024943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteRegisterContext::ConvertRegisterKindToRegisterNumber (uint32_t kind, uint32_t num) 60124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 60224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner return m_reg_info.ConvertRegisterKindToRegisterNumber (kind, num); 60324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 60424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 60524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnervoid 60624943d2ee8bfaa7cf5893e4709143924157a5c1eChris LattnerGDBRemoteDynamicRegisterInfo::HardcodeARMRegisters() 60724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{ 608402607fe513617c06282d4ae479522e244a53b71Johnny Chen // For Advanced SIMD and VFP register mapping. 609402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d0_regs[] = { 26, 27, LLDB_INVALID_REGNUM }; // (s0, s1) 610402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d1_regs[] = { 28, 29, LLDB_INVALID_REGNUM }; // (s2, s3) 611402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d2_regs[] = { 30, 31, LLDB_INVALID_REGNUM }; // (s4, s5) 612402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d3_regs[] = { 32, 33, LLDB_INVALID_REGNUM }; // (s6, s7) 613402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d4_regs[] = { 34, 35, LLDB_INVALID_REGNUM }; // (s8, s9) 614402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d5_regs[] = { 36, 37, LLDB_INVALID_REGNUM }; // (s10, s11) 615402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d6_regs[] = { 38, 39, LLDB_INVALID_REGNUM }; // (s12, s13) 616402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d7_regs[] = { 40, 41, LLDB_INVALID_REGNUM }; // (s14, s15) 617402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d8_regs[] = { 42, 43, LLDB_INVALID_REGNUM }; // (s16, s17) 618402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d9_regs[] = { 44, 45, LLDB_INVALID_REGNUM }; // (s18, s19) 619402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d10_regs[] = { 46, 47, LLDB_INVALID_REGNUM }; // (s20, s21) 620402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d11_regs[] = { 48, 49, LLDB_INVALID_REGNUM }; // (s22, s23) 621402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d12_regs[] = { 50, 51, LLDB_INVALID_REGNUM }; // (s24, s25) 622402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d13_regs[] = { 52, 53, LLDB_INVALID_REGNUM }; // (s26, s27) 623402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d14_regs[] = { 54, 55, LLDB_INVALID_REGNUM }; // (s28, s29) 624402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_d15_regs[] = { 56, 57, LLDB_INVALID_REGNUM }; // (s30, s31) 625f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q0_regs[] = { 26, 27, 28, 29, LLDB_INVALID_REGNUM }; // (d0, d1) -> (s0, s1, s2, s3) 626f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q1_regs[] = { 30, 31, 32, 33, LLDB_INVALID_REGNUM }; // (d2, d3) -> (s4, s5, s6, s7) 627f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q2_regs[] = { 34, 35, 36, 37, LLDB_INVALID_REGNUM }; // (d4, d5) -> (s8, s9, s10, s11) 628f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q3_regs[] = { 38, 39, 40, 41, LLDB_INVALID_REGNUM }; // (d6, d7) -> (s12, s13, s14, s15) 629f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q4_regs[] = { 42, 43, 44, 45, LLDB_INVALID_REGNUM }; // (d8, d9) -> (s16, s17, s18, s19) 630f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q5_regs[] = { 46, 47, 48, 49, LLDB_INVALID_REGNUM }; // (d10, d11) -> (s20, s21, s22, s23) 631f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q6_regs[] = { 50, 51, 52, 53, LLDB_INVALID_REGNUM }; // (d12, d13) -> (s24, s25, s26, s27) 632f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen static uint32_t g_q7_regs[] = { 54, 55, 56, 57, LLDB_INVALID_REGNUM }; // (d14, d15) -> (s28, s29, s30, s31) 633402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q8_regs[] = { 59, 60, LLDB_INVALID_REGNUM }; // (d16, d17) 634402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q9_regs[] = { 61, 62, LLDB_INVALID_REGNUM }; // (d18, d19) 635402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q10_regs[] = { 63, 64, LLDB_INVALID_REGNUM }; // (d20, d21) 636402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q11_regs[] = { 65, 66, LLDB_INVALID_REGNUM }; // (d22, d23) 637402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q12_regs[] = { 67, 68, LLDB_INVALID_REGNUM }; // (d24, d25) 638402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q13_regs[] = { 69, 70, LLDB_INVALID_REGNUM }; // (d26, d27) 639402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q14_regs[] = { 71, 72, LLDB_INVALID_REGNUM }; // (d28, d29) 640402607fe513617c06282d4ae479522e244a53b71Johnny Chen static uint32_t g_q15_regs[] = { 73, 74, LLDB_INVALID_REGNUM }; // (d30, d31) 641402607fe513617c06282d4ae479522e244a53b71Johnny Chen 642b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static RegisterInfo g_register_infos[] = { 643402607fe513617c06282d4ae479522e244a53b71Johnny Chen// NAME ALT SZ OFF ENCODING FORMAT COMPILER DWARF GENERIC GDB LLDB VALUE REGS INVALIDATE REGS 644402607fe513617c06282d4ae479522e244a53b71Johnny Chen// ====== ====== === === ============= ============ =================== =================== ====================== === ==== ========== =============== 645402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r0", "arg1", 4, 0, eEncodingUint, eFormatHex, { gcc_r0, dwarf_r0, LLDB_REGNUM_GENERIC_ARG1,0, 0 }, NULL, NULL}, 646402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r1", "arg2", 4, 0, eEncodingUint, eFormatHex, { gcc_r1, dwarf_r1, LLDB_REGNUM_GENERIC_ARG2,1, 1 }, NULL, NULL}, 647402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r2", "arg3", 4, 0, eEncodingUint, eFormatHex, { gcc_r2, dwarf_r2, LLDB_REGNUM_GENERIC_ARG3,2, 2 }, NULL, NULL}, 648402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r3", "arg4", 4, 0, eEncodingUint, eFormatHex, { gcc_r3, dwarf_r3, LLDB_REGNUM_GENERIC_ARG4,3, 3 }, NULL, NULL}, 649402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r4", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r4, dwarf_r4, LLDB_INVALID_REGNUM, 4, 4 }, NULL, NULL}, 650402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r5", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r5, dwarf_r5, LLDB_INVALID_REGNUM, 5, 5 }, NULL, NULL}, 651402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r6", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r6, dwarf_r6, LLDB_INVALID_REGNUM, 6, 6 }, NULL, NULL}, 652402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r7", "fp", 4, 0, eEncodingUint, eFormatHex, { gcc_r7, dwarf_r7, LLDB_REGNUM_GENERIC_FP, 7, 7 }, NULL, NULL}, 653402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r8", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r8, dwarf_r8, LLDB_INVALID_REGNUM, 8, 8 }, NULL, NULL}, 654402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r9", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r9, dwarf_r9, LLDB_INVALID_REGNUM, 9, 9 }, NULL, NULL}, 655402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r10", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r10, dwarf_r10, LLDB_INVALID_REGNUM, 10, 10 }, NULL, NULL}, 656402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r11", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r11, dwarf_r11, LLDB_INVALID_REGNUM, 11, 11 }, NULL, NULL}, 657402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "r12", NULL, 4, 0, eEncodingUint, eFormatHex, { gcc_r12, dwarf_r12, LLDB_INVALID_REGNUM, 12, 12 }, NULL, NULL}, 658402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "sp", "r13", 4, 0, eEncodingUint, eFormatHex, { gcc_sp, dwarf_sp, LLDB_REGNUM_GENERIC_SP, 13, 13 }, NULL, NULL}, 659402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "lr", "r14", 4, 0, eEncodingUint, eFormatHex, { gcc_lr, dwarf_lr, LLDB_REGNUM_GENERIC_RA, 14, 14 }, NULL, NULL}, 660402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "pc", "r15", 4, 0, eEncodingUint, eFormatHex, { gcc_pc, dwarf_pc, LLDB_REGNUM_GENERIC_PC, 15, 15 }, NULL, NULL}, 661402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f0", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 16, 16 }, NULL, NULL}, 662402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f1", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 17, 17 }, NULL, NULL}, 663402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f2", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 18, 18 }, NULL, NULL}, 664402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f3", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 19, 19 }, NULL, NULL}, 665402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f4", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 20, 20 }, NULL, NULL}, 666402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f5", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 21, 21 }, NULL, NULL}, 667402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f6", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 22, 22 }, NULL, NULL}, 668402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "f7", NULL, 12, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 23, 23 }, NULL, NULL}, 669402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "fps", NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 24, 24 }, NULL, NULL}, 670402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "cpsr","flags", 4, 0, eEncodingUint, eFormatHex, { gcc_cpsr, dwarf_cpsr, LLDB_INVALID_REGNUM, 25, 25 }, NULL, NULL}, 671402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s0", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s0, LLDB_INVALID_REGNUM, 26, 26 }, NULL, NULL}, 672402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s1", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s1, LLDB_INVALID_REGNUM, 27, 27 }, NULL, NULL}, 673402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s2", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s2, LLDB_INVALID_REGNUM, 28, 28 }, NULL, NULL}, 674402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s3", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s3, LLDB_INVALID_REGNUM, 29, 29 }, NULL, NULL}, 675402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s4", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s4, LLDB_INVALID_REGNUM, 30, 30 }, NULL, NULL}, 676402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s5", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s5, LLDB_INVALID_REGNUM, 31, 31 }, NULL, NULL}, 677402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s6", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s6, LLDB_INVALID_REGNUM, 32, 32 }, NULL, NULL}, 678402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s7", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s7, LLDB_INVALID_REGNUM, 33, 33 }, NULL, NULL}, 679402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s8", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s8, LLDB_INVALID_REGNUM, 34, 34 }, NULL, NULL}, 680402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s9", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s9, LLDB_INVALID_REGNUM, 35, 35 }, NULL, NULL}, 681402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s10", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s10, LLDB_INVALID_REGNUM, 36, 36 }, NULL, NULL}, 682402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s11", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s11, LLDB_INVALID_REGNUM, 37, 37 }, NULL, NULL}, 683402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s12", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s12, LLDB_INVALID_REGNUM, 38, 38 }, NULL, NULL}, 684402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s13", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s13, LLDB_INVALID_REGNUM, 39, 39 }, NULL, NULL}, 685402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s14", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s14, LLDB_INVALID_REGNUM, 40, 40 }, NULL, NULL}, 686402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s15", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s15, LLDB_INVALID_REGNUM, 41, 41 }, NULL, NULL}, 687402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s16", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s16, LLDB_INVALID_REGNUM, 42, 42 }, NULL, NULL}, 688402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s17", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s17, LLDB_INVALID_REGNUM, 43, 43 }, NULL, NULL}, 689402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s18", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s18, LLDB_INVALID_REGNUM, 44, 44 }, NULL, NULL}, 690402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s19", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s19, LLDB_INVALID_REGNUM, 45, 45 }, NULL, NULL}, 691402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s20", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s20, LLDB_INVALID_REGNUM, 46, 46 }, NULL, NULL}, 692402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s21", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s21, LLDB_INVALID_REGNUM, 47, 47 }, NULL, NULL}, 693402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s22", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s22, LLDB_INVALID_REGNUM, 48, 48 }, NULL, NULL}, 694402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s23", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s23, LLDB_INVALID_REGNUM, 49, 49 }, NULL, NULL}, 695402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s24", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s24, LLDB_INVALID_REGNUM, 50, 50 }, NULL, NULL}, 696402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s25", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s25, LLDB_INVALID_REGNUM, 51, 51 }, NULL, NULL}, 697402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s26", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s26, LLDB_INVALID_REGNUM, 52, 52 }, NULL, NULL}, 698402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s27", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s27, LLDB_INVALID_REGNUM, 53, 53 }, NULL, NULL}, 699402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s28", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s28, LLDB_INVALID_REGNUM, 54, 54 }, NULL, NULL}, 700402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s29", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s29, LLDB_INVALID_REGNUM, 55, 55 }, NULL, NULL}, 701402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s30", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s30, LLDB_INVALID_REGNUM, 56, 56 }, NULL, NULL}, 702402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "s31", NULL, 4, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_s31, LLDB_INVALID_REGNUM, 57, 57 }, NULL, NULL}, 703402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "fpscr",NULL, 4, 0, eEncodingUint, eFormatHex, { LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, LLDB_INVALID_REGNUM, 58, 58 }, NULL, NULL}, 704402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d16", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d16, LLDB_INVALID_REGNUM, 59, 59 }, NULL, NULL}, 705402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d17", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d17, LLDB_INVALID_REGNUM, 60, 60 }, NULL, NULL}, 706402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d18", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d18, LLDB_INVALID_REGNUM, 61, 61 }, NULL, NULL}, 707402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d19", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d19, LLDB_INVALID_REGNUM, 62, 62 }, NULL, NULL}, 708402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d20", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d20, LLDB_INVALID_REGNUM, 63, 63 }, NULL, NULL}, 709402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d21", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d21, LLDB_INVALID_REGNUM, 64, 64 }, NULL, NULL}, 710402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d22", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d22, LLDB_INVALID_REGNUM, 65, 65 }, NULL, NULL}, 711402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d23", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d23, LLDB_INVALID_REGNUM, 66, 66 }, NULL, NULL}, 712402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d24", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d24, LLDB_INVALID_REGNUM, 67, 67 }, NULL, NULL}, 713402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d25", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d25, LLDB_INVALID_REGNUM, 68, 68 }, NULL, NULL}, 714402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d26", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d26, LLDB_INVALID_REGNUM, 69, 69 }, NULL, NULL}, 715402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d27", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d27, LLDB_INVALID_REGNUM, 70, 70 }, NULL, NULL}, 716402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d28", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d28, LLDB_INVALID_REGNUM, 71, 71 }, NULL, NULL}, 717402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d29", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d29, LLDB_INVALID_REGNUM, 72, 72 }, NULL, NULL}, 718402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d30", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d30, LLDB_INVALID_REGNUM, 73, 73 }, NULL, NULL}, 719402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d31", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d31, LLDB_INVALID_REGNUM, 74, 74 }, NULL, NULL}, 720402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d0", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d0, LLDB_INVALID_REGNUM, 75, 75 }, g_d0_regs, NULL}, 721402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d1", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d1, LLDB_INVALID_REGNUM, 76, 76 }, g_d1_regs, NULL}, 722402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d2", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d2, LLDB_INVALID_REGNUM, 77, 77 }, g_d2_regs, NULL}, 723402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d3", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d3, LLDB_INVALID_REGNUM, 78, 78 }, g_d3_regs, NULL}, 724402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d4", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d4, LLDB_INVALID_REGNUM, 79, 79 }, g_d4_regs, NULL}, 725402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d5", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d5, LLDB_INVALID_REGNUM, 80, 80 }, g_d5_regs, NULL}, 726402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d6", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d6, LLDB_INVALID_REGNUM, 81, 81 }, g_d6_regs, NULL}, 727402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d7", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d7, LLDB_INVALID_REGNUM, 82, 82 }, g_d7_regs, NULL}, 728402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d8", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d8, LLDB_INVALID_REGNUM, 83, 83 }, g_d8_regs, NULL}, 729402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d9", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d9, LLDB_INVALID_REGNUM, 84, 84 }, g_d9_regs, NULL}, 730402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d10", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d10, LLDB_INVALID_REGNUM, 85, 85 }, g_d10_regs, NULL}, 731402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d11", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d11, LLDB_INVALID_REGNUM, 86, 86 }, g_d11_regs, NULL}, 732402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d12", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d12, LLDB_INVALID_REGNUM, 87, 87 }, g_d12_regs, NULL}, 733402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d13", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d13, LLDB_INVALID_REGNUM, 88, 88 }, g_d13_regs, NULL}, 734402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d14", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d14, LLDB_INVALID_REGNUM, 89, 89 }, g_d14_regs, NULL}, 735402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "d15", NULL, 8, 0, eEncodingIEEE754, eFormatFloat, { LLDB_INVALID_REGNUM, dwarf_d15, LLDB_INVALID_REGNUM, 90, 90 }, g_d15_regs, NULL}, 736402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q0", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q0, LLDB_INVALID_REGNUM, 91, 91 }, g_q0_regs, NULL}, 737402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q1", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q1, LLDB_INVALID_REGNUM, 92, 92 }, g_q1_regs, NULL}, 738402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q2", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q2, LLDB_INVALID_REGNUM, 93, 93 }, g_q2_regs, NULL}, 739402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q3", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q3, LLDB_INVALID_REGNUM, 94, 94 }, g_q3_regs, NULL}, 740402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q4", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q4, LLDB_INVALID_REGNUM, 95, 95 }, g_q4_regs, NULL}, 741402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q5", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q5, LLDB_INVALID_REGNUM, 96, 96 }, g_q5_regs, NULL}, 742402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q6", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q6, LLDB_INVALID_REGNUM, 97, 97 }, g_q6_regs, NULL}, 743402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q7", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q7, LLDB_INVALID_REGNUM, 98, 98 }, g_q7_regs, NULL}, 744402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q8", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q8, LLDB_INVALID_REGNUM, 99, 99 }, g_q8_regs, NULL}, 745402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q9", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q9, LLDB_INVALID_REGNUM, 100, 100 }, g_q9_regs, NULL}, 746402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q10", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q10, LLDB_INVALID_REGNUM, 101, 101 }, g_q10_regs, NULL}, 747402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q11", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q11, LLDB_INVALID_REGNUM, 102, 102 }, g_q11_regs, NULL}, 748402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q12", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q12, LLDB_INVALID_REGNUM, 103, 103 }, g_q12_regs, NULL}, 749402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q13", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q13, LLDB_INVALID_REGNUM, 104, 104 }, g_q13_regs, NULL}, 750402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q14", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q14, LLDB_INVALID_REGNUM, 105, 105 }, g_q14_regs, NULL}, 751402607fe513617c06282d4ae479522e244a53b71Johnny Chen { "q15", NULL, 16, 0, eEncodingVector, eFormatVectorOfUInt8, { LLDB_INVALID_REGNUM, dwarf_q15, LLDB_INVALID_REGNUM, 106, 106 }, g_q15_regs, NULL} 75224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner }; 753b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton 754b344843f75ef893762c93fd0a22d2d45712ce74dGreg Clayton static const uint32_t num_registers = sizeof (g_register_infos)/sizeof (RegisterInfo); 75524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString gpr_reg_set ("General Purpose Registers"); 756b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton static ConstString sfp_reg_set ("Software Floating Point Registers"); 75724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner static ConstString vfp_reg_set ("Floating Point Registers"); 758b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint32_t i; 759b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton // Calculate the offsets of the registers 760f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen // Note that the layout of the "composite" registers (d0-d15 and q0-q15) which comes after the 761f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen // "primordial" registers is important. This enables us to calculate the offset of the composite 762f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen // register by using the offset of its first primordial register. For example, to calculate the 763a330f97376b0b644c07b47357c3fe5123a304dfdJohnny Chen // offset of q0, use s0's offset. 764b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (g_register_infos[2].byte_offset == 0) 765b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 766b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton uint32_t byte_offset = 0; 767b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (i=0; i<num_registers; ++i) 768b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton { 769f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen // For primordial registers, increment the byte_offset by the byte_size to arrive at the 770f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen // byte_offset for the next register. Otherwise, we have a composite register whose 771f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen // offset can be calculated by consulting the offset of its first primordial register. 772f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen if (!g_register_infos[i].value_regs) 773f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen { 774f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen g_register_infos[i].byte_offset = byte_offset; 775f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen byte_offset += g_register_infos[i].byte_size; 776f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen } 777f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen else 778f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen { 779f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen const uint32_t first_primordial_reg = g_register_infos[i].value_regs[0]; 780f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen g_register_infos[i].byte_offset = g_register_infos[first_primordial_reg].byte_offset; 781f5c33960ceae3108e6324498d17bbb3ae79301e0Johnny Chen } 782b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 783b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton } 784b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton for (i=0; i<num_registers; ++i) 78524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner { 78624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString name; 78724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner ConstString alt_name; 78824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].name && g_register_infos[i].name[0]) 78924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner name.SetCString(g_register_infos[i].name); 79024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner if (g_register_infos[i].alt_name && g_register_infos[i].alt_name[0]) 79124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner alt_name.SetCString(g_register_infos[i].alt_name); 792402607fe513617c06282d4ae479522e244a53b71Johnny Chen 793b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton if (i <= 15 || i == 25) 794b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, gpr_reg_set); 795b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else if (i <= 24) 796b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, sfp_reg_set); 797b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton else 798b72d0f098e45936fa72e26b1a026c603e17e2d6cGreg Clayton AddRegister (g_register_infos[i], name, alt_name, vfp_reg_set); 79924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner } 80024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner} 80124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner 802