1061da546Spatrick //===-- DNBArch.cpp ---------------------------------------------*- C++ -*-===// 2061da546Spatrick // 3061da546Spatrick // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4061da546Spatrick // See https://llvm.org/LICENSE.txt for license information. 5061da546Spatrick // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6061da546Spatrick // 7061da546Spatrick //===----------------------------------------------------------------------===// 8061da546Spatrick // 9061da546Spatrick // Created by Greg Clayton on 6/24/07. 10061da546Spatrick // 11061da546Spatrick //===----------------------------------------------------------------------===// 12061da546Spatrick 13061da546Spatrick #include "DNBArch.h" 14*be691f3bSpatrick #include <cassert> 15061da546Spatrick #include <mach/mach.h> 16061da546Spatrick 17061da546Spatrick #include <map> 18061da546Spatrick 19061da546Spatrick #include "DNBLog.h" 20061da546Spatrick 21061da546Spatrick typedef std::map<uint32_t, DNBArchPluginInfo> CPUPluginInfoMap; 22061da546Spatrick 23061da546Spatrick static uint32_t g_current_cpu_type = 0; 24*be691f3bSpatrick static uint32_t g_current_cpu_subtype = 0; 25061da546Spatrick CPUPluginInfoMap g_arch_plugins; 26061da546Spatrick GetArchInfo()27061da546Spatrickstatic const DNBArchPluginInfo *GetArchInfo() { 28061da546Spatrick CPUPluginInfoMap::const_iterator pos = 29061da546Spatrick g_arch_plugins.find(g_current_cpu_type); 30061da546Spatrick if (pos != g_arch_plugins.end()) 31061da546Spatrick return &pos->second; 32061da546Spatrick return NULL; 33061da546Spatrick } 34061da546Spatrick GetCPUType()35*be691f3bSpatrickuint32_t DNBArchProtocol::GetCPUType() { return g_current_cpu_type; } GetCPUSubType()36*be691f3bSpatrickuint32_t DNBArchProtocol::GetCPUSubType() { return g_current_cpu_subtype; } 37061da546Spatrick SetArchitecture(uint32_t cpu_type,uint32_t cpu_subtype)38*be691f3bSpatrickbool DNBArchProtocol::SetArchitecture(uint32_t cpu_type, uint32_t cpu_subtype) { 39061da546Spatrick g_current_cpu_type = cpu_type; 40*be691f3bSpatrick g_current_cpu_subtype = cpu_subtype; 41061da546Spatrick bool result = g_arch_plugins.find(g_current_cpu_type) != g_arch_plugins.end(); 42*be691f3bSpatrick DNBLogThreadedIf(LOG_PROCESS, 43*be691f3bSpatrick "DNBArchProtocol::SetDefaultArchitecture (cpu_type=0x%8.8x, " 44*be691f3bSpatrick "cpu_subtype=0x%8.8x) => %i", 45*be691f3bSpatrick cpu_type, cpu_subtype, result); 46061da546Spatrick return result; 47061da546Spatrick } 48061da546Spatrick RegisterArchPlugin(const DNBArchPluginInfo & arch_info)49061da546Spatrickvoid DNBArchProtocol::RegisterArchPlugin(const DNBArchPluginInfo &arch_info) { 50061da546Spatrick if (arch_info.cpu_type) 51061da546Spatrick g_arch_plugins[arch_info.cpu_type] = arch_info; 52061da546Spatrick } 53061da546Spatrick GetRegisterCPUType()54061da546Spatrickuint32_t DNBArchProtocol::GetRegisterCPUType() { 55061da546Spatrick const DNBArchPluginInfo *arch_info = GetArchInfo(); 56061da546Spatrick if (arch_info) 57061da546Spatrick return arch_info->cpu_type; 58061da546Spatrick return 0; 59061da546Spatrick } 60061da546Spatrick 61061da546Spatrick const DNBRegisterSetInfo * GetRegisterSetInfo(nub_size_t * num_reg_sets)62061da546SpatrickDNBArchProtocol::GetRegisterSetInfo(nub_size_t *num_reg_sets) { 63061da546Spatrick const DNBArchPluginInfo *arch_info = GetArchInfo(); 64061da546Spatrick if (arch_info) 65061da546Spatrick return arch_info->GetRegisterSetInfo(num_reg_sets); 66061da546Spatrick *num_reg_sets = 0; 67061da546Spatrick return NULL; 68061da546Spatrick } 69061da546Spatrick Create(MachThread * thread)70061da546SpatrickDNBArchProtocol *DNBArchProtocol::Create(MachThread *thread) { 71061da546Spatrick const DNBArchPluginInfo *arch_info = GetArchInfo(); 72061da546Spatrick if (arch_info) 73061da546Spatrick return arch_info->Create(thread); 74061da546Spatrick return NULL; 75061da546Spatrick } 76061da546Spatrick GetBreakpointOpcode(nub_size_t byte_size)77061da546Spatrickconst uint8_t *DNBArchProtocol::GetBreakpointOpcode(nub_size_t byte_size) { 78061da546Spatrick const DNBArchPluginInfo *arch_info = GetArchInfo(); 79061da546Spatrick if (arch_info) 80061da546Spatrick return arch_info->GetBreakpointOpcode(byte_size); 81061da546Spatrick return NULL; 82061da546Spatrick } 83