1 //===-- ProcessFreeBSD.cpp ----------------------------------------*- C++ -*-===// 2 // 3 // The LLVM Compiler Infrastructure 4 // 5 // This file is distributed under the University of Illinois Open Source 6 // License. See LICENSE.TXT for details. 7 // 8 //===----------------------------------------------------------------------===// 9 10 // C Includes 11 #include <errno.h> 12 13 // C++ Includes 14 // Other libraries and framework includes 15 #include "lldb/Core/PluginManager.h" 16 #include "lldb/Core/State.h" 17 #include "lldb/Host/Host.h" 18 #include "lldb/Symbol/ObjectFile.h" 19 #include "lldb/Target/DynamicLoader.h" 20 #include "lldb/Target/Target.h" 21 22 #include "ProcessFreeBSD.h" 23 #include "ProcessPOSIXLog.h" 24 #include "Plugins/Process/Utility/InferiorCallPOSIX.h" 25 #include "ProcessMonitor.h" 26 #include "POSIXThread.h" 27 28 using namespace lldb; 29 using namespace lldb_private; 30 31 //------------------------------------------------------------------------------ 32 // Static functions. 33 34 lldb::ProcessSP 35 ProcessFreeBSD::CreateInstance(Target& target, 36 Listener &listener, 37 const FileSpec *crash_file_path) 38 { 39 lldb::ProcessSP process_sp; 40 if (crash_file_path == NULL) 41 process_sp.reset(new ProcessFreeBSD (target, listener)); 42 return process_sp; 43 } 44 45 void 46 ProcessFreeBSD::Initialize() 47 { 48 static bool g_initialized = false; 49 50 if (!g_initialized) 51 { 52 PluginManager::RegisterPlugin(GetPluginNameStatic(), 53 GetPluginDescriptionStatic(), 54 CreateInstance); 55 Log::Callbacks log_callbacks = { 56 ProcessPOSIXLog::DisableLog, 57 ProcessPOSIXLog::EnableLog, 58 ProcessPOSIXLog::ListLogCategories 59 }; 60 61 Log::RegisterLogChannel (ProcessFreeBSD::GetPluginNameStatic(), log_callbacks); 62 ProcessPOSIXLog::RegisterPluginName(GetPluginNameStatic()); 63 g_initialized = true; 64 } 65 } 66 67 lldb_private::ConstString 68 ProcessFreeBSD::GetPluginNameStatic() 69 { 70 static ConstString g_name("freebsd"); 71 return g_name; 72 } 73 74 const char * 75 ProcessFreeBSD::GetPluginDescriptionStatic() 76 { 77 return "Process plugin for FreeBSD"; 78 } 79 80 //------------------------------------------------------------------------------ 81 // ProcessInterface protocol. 82 83 lldb_private::ConstString 84 ProcessFreeBSD::GetPluginName() 85 { 86 return GetPluginNameStatic(); 87 } 88 89 uint32_t 90 ProcessFreeBSD::GetPluginVersion() 91 { 92 return 1; 93 } 94 95 void 96 ProcessFreeBSD::GetPluginCommandHelp(const char *command, Stream *strm) 97 { 98 } 99 100 Error 101 ProcessFreeBSD::ExecutePluginCommand(Args &command, Stream *strm) 102 { 103 return Error(1, eErrorTypeGeneric); 104 } 105 106 Log * 107 ProcessFreeBSD::EnablePluginLogging(Stream *strm, Args &command) 108 { 109 return NULL; 110 } 111 112 //------------------------------------------------------------------------------ 113 // Constructors and destructors. 114 115 ProcessFreeBSD::ProcessFreeBSD(Target& target, Listener &listener) 116 : ProcessPOSIX(target, listener) 117 { 118 } 119 120 void 121 ProcessFreeBSD::Terminate() 122 { 123 } 124 125 Error 126 ProcessFreeBSD::DoDetach(bool keep_stopped) 127 { 128 Error error; 129 if (keep_stopped) 130 { 131 error.SetErrorString("Detaching with keep_stopped true is not currently supported on FreeBSD."); 132 return error; 133 } 134 135 error = m_monitor->Detach(GetID()); 136 137 if (error.Success()) 138 SetPrivateState(eStateDetached); 139 140 return error; 141 } 142 143 bool 144 ProcessFreeBSD::UpdateThreadList(ThreadList &old_thread_list, ThreadList &new_thread_list) 145 { 146 Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_THREAD)); 147 if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) 148 log->Printf ("ProcessFreeBSD::%s() (pid = %" PRIu64 ")", __FUNCTION__, GetID()); 149 150 bool has_updated = false; 151 const lldb::pid_t pid = GetID(); 152 // Update the process thread list with this new thread. 153 // FIXME: We should be using tid, not pid. 154 assert(m_monitor); 155 ThreadSP thread_sp (old_thread_list.FindThreadByID (pid, false)); 156 if (!thread_sp) { 157 ProcessSP me = this->shared_from_this(); 158 thread_sp.reset(new POSIXThread(*me, pid)); 159 has_updated = true; 160 } 161 162 if (log && log->GetMask().Test(POSIX_LOG_VERBOSE)) 163 log->Printf ("ProcessFreeBSD::%s() updated tid = %" PRIu64, __FUNCTION__, pid); 164 165 new_thread_list.AddThread(thread_sp); 166 167 return has_updated; // the list has been updated 168 } 169