Modifed lldb_private::Process to be able to handle connecting to a remote target that isn't running a process. This leaves lldb_private::Process in the eStateConnected state from which we can then do an attach or launch. Modified ProcessGDBRemote to be able to set stdin, stdout, stderr, working dir, disable ASLR and a few other settings down by using new GDB remote packets. This allows us to keep all of our current launch flags and settings intact and still be able to communicate them over to the remote GDB server. Previously these were being sent as arguments to the debugserver binary that we were spawning. Also modified ProcessGDBRemote to handle losing connection to the remote GDB server and always exit immediately. We do this by watching the lldb_private::Communication event bit for the read thread exiting in the ProcessGDBRemote async thread. Added support for many of the new 'Q' packets for setting stdin, stdout, stderr, working dir and disable ASLR to the GDBRemoteCommunication class for easy accesss. Modified debugserver for all of the new 'Q' packets and also made it so that debugserver always exists if it loses connection with the remote debugger. llvm-svn: 126444
100 lines
2.5 KiB
C++
100 lines
2.5 KiB
C++
//===-- DNBArch.cpp ---------------------------------------------*- C++ -*-===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// Created by Greg Clayton on 6/24/07.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "DNBArch.h"
|
|
#include <assert.h>
|
|
#include <mach/mach.h>
|
|
|
|
#include <map>
|
|
|
|
#include "DNBLog.h"
|
|
|
|
typedef std::map<uint32_t, DNBArchPluginInfo> CPUPluginInfoMap;
|
|
|
|
//#if defined (__i386__)
|
|
//static uint32_t g_current_cpu_type = CPU_TYPE_I386;
|
|
//#elif defined (__x86_64__)
|
|
//static uint32_t g_current_cpu_type = CPU_TYPE_X86_64;
|
|
#if defined (__i386__) || defined (__x86_64__)
|
|
static uint32_t g_current_cpu_type = 0;
|
|
#elif defined (__arm__)
|
|
static uint32_t g_current_cpu_type = CPU_TYPE_ARM;
|
|
#else
|
|
static uint32_t g_current_cpu_type = 0;
|
|
#endif
|
|
|
|
CPUPluginInfoMap g_arch_plugins;
|
|
|
|
|
|
static const DNBArchPluginInfo *
|
|
GetArchInfo ()
|
|
{
|
|
CPUPluginInfoMap::const_iterator pos = g_arch_plugins.find(g_current_cpu_type);
|
|
if (pos != g_arch_plugins.end())
|
|
return &pos->second;
|
|
return NULL;
|
|
}
|
|
|
|
|
|
uint32_t
|
|
DNBArchProtocol::GetArchitecture ()
|
|
{
|
|
return g_current_cpu_type;
|
|
}
|
|
|
|
bool
|
|
DNBArchProtocol::SetArchitecture (uint32_t cpu_type)
|
|
{
|
|
g_current_cpu_type = cpu_type;
|
|
bool result = g_arch_plugins.find(g_current_cpu_type) != g_arch_plugins.end();
|
|
DNBLogThreadedIf (LOG_PROCESS, "DNBArchProtocol::SetDefaultArchitecture (cpu_type=0x%8.8x) => %i", cpu_type, result);
|
|
return result;
|
|
}
|
|
|
|
void
|
|
DNBArchProtocol::RegisterArchPlugin (const DNBArchPluginInfo &arch_info)
|
|
{
|
|
if (arch_info.cpu_type)
|
|
g_arch_plugins[arch_info.cpu_type] = arch_info;
|
|
}
|
|
|
|
const DNBRegisterSetInfo *
|
|
DNBArchProtocol::GetRegisterSetInfo (nub_size_t *num_reg_sets)
|
|
{
|
|
const DNBArchPluginInfo *arch_info = GetArchInfo ();
|
|
if (arch_info)
|
|
return arch_info->GetRegisterSetInfo (num_reg_sets);
|
|
*num_reg_sets = 0;
|
|
return NULL;
|
|
}
|
|
|
|
DNBArchProtocol *
|
|
DNBArchProtocol::Create (MachThread *thread)
|
|
{
|
|
const DNBArchPluginInfo *arch_info = GetArchInfo ();
|
|
if (arch_info)
|
|
return arch_info->Create (thread);
|
|
return NULL;
|
|
|
|
}
|
|
|
|
const uint8_t * const
|
|
DNBArchProtocol::GetBreakpointOpcode (nub_size_t byte_size)
|
|
{
|
|
const DNBArchPluginInfo *arch_info = GetArchInfo ();
|
|
if (arch_info)
|
|
return arch_info->GetBreakpointOpcode (byte_size);
|
|
return NULL;
|
|
}
|
|
|