diff options
Diffstat (limited to 'tools/debugserver/source/DNBArch.cpp')
-rw-r--r-- | tools/debugserver/source/DNBArch.cpp | 97 |
1 files changed, 97 insertions, 0 deletions
diff --git a/tools/debugserver/source/DNBArch.cpp b/tools/debugserver/source/DNBArch.cpp new file mode 100644 index 0000000000000..f17a719e92ecd --- /dev/null +++ b/tools/debugserver/source/DNBArch.cpp @@ -0,0 +1,97 @@ +//===-- 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; + +static uint32_t g_current_cpu_type = 0; +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; +} + +uint32_t +DNBArchProtocol::GetRegisterCPUType () +{ + const DNBArchPluginInfo *arch_info = GetArchInfo (); + if (arch_info) + return arch_info->cpu_type; + return 0; +} + +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 * +DNBArchProtocol::GetBreakpointOpcode (nub_size_t byte_size) +{ + const DNBArchPluginInfo *arch_info = GetArchInfo (); + if (arch_info) + return arch_info->GetBreakpointOpcode (byte_size); + return NULL; +} + |