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