14b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen//===-- PlatformFreeBSD.cpp ---------------------------------------*- C++ -*-===// 24b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// 34b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// The LLVM Compiler Infrastructure 44b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// 54b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// This file is distributed under the University of Illinois Open Source 64b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// License. See LICENSE.TXT for details. 74b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// 84b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen//===----------------------------------------------------------------------===// 94b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 10d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea#include "lldb/lldb-python.h" 11d891f9b872103235cfd2ed452c6f14a4394d9b3aDaniel Malea 124b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include "PlatformFreeBSD.h" 134b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 144b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// C Includes 154b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include <stdio.h> 164b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include <sys/utsname.h> 174b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 184b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// C++ Includes 194b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// Other libraries and framework includes 204b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen// Project includes 214b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include "lldb/Core/Error.h" 2201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen#include "lldb/Core/Debugger.h" 2349ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/Module.h" 2449ce8969d3154e1560106cfe530444c09410f217Greg Clayton#include "lldb/Core/ModuleSpec.h" 254b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include "lldb/Core/PluginManager.h" 264b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen#include "lldb/Host/Host.h" 274b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 284b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenusing namespace lldb; 294b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenusing namespace lldb_private; 304b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 314b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny ChenPlatform * 32b1db658333cdebca31a128be95e926d80c3c7796Greg ClaytonPlatformFreeBSD::CreateInstance (bool force, const lldb_private::ArchSpec *arch) 334b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 3478dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen // The only time we create an instance is when we are creating a remote 3578dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen // freebsd platform 3678dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen const bool is_host = false; 3778dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen 38b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton bool create = force; 39b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create == false && arch && arch->IsValid()) 40b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton { 41b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton const llvm::Triple &triple = arch->GetTriple(); 42b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple.getVendor()) 43b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 44b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::PC: 45b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = true; 46b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 47b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 486c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__FreeBSD__) || defined(__OpenBSD__) 496c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // Only accept "unknown" for the vendor if the host is BSD and 506c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // it "unknown" wasn't specified (it was just returned becasue it 516c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // was NOT specified) 52b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::UnknownArch: 53b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = !arch->TripleVendorWasSpecified(); 54b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 556c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif 56b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 57b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 58b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 59b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 60b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton if (create) 61b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 62b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton switch (triple.getOS()) 63b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton { 64b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::FreeBSD: 65b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::KFreeBSD: 66b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 67b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton 686c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#if defined(__FreeBSD__) || defined(__OpenBSD__) 696c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // Only accept "unknown" for the OS if the host is BSD and 706c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // it "unknown" wasn't specified (it was just returned becasue it 716c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton // was NOT specified) 72b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton case llvm::Triple::UnknownOS: 73b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = arch->TripleOSWasSpecified(); 74b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 756c46fe68169c5d880bd34c736693f1be6e42cd1dGreg Clayton#endif 76b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton default: 77b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton create = false; 78b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton break; 79b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 80b170aee2daacc83e3d71c3e3acc9d56c89893a7bGreg Clayton } 81b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton } 82b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton if (create) 8378dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen return new PlatformFreeBSD (is_host); 84b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton return NULL; 85b1db658333cdebca31a128be95e926d80c3c7796Greg Clayton 864b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 874b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 880e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Claytonlldb_private::ConstString 890e191607adcb0ea8ebd06c278be648a7f5c0097fGreg ClaytonPlatformFreeBSD::GetPluginNameStatic (bool is_host) 904b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 916b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen if (is_host) 920e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton { 930e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_host_name(Platform::GetHostPlatformName ()); 940e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_host_name; 950e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton } 966b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen else 970e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton { 980e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton static ConstString g_remote_name("remote-freebsd"); 990e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton return g_remote_name; 1000e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton } 1016b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen} 1026b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen 1036b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chenconst char * 1046b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny ChenPlatformFreeBSD::GetDescriptionStatic (bool is_host) 1056b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen{ 1066b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen if (is_host) 1076b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen return "Local FreeBSD user platform plug-in."; 1086b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen else 1096b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen return "Remote FreeBSD user platform plug-in."; 1104b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 1114b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 11278dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chenstatic uint32_t g_initialize_count = 0; 11378dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen 1144b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenvoid 1154b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny ChenPlatformFreeBSD::Initialize () 1164b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 11778dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen if (g_initialize_count++ == 0) 1184b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 1196b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen#if defined (__FreeBSD__) 12078dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen // Force a host flag to true for the default platform object. 12178dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen PlatformSP default_platform_sp (new PlatformFreeBSD(true)); 1227e9964783acae183c23a7ea470cedd64472eb233Johnny Chen default_platform_sp->SetSystemArchitecture (Host::GetArchitecture()); 1234b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen Platform::SetDefaultPlatform (default_platform_sp); 1246b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen#endif 1250e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton PluginManager::RegisterPlugin(PlatformFreeBSD::GetPluginNameStatic(false), 1266b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen PlatformFreeBSD::GetDescriptionStatic(false), 1276b0f149de64d4a6383ff8c750f56e3801f33a99cJohnny Chen PlatformFreeBSD::CreateInstance); 1284b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 1294b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 1304b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 1314b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenvoid 1324b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny ChenPlatformFreeBSD::Terminate () 1334b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 13478dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen if (g_initialize_count > 0 && --g_initialize_count == 0) 13578dae82bea7365f3a3501618c5d724a1a11d944fJohnny Chen PluginManager::UnregisterPlugin (PlatformFreeBSD::CreateInstance); 1364b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 1374b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 13801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen//------------------------------------------------------------------ 13901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen/// Default Constructor 14001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen//------------------------------------------------------------------ 14101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::PlatformFreeBSD (bool is_host) : 14201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatform(is_host) 14301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 14401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 14501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 14601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen//------------------------------------------------------------------ 14701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen/// Destructor. 14801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen/// 14901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen/// The destructor is virtual since this class is designed to be 15001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen/// inherited from by the plug-in instance. 15101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen//------------------------------------------------------------------ 15201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::~PlatformFreeBSD() 15301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 15401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 15501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 1564b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 1574b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny ChenError 1584b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny ChenPlatformFreeBSD::ResolveExecutable (const FileSpec &exe_file, 15901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen const ArchSpec &exe_arch, 1602b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton lldb::ModuleSP &exe_module_sp, 1612b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton const FileSpecList *module_search_paths_ptr) 1624b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 1634b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen Error error; 1644b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen // Nothing special to do here, just use the actual file and architecture 1654b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 16601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen char exe_path[PATH_MAX]; 1674b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen FileSpec resolved_exe_file (exe_file); 1684b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 16901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 17001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 1711571ac370339050199691507058913a34ce2421aEd Maste // If we have "ls" as the exe_file, resolve the executable location based on 17201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // the current path variables 17301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (!resolved_exe_file.Exists()) 17401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 17501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen exe_file.GetPath(exe_path, sizeof(exe_path)); 17601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen resolved_exe_file.SetFile(exe_path, true); 17701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 17801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 17901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (!resolved_exe_file.Exists()) 18001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen resolved_exe_file.ResolveExecutableLocation (); 18101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 18201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (resolved_exe_file.Exists()) 18301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.Clear(); 18401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 18501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 18601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen exe_file.GetPath(exe_path, sizeof(exe_path)); 18701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.SetErrorStringWithFormat("unable to find executable for '%s'", exe_path); 18801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 18901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 19001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 19101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 19201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 19301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 19401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error = m_remote_platform_sp->ResolveExecutable (exe_file, 19501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen exe_arch, 1962b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton exe_module_sp, 1972b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton module_search_paths_ptr); 19801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 19901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 20001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 20101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // We may connect to a process and use the provided executable (Don't use local $PATH). 20201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 20301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Resolve any executable within a bundle on MacOSX 20401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen Host::ResolveExecutableInBundle (resolved_exe_file); 20501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 20601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (resolved_exe_file.Exists()) { 20701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.Clear(); 20801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 20901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 21001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 211a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton exe_file.GetPath(exe_path, sizeof(exe_path)); 212a605c64524e6bb1e43de4ca0ea95967a596f08ddGreg Clayton error.SetErrorStringWithFormat("the platform is not currently connected, and '%s' doesn't exist in the system root.", exe_path); 21301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 21401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 21501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 21601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 2174b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 21801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (error.Success()) 2194b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 2202b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton ModuleSpec module_spec (resolved_exe_file, exe_arch); 2212b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton if (module_spec.GetArchitecture().IsValid()) 2224b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 2232b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton error = ModuleList::GetSharedModule (module_spec, 22401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen exe_module_sp, 2252b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton module_search_paths_ptr, 2264b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen NULL, 2274b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen NULL); 22801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 2297ce162bb32d1bbe97e6ab4e482847046390d7108Greg Clayton if (!exe_module_sp || exe_module_sp->GetObjectFile() == NULL) 2304b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 2314b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen exe_module_sp.reset(); 23297a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain the architecture %s", 23397a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 2344b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen exe_arch.GetArchitectureName()); 2354b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 2364b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 2374b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen else 2384b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 2394b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen // No valid architecture was specified, ask the platform for 2404b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen // the architectures that we should be using (in the correct order) 2414b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen // and see if we can find a match that way 2424b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen StreamString arch_names; 2434b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen ArchSpec platform_arch; 2444b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen for (uint32_t idx = 0; GetSupportedArchitectureAtIndex (idx, platform_arch); ++idx) 2454b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 2462b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton error = ModuleList::GetSharedModule (module_spec, 24701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen exe_module_sp, 2482b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton module_search_paths_ptr, 2494b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen NULL, 2504b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen NULL); 25101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Did we find an executable using one of the 2524b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen if (error.Success()) 2534b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 2544b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen if (exe_module_sp && exe_module_sp->GetObjectFile()) 2554b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen break; 2564b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen else 2574b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen error.SetErrorToGenericError(); 2584b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 25901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 2604b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen if (idx > 0) 2614b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen arch_names.PutCString (", "); 2624b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen arch_names.PutCString (platform_arch.GetArchitectureName()); 2634b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 26401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 2654b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen if (error.Fail() || !exe_module_sp) 2664b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 26797a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' doesn't contain any '%s' platform architectures: %s", 26897a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str(), 2690e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton GetPluginName().GetCString(), 2704b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen arch_names.GetString().c_str()); 2714b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 2724b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 2734b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 2744b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen else 2754b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 27697a19b21dacd9063bb5475812df7781777262198Greg Clayton error.SetErrorStringWithFormat ("'%s' does not exist", 27797a19b21dacd9063bb5475812df7781777262198Greg Clayton exe_file.GetPath().c_str()); 2784b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 2794b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 2804b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen return error; 2814b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 2824b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 28301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chensize_t 28401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetSoftwareBreakpointTrapOpcode (Target &target, BreakpointSite *bp_site) 2854b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 28601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ArchSpec arch = target.GetArchitecture(); 28701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen const uint8_t *trap_opcode = NULL; 28801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen size_t trap_opcode_size = 0; 2894b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 29001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen switch (arch.GetCore()) 29101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 29201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen default: 29301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen assert(false && "Unhandled architecture in PlatformFreeBSD::GetSoftwareBreakpointTrapOpcode()"); 29401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen break; 2954b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 29601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen case ArchSpec::eCore_x86_32_i386: 29701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen case ArchSpec::eCore_x86_64_x86_64: 29801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 29901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen static const uint8_t g_i386_opcode[] = { 0xCC }; 30001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen trap_opcode = g_i386_opcode; 30101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen trap_opcode_size = sizeof(g_i386_opcode); 30201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 30301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen break; 30401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 30501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 30601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (bp_site->SetTrapOpcode(trap_opcode, trap_opcode_size)) 30701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return trap_opcode_size; 30801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 30901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return 0; 31001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 31101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 31201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenbool 31301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetRemoteOSVersion () 3144b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 31501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 31601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetOSVersion (m_major_os_version, 31701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen m_minor_os_version, 31801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen m_update_os_version); 31901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return false; 3204b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 3214b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 32201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenbool 32301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetRemoteOSBuildString (std::string &s) 3244b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 32501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 32601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetRemoteOSBuildString (s); 32701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen s.clear(); 32801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return false; 3294b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 3304b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 3314b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenbool 33201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetRemoteOSKernelDescription (std::string &s) 33301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 33401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 33501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetRemoteOSKernelDescription (s); 33601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen s.clear(); 33701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return false; 33801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 33901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 34001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen// Remote Platform subclasses need to override this function 34101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenArchSpec 34201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetRemoteSystemArchitecture () 34301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 34401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 34501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetRemoteSystemArchitecture (); 34601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return ArchSpec(); 34701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 34801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 34901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 35001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenconst char * 35101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetHostname () 3524b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 35301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 35401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return Platform::GetHostname(); 35501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 35601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 35701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetHostname (); 35801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return NULL; 3594b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 3604b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 3614b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenbool 36201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::IsConnected () const 3634b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 36401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 36501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return true; 36601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else if (m_remote_platform_sp) 36701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->IsConnected(); 3684b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen return false; 3694b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 3704b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 37101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenError 37201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::ConnectRemote (Args& args) 3734b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 37401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen Error error; 37501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 37601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 3770e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("can't connect to the host platform '%s', always connected", GetPluginName().GetCString()); 37801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 37901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 38001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 38101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (!m_remote_platform_sp) 38201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen m_remote_platform_sp = Platform::Create ("remote-gdb-server", error); 3834b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 38401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 38501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 38601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (error.Success()) 38701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 38801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 38901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 39001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error = m_remote_platform_sp->ConnectRemote (args); 39101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 39201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 39301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 39401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.SetErrorString ("\"platform connect\" takes a single argument: <connect-url>"); 39501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 39601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 39701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 39801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 39901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.SetErrorString ("failed to create a 'remote-gdb-server' platform"); 40001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 40101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (error.Fail()) 40201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen m_remote_platform_sp.reset(); 4034b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 4044b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 40501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return error; 4064b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 4074b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 40801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenError 40901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::DisconnectRemote () 4104b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 41101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen Error error; 4124b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 41301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 41401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 4150e191607adcb0ea8ebd06c278be648a7f5c0097fGreg Clayton error.SetErrorStringWithFormat ("can't disconnect from the host platform '%s', always connected", GetPluginName().GetCString()); 41601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 41701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 41801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 41901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 42001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error = m_remote_platform_sp->DisconnectRemote (); 42101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 42201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.SetErrorString ("the platform is not currently connected"); 42301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 42401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return error; 42501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 4264b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 42701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenbool 42801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetProcessInfo (lldb::pid_t pid, ProcessInstanceInfo &process_info) 42901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 4307e9964783acae183c23a7ea470cedd64472eb233Johnny Chen bool success = false; 43101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 4324b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen { 4337e9964783acae183c23a7ea470cedd64472eb233Johnny Chen success = Platform::GetProcessInfo (pid, process_info); 43401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 4357e9964783acae183c23a7ea470cedd64472eb233Johnny Chen else if (m_remote_platform_sp) 43601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 4377e9964783acae183c23a7ea470cedd64472eb233Johnny Chen success = m_remote_platform_sp->GetProcessInfo (pid, process_info); 43801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 4397e9964783acae183c23a7ea470cedd64472eb233Johnny Chen return success; 44001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 4414b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 44201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 44301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 44401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenuint32_t 44501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::FindProcesses (const ProcessInstanceInfoMatch &match_info, 44601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ProcessInstanceInfoList &process_infos) 44701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 44801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen uint32_t match_count = 0; 44901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 45001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 45101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Let the base class figure out the host details 45201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen match_count = Platform::FindProcesses (match_info, process_infos); 45301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 45401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 45501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 45601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // If we are remote, we can only return results if we are connected 45701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 45801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen match_count = m_remote_platform_sp->FindProcesses (match_info, process_infos); 4594b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen } 46001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return match_count; 46101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 4624b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 46301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenError 46401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::LaunchProcess (ProcessLaunchInfo &launch_info) 46501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 46601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen Error error; 46701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 46801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 46901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error = Platform::LaunchProcess (launch_info); 47001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 47101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 47201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 47301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 47401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error = m_remote_platform_sp->LaunchProcess (launch_info); 47501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 47601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.SetErrorString ("the platform is not currently connected"); 47701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 47801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return error; 4794b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 4804b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen 4814b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chenlldb::ProcessSP 4827e9964783acae183c23a7ea470cedd64472eb233Johnny ChenPlatformFreeBSD::Attach(ProcessAttachInfo &attach_info, 4837e9964783acae183c23a7ea470cedd64472eb233Johnny Chen Debugger &debugger, 4847e9964783acae183c23a7ea470cedd64472eb233Johnny Chen Target *target, 4857e9964783acae183c23a7ea470cedd64472eb233Johnny Chen Listener &listener, 4867e9964783acae183c23a7ea470cedd64472eb233Johnny Chen Error &error) 4874b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen{ 48801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen lldb::ProcessSP process_sp; 48901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsHost()) 49001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 49101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (target == NULL) 49201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 49301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen TargetSP new_target_sp; 49401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ArchSpec emptyArchSpec; 49501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 49601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error = debugger.GetTargetList().CreateTarget (debugger, 497ed0a0fbd021e44727469d6fa20cc337c58bd04c3Greg Clayton NULL, 49801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen emptyArchSpec, 49901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen false, 5007e9964783acae183c23a7ea470cedd64472eb233Johnny Chen m_remote_platform_sp, 50101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen new_target_sp); 50201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen target = new_target_sp.get(); 50301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 50401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 50501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.Clear(); 50601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 50701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (target && error.Success()) 50801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 50901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen debugger.GetTargetList().SetSelectedTarget(target); 51001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // The freebsd always currently uses the GDB remote debugger plug-in 51101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // so even when debugging locally we are debugging remotely! 51201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Just like the darwin plugin. 5132b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton process_sp = target->CreateProcess (listener, "gdb-remote", NULL); 51401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 51501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (process_sp) 5167e9964783acae183c23a7ea470cedd64472eb233Johnny Chen error = process_sp->Attach (attach_info); 51701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 51801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 51901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 52001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 52101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 5227e9964783acae183c23a7ea470cedd64472eb233Johnny Chen process_sp = m_remote_platform_sp->Attach (attach_info, debugger, target, listener, error); 52301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else 52401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen error.SetErrorString ("the platform is not currently connected"); 52501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 52601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return process_sp; 52701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 52801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 52901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenconst char * 53001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetUserName (uint32_t uid) 53101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 53201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Check the cache in Platform in case we have already looked this uid up 53301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen const char *user_name = Platform::GetUserName(uid); 53401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (user_name) 53501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return user_name; 53601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 53701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsRemote() && m_remote_platform_sp) 53801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetUserName(uid); 53901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return NULL; 54001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 54101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 54201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenconst char * 54301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetGroupName (uint32_t gid) 54401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 54501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen const char *group_name = Platform::GetGroupName(gid); 54601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (group_name) 54701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return group_name; 54801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 54901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsRemote() && m_remote_platform_sp) 55001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetGroupName(gid); 55101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return NULL; 55201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 55301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 55401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 55501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen// From PlatformMacOSX only 55601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenError 55701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetFile (const FileSpec &platform_file, 55801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen const UUID *uuid_ptr, 55901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen FileSpec &local_file) 56001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 56101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsRemote()) 56201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 56301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 56401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return m_remote_platform_sp->GetFile (platform_file, uuid_ptr, local_file); 56501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 56601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 56701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Default to the local case 56801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen local_file = platform_file; 56901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return Error(); 57001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 57101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 57201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenError 5732b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg ClaytonPlatformFreeBSD::GetSharedModule (const ModuleSpec &module_spec, 57401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ModuleSP &module_sp, 5752b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton const FileSpecList *module_search_paths_ptr, 57601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ModuleSP *old_module_sp_ptr, 57701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen bool *did_create_ptr) 57801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 57901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen Error error; 58001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen module_sp.reset(); 58101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 58201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (IsRemote()) 58301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 58401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // If we have a remote platform always, let it try and locate 58501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // the shared module first. 58601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (m_remote_platform_sp) 58701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 5882b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton error = m_remote_platform_sp->GetSharedModule (module_spec, 58901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen module_sp, 5902b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton module_search_paths_ptr, 59101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen old_module_sp_ptr, 59201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen did_create_ptr); 59301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 59401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 59501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 59601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (!module_sp) 59701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 59801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // Fall back to the local platform and find the file locally 5992b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton error = Platform::GetSharedModule (module_spec, 60001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen module_sp, 6012b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton module_search_paths_ptr, 60201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen old_module_sp_ptr, 60301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen did_create_ptr); 60401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 60501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (module_sp) 6062b737df3a92e30bb66aec108cb4d09ec1c1e86feGreg Clayton module_sp->SetPlatformFileSpec(module_spec.GetFileSpec()); 60701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return error; 60801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 60901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 61001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 61101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenbool 61201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetSupportedArchitectureAtIndex (uint32_t idx, ArchSpec &arch) 61301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 61401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // From macosx;s plugin code. For FreeBSD we may want to support more archs. 61501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (idx == 0) 61601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 61701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture); 61801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return arch.IsValid(); 61901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 62001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen else if (idx == 1) 62101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 62201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ArchSpec platform_arch (Host::GetArchitecture (Host::eSystemDefaultArchitecture)); 62301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen ArchSpec platform_arch64 (Host::GetArchitecture (Host::eSystemDefaultArchitecture64)); 62440e278caddf5442776f9408f20d757cc85fe630aSean Callanan if (platform_arch.IsExactMatch(platform_arch64)) 62501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen { 62601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // This freebsd platform supports both 32 and 64 bit. Since we already 62701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // returned the 64 bit arch for idx == 0, return the 32 bit arch 62801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen // for idx == 1 62901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen arch = Host::GetArchitecture (Host::eSystemDefaultArchitecture32); 63001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return arch.IsValid(); 63101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 63201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 63301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return false; 63401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen} 63501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 63601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chenvoid 63701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny ChenPlatformFreeBSD::GetStatus (Stream &strm) 63801b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen{ 63901b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen struct utsname un; 64001b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 64101b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen if (uname(&un)) { 64201b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen strm << "FreeBSD"; 64301b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen return; 64401b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen } 64501b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen 64601b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen strm << "Host: " << un.sysname << ' ' << un.release << ' ' << un.version << '\n'; 64701b79d26bdaa340aea156bb7fbf3ad8e13321819Johnny Chen Platform::GetStatus(strm); 6484b66329ac82b5f3d939bd31b4d1498da9257d85aJohnny Chen} 649