xref: /llvm-project/lldb/source/Plugins/Process/Linux/NativeProcessLinux.cpp (revision e77fce0a5038d3b2865f8442adc5b4fabf2b30fb)
1 //===-- NativeProcessLinux.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 #include "NativeProcessLinux.h"
11 
12 // C Includes
13 #include <errno.h>
14 #include <string.h>
15 #include <stdint.h>
16 #include <unistd.h>
17 
18 // C++ Includes
19 #include <fstream>
20 #include <mutex>
21 #include <sstream>
22 #include <string>
23 #include <unordered_map>
24 
25 // Other libraries and framework includes
26 #include "lldb/Core/EmulateInstruction.h"
27 #include "lldb/Core/Error.h"
28 #include "lldb/Core/ModuleSpec.h"
29 #include "lldb/Core/RegisterValue.h"
30 #include "lldb/Core/State.h"
31 #include "lldb/Host/Host.h"
32 #include "lldb/Host/HostProcess.h"
33 #include "lldb/Host/ThreadLauncher.h"
34 #include "lldb/Host/common/NativeBreakpoint.h"
35 #include "lldb/Host/common/NativeRegisterContext.h"
36 #include "lldb/Host/linux/ProcessLauncherLinux.h"
37 #include "lldb/Symbol/ObjectFile.h"
38 #include "lldb/Target/Process.h"
39 #include "lldb/Target/ProcessLaunchInfo.h"
40 #include "lldb/Target/Target.h"
41 #include "lldb/Utility/LLDBAssert.h"
42 #include "lldb/Utility/PseudoTerminal.h"
43 #include "lldb/Utility/StringExtractor.h"
44 
45 #include "Plugins/Process/POSIX/ProcessPOSIXLog.h"
46 #include "NativeThreadLinux.h"
47 #include "ProcFileReader.h"
48 #include "Procfs.h"
49 
50 // System includes - They have to be included after framework includes because they define some
51 // macros which collide with variable names in other modules
52 #include <linux/unistd.h>
53 #include <sys/socket.h>
54 
55 #include <sys/syscall.h>
56 #include <sys/types.h>
57 #include <sys/user.h>
58 #include <sys/wait.h>
59 
60 #include "lldb/Host/linux/Personality.h"
61 #include "lldb/Host/linux/Ptrace.h"
62 #include "lldb/Host/linux/Uio.h"
63 
64 // Support hardware breakpoints in case it has not been defined
65 #ifndef TRAP_HWBKPT
66   #define TRAP_HWBKPT 4
67 #endif
68 
69 using namespace lldb;
70 using namespace lldb_private;
71 using namespace lldb_private::process_linux;
72 using namespace llvm;
73 
74 // Private bits we only need internally.
75 
76 static bool ProcessVmReadvSupported()
77 {
78     static bool is_supported;
79     static std::once_flag flag;
80 
81     std::call_once(flag, [] {
82         Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
83 
84         uint32_t source = 0x47424742;
85         uint32_t dest = 0;
86 
87         struct iovec local, remote;
88         remote.iov_base = &source;
89         local.iov_base = &dest;
90         remote.iov_len = local.iov_len = sizeof source;
91 
92         // We shall try if cross-process-memory reads work by attempting to read a value from our own process.
93         ssize_t res = process_vm_readv(getpid(), &local, 1, &remote, 1, 0);
94         is_supported = (res == sizeof(source) && source == dest);
95         if (log)
96         {
97             if (is_supported)
98                 log->Printf("%s: Detected kernel support for process_vm_readv syscall. Fast memory reads enabled.",
99                         __FUNCTION__);
100             else
101                 log->Printf("%s: syscall process_vm_readv failed (error: %s). Fast memory reads disabled.",
102                         __FUNCTION__, strerror(errno));
103         }
104     });
105 
106     return is_supported;
107 }
108 
109 namespace
110 {
111 void
112 MaybeLogLaunchInfo(const ProcessLaunchInfo &info)
113 {
114     Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
115     if (!log)
116         return;
117 
118     if (const FileAction *action = info.GetFileActionForFD(STDIN_FILENO))
119         log->Printf("%s: setting STDIN to '%s'", __FUNCTION__, action->GetFileSpec().GetCString());
120     else
121         log->Printf("%s leaving STDIN as is", __FUNCTION__);
122 
123     if (const FileAction *action = info.GetFileActionForFD(STDOUT_FILENO))
124         log->Printf("%s setting STDOUT to '%s'", __FUNCTION__, action->GetFileSpec().GetCString());
125     else
126         log->Printf("%s leaving STDOUT as is", __FUNCTION__);
127 
128     if (const FileAction *action = info.GetFileActionForFD(STDERR_FILENO))
129         log->Printf("%s setting STDERR to '%s'", __FUNCTION__, action->GetFileSpec().GetCString());
130     else
131         log->Printf("%s leaving STDERR as is", __FUNCTION__);
132 
133     int i = 0;
134     for (const char **args = info.GetArguments().GetConstArgumentVector(); *args; ++args, ++i)
135         log->Printf("%s arg %d: \"%s\"", __FUNCTION__, i, *args ? *args : "nullptr");
136 }
137 
138 void
139 DisplayBytes(StreamString &s, void *bytes, uint32_t count)
140 {
141     uint8_t *ptr = (uint8_t *)bytes;
142     const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count);
143     for (uint32_t i = 0; i < loop_count; i++)
144     {
145         s.Printf("[%x]", *ptr);
146         ptr++;
147     }
148 }
149 
150     void
151     PtraceDisplayBytes(int &req, void *data, size_t data_size)
152     {
153         StreamString buf;
154         Log *verbose_log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (
155                     POSIX_LOG_PTRACE | POSIX_LOG_VERBOSE));
156 
157         if (verbose_log)
158         {
159             switch(req)
160             {
161             case PTRACE_POKETEXT:
162             {
163                 DisplayBytes(buf, &data, 8);
164                 verbose_log->Printf("PTRACE_POKETEXT %s", buf.GetData());
165                 break;
166             }
167             case PTRACE_POKEDATA:
168             {
169                 DisplayBytes(buf, &data, 8);
170                 verbose_log->Printf("PTRACE_POKEDATA %s", buf.GetData());
171                 break;
172             }
173             case PTRACE_POKEUSER:
174             {
175                 DisplayBytes(buf, &data, 8);
176                 verbose_log->Printf("PTRACE_POKEUSER %s", buf.GetData());
177                 break;
178             }
179             case PTRACE_SETREGS:
180             {
181                 DisplayBytes(buf, data, data_size);
182                 verbose_log->Printf("PTRACE_SETREGS %s", buf.GetData());
183                 break;
184             }
185             case PTRACE_SETFPREGS:
186             {
187                 DisplayBytes(buf, data, data_size);
188                 verbose_log->Printf("PTRACE_SETFPREGS %s", buf.GetData());
189                 break;
190             }
191             case PTRACE_SETSIGINFO:
192             {
193                 DisplayBytes(buf, data, sizeof(siginfo_t));
194                 verbose_log->Printf("PTRACE_SETSIGINFO %s", buf.GetData());
195                 break;
196             }
197             case PTRACE_SETREGSET:
198             {
199                 // Extract iov_base from data, which is a pointer to the struct IOVEC
200                 DisplayBytes(buf, *(void **)data, data_size);
201                 verbose_log->Printf("PTRACE_SETREGSET %s", buf.GetData());
202                 break;
203             }
204             default:
205             {
206             }
207             }
208         }
209     }
210 
211     static constexpr unsigned k_ptrace_word_size = sizeof(void*);
212     static_assert(sizeof(long) >= k_ptrace_word_size, "Size of long must be larger than ptrace word size");
213 } // end of anonymous namespace
214 
215 // Simple helper function to ensure flags are enabled on the given file
216 // descriptor.
217 static Error
218 EnsureFDFlags(int fd, int flags)
219 {
220     Error error;
221 
222     int status = fcntl(fd, F_GETFL);
223     if (status == -1)
224     {
225         error.SetErrorToErrno();
226         return error;
227     }
228 
229     if (fcntl(fd, F_SETFL, status | flags) == -1)
230     {
231         error.SetErrorToErrno();
232         return error;
233     }
234 
235     return error;
236 }
237 
238 // -----------------------------------------------------------------------------
239 // Public Static Methods
240 // -----------------------------------------------------------------------------
241 
242 Error
243 NativeProcessProtocol::Launch (
244     ProcessLaunchInfo &launch_info,
245     NativeProcessProtocol::NativeDelegate &native_delegate,
246     MainLoop &mainloop,
247     NativeProcessProtocolSP &native_process_sp)
248 {
249     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
250 
251     Error error;
252 
253     // Verify the working directory is valid if one was specified.
254     FileSpec working_dir{launch_info.GetWorkingDirectory()};
255     if (working_dir &&
256             (!working_dir.ResolvePath() ||
257              working_dir.GetFileType() != FileSpec::eFileTypeDirectory))
258     {
259         error.SetErrorStringWithFormat ("No such file or directory: %s",
260                 working_dir.GetCString());
261         return error;
262     }
263 
264     // Create the NativeProcessLinux in launch mode.
265     native_process_sp.reset (new NativeProcessLinux ());
266 
267     if (!native_process_sp->RegisterNativeDelegate (native_delegate))
268     {
269         native_process_sp.reset ();
270         error.SetErrorStringWithFormat ("failed to register the native delegate");
271         return error;
272     }
273 
274     error = std::static_pointer_cast<NativeProcessLinux>(native_process_sp)->LaunchInferior(mainloop, launch_info);
275 
276     if (error.Fail ())
277     {
278         native_process_sp.reset ();
279         if (log)
280             log->Printf ("NativeProcessLinux::%s failed to launch process: %s", __FUNCTION__, error.AsCString ());
281         return error;
282     }
283 
284     launch_info.SetProcessID (native_process_sp->GetID ());
285 
286     return error;
287 }
288 
289 Error
290 NativeProcessProtocol::Attach (
291     lldb::pid_t pid,
292     NativeProcessProtocol::NativeDelegate &native_delegate,
293     MainLoop &mainloop,
294     NativeProcessProtocolSP &native_process_sp)
295 {
296     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
297     if (log && log->GetMask ().Test (POSIX_LOG_VERBOSE))
298         log->Printf ("NativeProcessLinux::%s(pid = %" PRIi64 ")", __FUNCTION__, pid);
299 
300     // Retrieve the architecture for the running process.
301     ArchSpec process_arch;
302     Error error = ResolveProcessArchitecture(pid, process_arch);
303     if (!error.Success ())
304         return error;
305 
306     std::shared_ptr<NativeProcessLinux> native_process_linux_sp (new NativeProcessLinux ());
307 
308     if (!native_process_linux_sp->RegisterNativeDelegate (native_delegate))
309     {
310         error.SetErrorStringWithFormat ("failed to register the native delegate");
311         return error;
312     }
313 
314     native_process_linux_sp->AttachToInferior (mainloop, pid, error);
315     if (!error.Success ())
316         return error;
317 
318     native_process_sp = native_process_linux_sp;
319     return error;
320 }
321 
322 // -----------------------------------------------------------------------------
323 // Public Instance Methods
324 // -----------------------------------------------------------------------------
325 
326 NativeProcessLinux::NativeProcessLinux () :
327     NativeProcessProtocol (LLDB_INVALID_PROCESS_ID),
328     m_arch (),
329     m_supports_mem_region (eLazyBoolCalculate),
330     m_mem_region_cache (),
331     m_pending_notification_tid(LLDB_INVALID_THREAD_ID)
332 {
333 }
334 
335 void
336 NativeProcessLinux::AttachToInferior (MainLoop &mainloop, lldb::pid_t pid, Error &error)
337 {
338     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
339     if (log)
340         log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ")", __FUNCTION__, pid);
341 
342     m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD,
343             [this] (MainLoopBase &) { SigchldHandler(); }, error);
344     if (! m_sigchld_handle)
345         return;
346 
347     error = ResolveProcessArchitecture(pid, m_arch);
348     if (!error.Success())
349         return;
350 
351     // Set the architecture to the exe architecture.
352     if (log)
353         log->Printf ("NativeProcessLinux::%s (pid = %" PRIi64 ") detected architecture %s", __FUNCTION__, pid, m_arch.GetArchitectureName ());
354 
355     m_pid = pid;
356     SetState(eStateAttaching);
357 
358     Attach(pid, error);
359 }
360 
361 Error
362 NativeProcessLinux::LaunchInferior(MainLoop &mainloop, ProcessLaunchInfo &launch_info)
363 {
364     Error error;
365     m_sigchld_handle = mainloop.RegisterSignal(SIGCHLD, [this](MainLoopBase &) { SigchldHandler(); }, error);
366     if (!m_sigchld_handle)
367         return error;
368 
369     SetState(eStateLaunching);
370 
371     MaybeLogLaunchInfo(launch_info);
372 
373     ::pid_t pid = ProcessLauncherLinux().LaunchProcess(launch_info, error).GetProcessId();
374     if (error.Fail())
375         return error;
376 
377     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
378 
379     // Wait for the child process to trap on its call to execve.
380     ::pid_t wpid;
381     int status;
382     if ((wpid = waitpid(pid, &status, 0)) < 0)
383     {
384         error.SetErrorToErrno();
385         if (log)
386             log->Printf ("NativeProcessLinux::%s waitpid for inferior failed with %s",
387                     __FUNCTION__, error.AsCString ());
388 
389         // Mark the inferior as invalid.
390         // FIXME this could really use a new state - eStateLaunchFailure.  For now, using eStateInvalid.
391         SetState (StateType::eStateInvalid);
392 
393         return error;
394     }
395     assert(WIFSTOPPED(status) && (wpid == static_cast< ::pid_t> (pid)) &&
396            "Could not sync with inferior process.");
397 
398     if (log)
399         log->Printf ("NativeProcessLinux::%s inferior started, now in stopped state", __FUNCTION__);
400 
401     error = SetDefaultPtraceOpts(pid);
402     if (error.Fail())
403     {
404         if (log)
405             log->Printf ("NativeProcessLinux::%s inferior failed to set default ptrace options: %s",
406                     __FUNCTION__, error.AsCString ());
407 
408         // Mark the inferior as invalid.
409         // FIXME this could really use a new state - eStateLaunchFailure.  For now, using eStateInvalid.
410         SetState (StateType::eStateInvalid);
411 
412         return error;
413     }
414 
415     // Release the master terminal descriptor and pass it off to the
416     // NativeProcessLinux instance.  Similarly stash the inferior pid.
417     m_terminal_fd = launch_info.GetPTY().ReleaseMasterFileDescriptor();
418     m_pid = pid;
419     launch_info.SetProcessID(pid);
420 
421     if (m_terminal_fd != -1)
422     {
423         error = EnsureFDFlags(m_terminal_fd, O_NONBLOCK);
424         if (error.Fail())
425         {
426             if (log)
427                 log->Printf(
428                     "NativeProcessLinux::%s inferior EnsureFDFlags failed for ensuring terminal O_NONBLOCK setting: %s",
429                     __FUNCTION__, error.AsCString());
430 
431             // Mark the inferior as invalid.
432             // FIXME this could really use a new state - eStateLaunchFailure.  For now, using eStateInvalid.
433             SetState(StateType::eStateInvalid);
434 
435             return error;
436         }
437     }
438 
439     if (log)
440         log->Printf("NativeProcessLinux::%s() adding pid = %" PRIu64, __FUNCTION__, uint64_t(pid));
441 
442     ResolveProcessArchitecture(m_pid, m_arch);
443     NativeThreadLinuxSP thread_sp = AddThread(pid);
444     assert (thread_sp && "AddThread() returned a nullptr thread");
445     thread_sp->SetStoppedBySignal(SIGSTOP);
446     ThreadWasCreated(*thread_sp);
447 
448     // Let our process instance know the thread has stopped.
449     SetCurrentThreadID (thread_sp->GetID ());
450     SetState (StateType::eStateStopped);
451 
452     if (log)
453     {
454         if (error.Success ())
455             log->Printf("NativeProcessLinux::%s inferior launching succeeded", __FUNCTION__);
456         else
457             log->Printf("NativeProcessLinux::%s inferior launching failed: %s", __FUNCTION__, error.AsCString());
458     }
459     return error;
460 }
461 
462 ::pid_t
463 NativeProcessLinux::Attach(lldb::pid_t pid, Error &error)
464 {
465     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
466 
467     // Use a map to keep track of the threads which we have attached/need to attach.
468     Host::TidMap tids_to_attach;
469     if (pid <= 1)
470     {
471         error.SetErrorToGenericError();
472         error.SetErrorString("Attaching to process 1 is not allowed.");
473         return -1;
474     }
475 
476     while (Host::FindProcessThreads(pid, tids_to_attach))
477     {
478         for (Host::TidMap::iterator it = tids_to_attach.begin();
479              it != tids_to_attach.end();)
480         {
481             if (it->second == false)
482             {
483                 lldb::tid_t tid = it->first;
484 
485                 // Attach to the requested process.
486                 // An attach will cause the thread to stop with a SIGSTOP.
487                 error = PtraceWrapper(PTRACE_ATTACH, tid);
488                 if (error.Fail())
489                 {
490                     // No such thread. The thread may have exited.
491                     // More error handling may be needed.
492                     if (error.GetError() == ESRCH)
493                     {
494                         it = tids_to_attach.erase(it);
495                         continue;
496                     }
497                     else
498                         return -1;
499                 }
500 
501                 int status;
502                 // Need to use __WALL otherwise we receive an error with errno=ECHLD
503                 // At this point we should have a thread stopped if waitpid succeeds.
504                 if ((status = waitpid(tid, NULL, __WALL)) < 0)
505                 {
506                     // No such thread. The thread may have exited.
507                     // More error handling may be needed.
508                     if (errno == ESRCH)
509                     {
510                         it = tids_to_attach.erase(it);
511                         continue;
512                     }
513                     else
514                     {
515                         error.SetErrorToErrno();
516                         return -1;
517                     }
518                 }
519 
520                 error = SetDefaultPtraceOpts(tid);
521                 if (error.Fail())
522                     return -1;
523 
524                 if (log)
525                     log->Printf ("NativeProcessLinux::%s() adding tid = %" PRIu64, __FUNCTION__, tid);
526 
527                 it->second = true;
528 
529                 // Create the thread, mark it as stopped.
530                 NativeThreadLinuxSP thread_sp (AddThread(static_cast<lldb::tid_t>(tid)));
531                 assert (thread_sp && "AddThread() returned a nullptr");
532 
533                 // This will notify this is a new thread and tell the system it is stopped.
534                 thread_sp->SetStoppedBySignal(SIGSTOP);
535                 ThreadWasCreated(*thread_sp);
536                 SetCurrentThreadID (thread_sp->GetID ());
537             }
538 
539             // move the loop forward
540             ++it;
541         }
542     }
543 
544     if (tids_to_attach.size() > 0)
545     {
546         m_pid = pid;
547         // Let our process instance know the thread has stopped.
548         SetState (StateType::eStateStopped);
549     }
550     else
551     {
552         error.SetErrorToGenericError();
553         error.SetErrorString("No such process.");
554         return -1;
555     }
556 
557     return pid;
558 }
559 
560 Error
561 NativeProcessLinux::SetDefaultPtraceOpts(lldb::pid_t pid)
562 {
563     long ptrace_opts = 0;
564 
565     // Have the child raise an event on exit.  This is used to keep the child in
566     // limbo until it is destroyed.
567     ptrace_opts |= PTRACE_O_TRACEEXIT;
568 
569     // Have the tracer trace threads which spawn in the inferior process.
570     // TODO: if we want to support tracing the inferiors' child, add the
571     // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK)
572     ptrace_opts |= PTRACE_O_TRACECLONE;
573 
574     // Have the tracer notify us before execve returns
575     // (needed to disable legacy SIGTRAP generation)
576     ptrace_opts |= PTRACE_O_TRACEEXEC;
577 
578     return PtraceWrapper(PTRACE_SETOPTIONS, pid, nullptr, (void*)ptrace_opts);
579 }
580 
581 static ExitType convert_pid_status_to_exit_type (int status)
582 {
583     if (WIFEXITED (status))
584         return ExitType::eExitTypeExit;
585     else if (WIFSIGNALED (status))
586         return ExitType::eExitTypeSignal;
587     else if (WIFSTOPPED (status))
588         return ExitType::eExitTypeStop;
589     else
590     {
591         // We don't know what this is.
592         return ExitType::eExitTypeInvalid;
593     }
594 }
595 
596 static int convert_pid_status_to_return_code (int status)
597 {
598     if (WIFEXITED (status))
599         return WEXITSTATUS (status);
600     else if (WIFSIGNALED (status))
601         return WTERMSIG (status);
602     else if (WIFSTOPPED (status))
603         return WSTOPSIG (status);
604     else
605     {
606         // We don't know what this is.
607         return ExitType::eExitTypeInvalid;
608     }
609 }
610 
611 // Handles all waitpid events from the inferior process.
612 void
613 NativeProcessLinux::MonitorCallback(lldb::pid_t pid,
614                                     bool exited,
615                                     int signal,
616                                     int status)
617 {
618     Log *log (GetLogIfAnyCategoriesSet (LIBLLDB_LOG_PROCESS));
619 
620     // Certain activities differ based on whether the pid is the tid of the main thread.
621     const bool is_main_thread = (pid == GetID ());
622 
623     // Handle when the thread exits.
624     if (exited)
625     {
626         if (log)
627             log->Printf ("NativeProcessLinux::%s() got exit signal(%d) , tid = %"  PRIu64 " (%s main thread)", __FUNCTION__, signal, pid, is_main_thread ? "is" : "is not");
628 
629         // This is a thread that exited.  Ensure we're not tracking it anymore.
630         const bool thread_found = StopTrackingThread (pid);
631 
632         if (is_main_thread)
633         {
634             // We only set the exit status and notify the delegate if we haven't already set the process
635             // state to an exited state.  We normally should have received a SIGTRAP | (PTRACE_EVENT_EXIT << 8)
636             // for the main thread.
637             const bool already_notified = (GetState() == StateType::eStateExited) || (GetState () == StateType::eStateCrashed);
638             if (!already_notified)
639             {
640                 if (log)
641                     log->Printf ("NativeProcessLinux::%s() tid = %"  PRIu64 " handling main thread exit (%s), expected exit state already set but state was %s instead, setting exit state now", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found", StateAsCString (GetState ()));
642                 // The main thread exited.  We're done monitoring.  Report to delegate.
643                 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true);
644 
645                 // Notify delegate that our process has exited.
646                 SetState (StateType::eStateExited, true);
647             }
648             else
649             {
650                 if (log)
651                     log->Printf ("NativeProcessLinux::%s() tid = %"  PRIu64 " main thread now exited (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found");
652             }
653         }
654         else
655         {
656             // Do we want to report to the delegate in this case?  I think not.  If this was an orderly
657             // thread exit, we would already have received the SIGTRAP | (PTRACE_EVENT_EXIT << 8) signal,
658             // and we would have done an all-stop then.
659             if (log)
660                 log->Printf ("NativeProcessLinux::%s() tid = %"  PRIu64 " handling non-main thread exit (%s)", __FUNCTION__, pid, thread_found ? "stopped tracking thread metadata" : "thread metadata not found");
661         }
662         return;
663     }
664 
665     siginfo_t info;
666     const auto info_err = GetSignalInfo(pid, &info);
667     auto thread_sp = GetThreadByID(pid);
668 
669     if (! thread_sp)
670     {
671         // Normally, the only situation when we cannot find the thread is if we have just
672         // received a new thread notification. This is indicated by GetSignalInfo() returning
673         // si_code == SI_USER and si_pid == 0
674         if (log)
675             log->Printf("NativeProcessLinux::%s received notification about an unknown tid %" PRIu64 ".", __FUNCTION__, pid);
676 
677         if (info_err.Fail())
678         {
679             if (log)
680                 log->Printf("NativeProcessLinux::%s (tid %" PRIu64 ") GetSignalInfo failed (%s). Ingoring this notification.", __FUNCTION__, pid, info_err.AsCString());
681             return;
682         }
683 
684         if (log && (info.si_code != SI_USER || info.si_pid != 0))
685             log->Printf("NativeProcessLinux::%s (tid %" PRIu64 ") unexpected signal info (si_code: %d, si_pid: %d). Treating as a new thread notification anyway.", __FUNCTION__, pid, info.si_code, info.si_pid);
686 
687         auto thread_sp = AddThread(pid);
688         // Resume the newly created thread.
689         ResumeThread(*thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
690         ThreadWasCreated(*thread_sp);
691         return;
692     }
693 
694     // Get details on the signal raised.
695     if (info_err.Success())
696     {
697         // We have retrieved the signal info.  Dispatch appropriately.
698         if (info.si_signo == SIGTRAP)
699             MonitorSIGTRAP(info, *thread_sp);
700         else
701             MonitorSignal(info, *thread_sp, exited);
702     }
703     else
704     {
705         if (info_err.GetError() == EINVAL)
706         {
707             // This is a group stop reception for this tid.
708             // We can reach here if we reinject SIGSTOP, SIGSTP, SIGTTIN or SIGTTOU into the
709             // tracee, triggering the group-stop mechanism. Normally receiving these would stop
710             // the process, pending a SIGCONT. Simulating this state in a debugger is hard and is
711             // generally not needed (one use case is debugging background task being managed by a
712             // shell). For general use, it is sufficient to stop the process in a signal-delivery
713             // stop which happens before the group stop. This done by MonitorSignal and works
714             // correctly for all signals.
715             if (log)
716                 log->Printf("NativeProcessLinux::%s received a group stop for pid %" PRIu64 " tid %" PRIu64 ". Transparent handling of group stops not supported, resuming the thread.", __FUNCTION__, GetID (), pid);
717             ResumeThread(*thread_sp, thread_sp->GetState(), LLDB_INVALID_SIGNAL_NUMBER);
718         }
719         else
720         {
721             // ptrace(GETSIGINFO) failed (but not due to group-stop).
722 
723             // A return value of ESRCH means the thread/process is no longer on the system,
724             // so it was killed somehow outside of our control.  Either way, we can't do anything
725             // with it anymore.
726 
727             // Stop tracking the metadata for the thread since it's entirely off the system now.
728             const bool thread_found = StopTrackingThread (pid);
729 
730             if (log)
731                 log->Printf ("NativeProcessLinux::%s GetSignalInfo failed: %s, tid = %" PRIu64 ", signal = %d, status = %d (%s, %s, %s)",
732                              __FUNCTION__, info_err.AsCString(), pid, signal, status, info_err.GetError() == ESRCH ? "thread/process killed" : "unknown reason", is_main_thread ? "is main thread" : "is not main thread", thread_found ? "thread metadata removed" : "thread metadata not found");
733 
734             if (is_main_thread)
735             {
736                 // Notify the delegate - our process is not available but appears to have been killed outside
737                 // our control.  Is eStateExited the right exit state in this case?
738                 SetExitStatus (convert_pid_status_to_exit_type (status), convert_pid_status_to_return_code (status), nullptr, true);
739                 SetState (StateType::eStateExited, true);
740             }
741             else
742             {
743                 // This thread was pulled out from underneath us.  Anything to do here? Do we want to do an all stop?
744                 if (log)
745                     log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 " non-main thread exit occurred, didn't tell delegate anything since thread disappeared out from underneath us", __FUNCTION__, GetID (), pid);
746             }
747         }
748     }
749 }
750 
751 void
752 NativeProcessLinux::WaitForNewThread(::pid_t tid)
753 {
754     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
755 
756     NativeThreadLinuxSP new_thread_sp = GetThreadByID(tid);
757 
758     if (new_thread_sp)
759     {
760         // We are already tracking the thread - we got the event on the new thread (see
761         // MonitorSignal) before this one. We are done.
762         return;
763     }
764 
765     // The thread is not tracked yet, let's wait for it to appear.
766     int status = -1;
767     ::pid_t wait_pid;
768     do
769     {
770         if (log)
771             log->Printf ("NativeProcessLinux::%s() received thread creation event for tid %" PRIu32 ". tid not tracked yet, waiting for thread to appear...", __FUNCTION__, tid);
772         wait_pid = waitpid(tid, &status, __WALL);
773     }
774     while (wait_pid == -1 && errno == EINTR);
775     // Since we are waiting on a specific tid, this must be the creation event. But let's do
776     // some checks just in case.
777     if (wait_pid != tid) {
778         if (log)
779             log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime", __FUNCTION__, tid);
780         // The only way I know of this could happen is if the whole process was
781         // SIGKILLed in the mean time. In any case, we can't do anything about that now.
782         return;
783     }
784     if (WIFEXITED(status))
785     {
786         if (log)
787             log->Printf ("NativeProcessLinux::%s() waiting for tid %" PRIu32 " returned an 'exited' event. Not tracking the thread.", __FUNCTION__, tid);
788         // Also a very improbable event.
789         return;
790     }
791 
792     siginfo_t info;
793     Error error = GetSignalInfo(tid, &info);
794     if (error.Fail())
795     {
796         if (log)
797             log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " failed. Assuming the thread has disappeared in the meantime.", __FUNCTION__, tid);
798         return;
799     }
800 
801     if (((info.si_pid != 0) || (info.si_code != SI_USER)) && log)
802     {
803         // We should be getting a thread creation signal here, but we received something
804         // else. There isn't much we can do about it now, so we will just log that. Since the
805         // thread is alive and we are receiving events from it, we shall pretend that it was
806         // created properly.
807         log->Printf ("NativeProcessLinux::%s() GetSignalInfo for tid %" PRIu32 " received unexpected signal with code %d from pid %d.", __FUNCTION__, tid, info.si_code, info.si_pid);
808     }
809 
810     if (log)
811         log->Printf ("NativeProcessLinux::%s() pid = %" PRIu64 ": tracking new thread tid %" PRIu32,
812                  __FUNCTION__, GetID (), tid);
813 
814     new_thread_sp = AddThread(tid);
815     ResumeThread(*new_thread_sp, eStateRunning, LLDB_INVALID_SIGNAL_NUMBER);
816     ThreadWasCreated(*new_thread_sp);
817 }
818 
819 void
820 NativeProcessLinux::MonitorSIGTRAP(const siginfo_t &info, NativeThreadLinux &thread)
821 {
822     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
823     const bool is_main_thread = (thread.GetID() == GetID ());
824 
825     assert(info.si_signo == SIGTRAP && "Unexpected child signal!");
826 
827     switch (info.si_code)
828     {
829     // TODO: these two cases are required if we want to support tracing of the inferiors' children.  We'd need this to debug a monitor.
830     // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)):
831     // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)):
832 
833     case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):
834     {
835         // This is the notification on the parent thread which informs us of new thread
836         // creation.
837         // We don't want to do anything with the parent thread so we just resume it. In case we
838         // want to implement "break on thread creation" functionality, we would need to stop
839         // here.
840 
841         unsigned long event_message = 0;
842         if (GetEventMessage(thread.GetID(), &event_message).Fail())
843         {
844             if (log)
845                 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " received thread creation event but GetEventMessage failed so we don't know the new tid", __FUNCTION__, thread.GetID());
846         } else
847             WaitForNewThread(event_message);
848 
849         ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
850         break;
851     }
852 
853     case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)):
854     {
855         NativeThreadLinuxSP main_thread_sp;
856         if (log)
857             log->Printf ("NativeProcessLinux::%s() received exec event, code = %d", __FUNCTION__, info.si_code ^ SIGTRAP);
858 
859         // Exec clears any pending notifications.
860         m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
861 
862         // Remove all but the main thread here.  Linux fork creates a new process which only copies the main thread.
863         if (log)
864             log->Printf ("NativeProcessLinux::%s exec received, stop tracking all but main thread", __FUNCTION__);
865 
866         for (auto thread_sp : m_threads)
867         {
868             const bool is_main_thread = thread_sp && thread_sp->GetID () == GetID ();
869             if (is_main_thread)
870             {
871                 main_thread_sp = std::static_pointer_cast<NativeThreadLinux>(thread_sp);
872                 if (log)
873                     log->Printf ("NativeProcessLinux::%s found main thread with tid %" PRIu64 ", keeping", __FUNCTION__, main_thread_sp->GetID ());
874             }
875             else
876             {
877                 if (log)
878                     log->Printf ("NativeProcessLinux::%s discarding non-main-thread tid %" PRIu64 " due to exec", __FUNCTION__, thread_sp->GetID ());
879             }
880         }
881 
882         m_threads.clear ();
883 
884         if (main_thread_sp)
885         {
886             m_threads.push_back (main_thread_sp);
887             SetCurrentThreadID (main_thread_sp->GetID ());
888             main_thread_sp->SetStoppedByExec();
889         }
890         else
891         {
892             SetCurrentThreadID (LLDB_INVALID_THREAD_ID);
893             if (log)
894                 log->Printf ("NativeProcessLinux::%s pid %" PRIu64 "no main thread found, discarded all threads, we're in a no-thread state!", __FUNCTION__, GetID ());
895         }
896 
897         // Tell coordinator about about the "new" (since exec) stopped main thread.
898         ThreadWasCreated(*main_thread_sp);
899 
900         // Let our delegate know we have just exec'd.
901         NotifyDidExec ();
902 
903         // If we have a main thread, indicate we are stopped.
904         assert (main_thread_sp && "exec called during ptraced process but no main thread metadata tracked");
905 
906         // Let the process know we're stopped.
907         StopRunningThreads(main_thread_sp->GetID());
908 
909         break;
910     }
911 
912     case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):
913     {
914         // The inferior process or one of its threads is about to exit.
915         // We don't want to do anything with the thread so we just resume it. In case we
916         // want to implement "break on thread exit" functionality, we would need to stop
917         // here.
918 
919         unsigned long data = 0;
920         if (GetEventMessage(thread.GetID(), &data).Fail())
921             data = -1;
922 
923         if (log)
924         {
925             log->Printf ("NativeProcessLinux::%s() received PTRACE_EVENT_EXIT, data = %lx (WIFEXITED=%s,WIFSIGNALED=%s), pid = %" PRIu64 " (%s)",
926                          __FUNCTION__,
927                          data, WIFEXITED (data) ? "true" : "false", WIFSIGNALED (data) ? "true" : "false",
928                          thread.GetID(),
929                     is_main_thread ? "is main thread" : "not main thread");
930         }
931 
932         if (is_main_thread)
933         {
934             SetExitStatus (convert_pid_status_to_exit_type (data), convert_pid_status_to_return_code (data), nullptr, true);
935         }
936 
937         StateType state = thread.GetState();
938         if (! StateIsRunningState(state))
939         {
940             // Due to a kernel bug, we may sometimes get this stop after the inferior gets a
941             // SIGKILL. This confuses our state tracking logic in ResumeThread(), since normally,
942             // we should not be receiving any ptrace events while the inferior is stopped. This
943             // makes sure that the inferior is resumed and exits normally.
944             state = eStateRunning;
945         }
946         ResumeThread(thread, state, LLDB_INVALID_SIGNAL_NUMBER);
947 
948         break;
949     }
950 
951     case 0:
952     case TRAP_TRACE:  // We receive this on single stepping.
953     case TRAP_HWBKPT: // We receive this on watchpoint hit
954     {
955         // If a watchpoint was hit, report it
956         uint32_t wp_index;
957         Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, (uintptr_t)info.si_addr);
958         if (error.Fail() && log)
959             log->Printf("NativeProcessLinux::%s() "
960                         "received error while checking for watchpoint hits, "
961                         "pid = %" PRIu64 " error = %s",
962                         __FUNCTION__, thread.GetID(), error.AsCString());
963         if (wp_index != LLDB_INVALID_INDEX32)
964         {
965             MonitorWatchpoint(thread, wp_index);
966             break;
967         }
968 
969         // Otherwise, report step over
970         MonitorTrace(thread);
971         break;
972     }
973 
974     case SI_KERNEL:
975 #if defined __mips__
976         // For mips there is no special signal for watchpoint
977         // So we check for watchpoint in kernel trap
978     {
979         // If a watchpoint was hit, report it
980         uint32_t wp_index;
981         Error error = thread.GetRegisterContext()->GetWatchpointHitIndex(wp_index, LLDB_INVALID_ADDRESS);
982         if (error.Fail() && log)
983             log->Printf("NativeProcessLinux::%s() "
984                         "received error while checking for watchpoint hits, "
985                         "pid = %" PRIu64 " error = %s",
986                         __FUNCTION__, thread.GetID(), error.AsCString());
987         if (wp_index != LLDB_INVALID_INDEX32)
988         {
989             MonitorWatchpoint(thread, wp_index);
990             break;
991         }
992     }
993         // NO BREAK
994 #endif
995     case TRAP_BRKPT:
996         MonitorBreakpoint(thread);
997         break;
998 
999     case SIGTRAP:
1000     case (SIGTRAP | 0x80):
1001         if (log)
1002             log->Printf ("NativeProcessLinux::%s() received unknown SIGTRAP system call stop event, pid %" PRIu64 "tid %" PRIu64 ", resuming", __FUNCTION__, GetID (), thread.GetID());
1003 
1004         // Ignore these signals until we know more about them.
1005         ResumeThread(thread, thread.GetState(), LLDB_INVALID_SIGNAL_NUMBER);
1006         break;
1007 
1008     default:
1009         assert(false && "Unexpected SIGTRAP code!");
1010         if (log)
1011             log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 "tid %" PRIu64 " received unhandled SIGTRAP code: 0x%d",
1012                     __FUNCTION__, GetID(), thread.GetID(), info.si_code);
1013         break;
1014 
1015     }
1016 }
1017 
1018 void
1019 NativeProcessLinux::MonitorTrace(NativeThreadLinux &thread)
1020 {
1021     Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
1022     if (log)
1023         log->Printf("NativeProcessLinux::%s() received trace event, pid = %" PRIu64 " (single stepping)",
1024                 __FUNCTION__, thread.GetID());
1025 
1026     // This thread is currently stopped.
1027     thread.SetStoppedByTrace();
1028 
1029     StopRunningThreads(thread.GetID());
1030 }
1031 
1032 void
1033 NativeProcessLinux::MonitorBreakpoint(NativeThreadLinux &thread)
1034 {
1035     Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
1036     if (log)
1037         log->Printf("NativeProcessLinux::%s() received breakpoint event, pid = %" PRIu64,
1038                 __FUNCTION__, thread.GetID());
1039 
1040     // Mark the thread as stopped at breakpoint.
1041     thread.SetStoppedByBreakpoint();
1042     Error error = FixupBreakpointPCAsNeeded(thread);
1043     if (error.Fail())
1044         if (log)
1045             log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " fixup: %s",
1046                     __FUNCTION__, thread.GetID(), error.AsCString());
1047 
1048     if (m_threads_stepping_with_breakpoint.find(thread.GetID()) != m_threads_stepping_with_breakpoint.end())
1049         thread.SetStoppedByTrace();
1050 
1051     StopRunningThreads(thread.GetID());
1052 }
1053 
1054 void
1055 NativeProcessLinux::MonitorWatchpoint(NativeThreadLinux &thread, uint32_t wp_index)
1056 {
1057     Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_WATCHPOINTS));
1058     if (log)
1059         log->Printf("NativeProcessLinux::%s() received watchpoint event, "
1060                     "pid = %" PRIu64 ", wp_index = %" PRIu32,
1061                     __FUNCTION__, thread.GetID(), wp_index);
1062 
1063     // Mark the thread as stopped at watchpoint.
1064     // The address is at (lldb::addr_t)info->si_addr if we need it.
1065     thread.SetStoppedByWatchpoint(wp_index);
1066 
1067     // We need to tell all other running threads before we notify the delegate about this stop.
1068     StopRunningThreads(thread.GetID());
1069 }
1070 
1071 void
1072 NativeProcessLinux::MonitorSignal(const siginfo_t &info, NativeThreadLinux &thread, bool exited)
1073 {
1074     const int signo = info.si_signo;
1075     const bool is_from_llgs = info.si_pid == getpid ();
1076 
1077     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1078 
1079     // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
1080     // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
1081     // kill(2) or raise(3).  Similarly for tgkill(2) on Linux.
1082     //
1083     // IOW, user generated signals never generate what we consider to be a
1084     // "crash".
1085     //
1086     // Similarly, ACK signals generated by this monitor.
1087 
1088     // Handle the signal.
1089     if (info.si_code == SI_TKILL || info.si_code == SI_USER)
1090     {
1091         if (log)
1092             log->Printf ("NativeProcessLinux::%s() received signal %s (%d) with code %s, (siginfo pid = %d (%s), waitpid pid = %" PRIu64 ")",
1093                             __FUNCTION__,
1094                             Host::GetSignalAsCString(signo),
1095                             signo,
1096                             (info.si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"),
1097                             info.si_pid,
1098                             is_from_llgs ? "from llgs" : "not from llgs",
1099                             thread.GetID());
1100     }
1101 
1102     // Check for thread stop notification.
1103     if (is_from_llgs && (info.si_code == SI_TKILL) && (signo == SIGSTOP))
1104     {
1105         // This is a tgkill()-based stop.
1106         if (log)
1107             log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread stopped",
1108                          __FUNCTION__,
1109                          GetID (),
1110                          thread.GetID());
1111 
1112         // Check that we're not already marked with a stop reason.
1113         // Note this thread really shouldn't already be marked as stopped - if we were, that would imply that
1114         // the kernel signaled us with the thread stopping which we handled and marked as stopped,
1115         // and that, without an intervening resume, we received another stop.  It is more likely
1116         // that we are missing the marking of a run state somewhere if we find that the thread was
1117         // marked as stopped.
1118         const StateType thread_state = thread.GetState();
1119         if (!StateIsStoppedState (thread_state, false))
1120         {
1121             // An inferior thread has stopped because of a SIGSTOP we have sent it.
1122             // Generally, these are not important stops and we don't want to report them as
1123             // they are just used to stop other threads when one thread (the one with the
1124             // *real* stop reason) hits a breakpoint (watchpoint, etc...). However, in the
1125             // case of an asynchronous Interrupt(), this *is* the real stop reason, so we
1126             // leave the signal intact if this is the thread that was chosen as the
1127             // triggering thread.
1128             if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID)
1129             {
1130                 if (m_pending_notification_tid == thread.GetID())
1131                     thread.SetStoppedBySignal(SIGSTOP, &info);
1132                 else
1133                     thread.SetStoppedWithNoReason();
1134 
1135                 SetCurrentThreadID (thread.GetID ());
1136                 SignalIfAllThreadsStopped();
1137             }
1138             else
1139             {
1140                 // We can end up here if stop was initiated by LLGS but by this time a
1141                 // thread stop has occurred - maybe initiated by another event.
1142                 Error error = ResumeThread(thread, thread.GetState(), 0);
1143                 if (error.Fail() && log)
1144                 {
1145                     log->Printf("NativeProcessLinux::%s failed to resume thread tid  %" PRIu64 ": %s",
1146                             __FUNCTION__, thread.GetID(), error.AsCString());
1147                 }
1148             }
1149         }
1150         else
1151         {
1152             if (log)
1153             {
1154                 // Retrieve the signal name if the thread was stopped by a signal.
1155                 int stop_signo = 0;
1156                 const bool stopped_by_signal = thread.IsStopped(&stop_signo);
1157                 const char *signal_name = stopped_by_signal ? Host::GetSignalAsCString(stop_signo) : "<not stopped by signal>";
1158                 if (!signal_name)
1159                     signal_name = "<no-signal-name>";
1160 
1161                 log->Printf ("NativeProcessLinux::%s() pid %" PRIu64 " tid %" PRIu64 ", thread was already marked as a stopped state (state=%s, signal=%d (%s)), leaving stop signal as is",
1162                              __FUNCTION__,
1163                              GetID (),
1164                              thread.GetID(),
1165                              StateAsCString (thread_state),
1166                              stop_signo,
1167                              signal_name);
1168             }
1169             SignalIfAllThreadsStopped();
1170         }
1171 
1172         // Done handling.
1173         return;
1174     }
1175 
1176     if (log)
1177         log->Printf ("NativeProcessLinux::%s() received signal %s", __FUNCTION__, Host::GetSignalAsCString(signo));
1178 
1179     // This thread is stopped.
1180     thread.SetStoppedBySignal(signo, &info);
1181 
1182     // Send a stop to the debugger after we get all other threads to stop.
1183     StopRunningThreads(thread.GetID());
1184 }
1185 
1186 namespace {
1187 
1188 struct EmulatorBaton
1189 {
1190     NativeProcessLinux* m_process;
1191     NativeRegisterContext* m_reg_context;
1192 
1193     // eRegisterKindDWARF -> RegsiterValue
1194     std::unordered_map<uint32_t, RegisterValue> m_register_values;
1195 
1196     EmulatorBaton(NativeProcessLinux* process, NativeRegisterContext* reg_context) :
1197             m_process(process), m_reg_context(reg_context) {}
1198 };
1199 
1200 } // anonymous namespace
1201 
1202 static size_t
1203 ReadMemoryCallback (EmulateInstruction *instruction,
1204                     void *baton,
1205                     const EmulateInstruction::Context &context,
1206                     lldb::addr_t addr,
1207                     void *dst,
1208                     size_t length)
1209 {
1210     EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1211 
1212     size_t bytes_read;
1213     emulator_baton->m_process->ReadMemory(addr, dst, length, bytes_read);
1214     return bytes_read;
1215 }
1216 
1217 static bool
1218 ReadRegisterCallback (EmulateInstruction *instruction,
1219                       void *baton,
1220                       const RegisterInfo *reg_info,
1221                       RegisterValue &reg_value)
1222 {
1223     EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1224 
1225     auto it = emulator_baton->m_register_values.find(reg_info->kinds[eRegisterKindDWARF]);
1226     if (it != emulator_baton->m_register_values.end())
1227     {
1228         reg_value = it->second;
1229         return true;
1230     }
1231 
1232     // The emulator only fill in the dwarf regsiter numbers (and in some case
1233     // the generic register numbers). Get the full register info from the
1234     // register context based on the dwarf register numbers.
1235     const RegisterInfo* full_reg_info = emulator_baton->m_reg_context->GetRegisterInfo(
1236             eRegisterKindDWARF, reg_info->kinds[eRegisterKindDWARF]);
1237 
1238     Error error = emulator_baton->m_reg_context->ReadRegister(full_reg_info, reg_value);
1239     if (error.Success())
1240         return true;
1241 
1242     return false;
1243 }
1244 
1245 static bool
1246 WriteRegisterCallback (EmulateInstruction *instruction,
1247                        void *baton,
1248                        const EmulateInstruction::Context &context,
1249                        const RegisterInfo *reg_info,
1250                        const RegisterValue &reg_value)
1251 {
1252     EmulatorBaton* emulator_baton = static_cast<EmulatorBaton*>(baton);
1253     emulator_baton->m_register_values[reg_info->kinds[eRegisterKindDWARF]] = reg_value;
1254     return true;
1255 }
1256 
1257 static size_t
1258 WriteMemoryCallback (EmulateInstruction *instruction,
1259                      void *baton,
1260                      const EmulateInstruction::Context &context,
1261                      lldb::addr_t addr,
1262                      const void *dst,
1263                      size_t length)
1264 {
1265     return length;
1266 }
1267 
1268 static lldb::addr_t
1269 ReadFlags (NativeRegisterContext* regsiter_context)
1270 {
1271     const RegisterInfo* flags_info = regsiter_context->GetRegisterInfo(
1272             eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1273     return regsiter_context->ReadRegisterAsUnsigned(flags_info, LLDB_INVALID_ADDRESS);
1274 }
1275 
1276 Error
1277 NativeProcessLinux::SetupSoftwareSingleStepping(NativeThreadLinux &thread)
1278 {
1279     Error error;
1280     NativeRegisterContextSP register_context_sp = thread.GetRegisterContext();
1281 
1282     std::unique_ptr<EmulateInstruction> emulator_ap(
1283         EmulateInstruction::FindPlugin(m_arch, eInstructionTypePCModifying, nullptr));
1284 
1285     if (emulator_ap == nullptr)
1286         return Error("Instruction emulator not found!");
1287 
1288     EmulatorBaton baton(this, register_context_sp.get());
1289     emulator_ap->SetBaton(&baton);
1290     emulator_ap->SetReadMemCallback(&ReadMemoryCallback);
1291     emulator_ap->SetReadRegCallback(&ReadRegisterCallback);
1292     emulator_ap->SetWriteMemCallback(&WriteMemoryCallback);
1293     emulator_ap->SetWriteRegCallback(&WriteRegisterCallback);
1294 
1295     if (!emulator_ap->ReadInstruction())
1296         return Error("Read instruction failed!");
1297 
1298     bool emulation_result = emulator_ap->EvaluateInstruction(eEmulateInstructionOptionAutoAdvancePC);
1299 
1300     const RegisterInfo* reg_info_pc = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_PC);
1301     const RegisterInfo* reg_info_flags = register_context_sp->GetRegisterInfo(eRegisterKindGeneric, LLDB_REGNUM_GENERIC_FLAGS);
1302 
1303     auto pc_it = baton.m_register_values.find(reg_info_pc->kinds[eRegisterKindDWARF]);
1304     auto flags_it = baton.m_register_values.find(reg_info_flags->kinds[eRegisterKindDWARF]);
1305 
1306     lldb::addr_t next_pc;
1307     lldb::addr_t next_flags;
1308     if (emulation_result)
1309     {
1310         assert(pc_it != baton.m_register_values.end() && "Emulation was successfull but PC wasn't updated");
1311         next_pc = pc_it->second.GetAsUInt64();
1312 
1313         if (flags_it != baton.m_register_values.end())
1314             next_flags = flags_it->second.GetAsUInt64();
1315         else
1316             next_flags = ReadFlags (register_context_sp.get());
1317     }
1318     else if (pc_it == baton.m_register_values.end())
1319     {
1320         // Emulate instruction failed and it haven't changed PC. Advance PC
1321         // with the size of the current opcode because the emulation of all
1322         // PC modifying instruction should be successful. The failure most
1323         // likely caused by a not supported instruction which don't modify PC.
1324         next_pc = register_context_sp->GetPC() + emulator_ap->GetOpcode().GetByteSize();
1325         next_flags = ReadFlags (register_context_sp.get());
1326     }
1327     else
1328     {
1329         // The instruction emulation failed after it modified the PC. It is an
1330         // unknown error where we can't continue because the next instruction is
1331         // modifying the PC but we don't  know how.
1332         return Error ("Instruction emulation failed unexpectedly.");
1333     }
1334 
1335     if (m_arch.GetMachine() == llvm::Triple::arm)
1336     {
1337         if (next_flags & 0x20)
1338         {
1339             // Thumb mode
1340             error = SetSoftwareBreakpoint(next_pc, 2);
1341         }
1342         else
1343         {
1344             // Arm mode
1345             error = SetSoftwareBreakpoint(next_pc, 4);
1346         }
1347     }
1348     else if (m_arch.GetMachine() == llvm::Triple::mips64
1349             || m_arch.GetMachine() == llvm::Triple::mips64el
1350             || m_arch.GetMachine() == llvm::Triple::mips
1351             || m_arch.GetMachine() == llvm::Triple::mipsel)
1352         error = SetSoftwareBreakpoint(next_pc, 4);
1353     else
1354     {
1355         // No size hint is given for the next breakpoint
1356         error = SetSoftwareBreakpoint(next_pc, 0);
1357     }
1358 
1359     if (error.Fail())
1360         return error;
1361 
1362     m_threads_stepping_with_breakpoint.insert({thread.GetID(), next_pc});
1363 
1364     return Error();
1365 }
1366 
1367 bool
1368 NativeProcessLinux::SupportHardwareSingleStepping() const
1369 {
1370     if (m_arch.GetMachine() == llvm::Triple::arm
1371         || m_arch.GetMachine() == llvm::Triple::mips64 || m_arch.GetMachine() == llvm::Triple::mips64el
1372         || m_arch.GetMachine() == llvm::Triple::mips || m_arch.GetMachine() == llvm::Triple::mipsel)
1373         return false;
1374     return true;
1375 }
1376 
1377 Error
1378 NativeProcessLinux::Resume (const ResumeActionList &resume_actions)
1379 {
1380     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_THREAD));
1381     if (log)
1382         log->Printf ("NativeProcessLinux::%s called: pid %" PRIu64, __FUNCTION__, GetID ());
1383 
1384     bool software_single_step = !SupportHardwareSingleStepping();
1385 
1386     if (software_single_step)
1387     {
1388         for (auto thread_sp : m_threads)
1389         {
1390             assert (thread_sp && "thread list should not contain NULL threads");
1391 
1392             const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true);
1393             if (action == nullptr)
1394                 continue;
1395 
1396             if (action->state == eStateStepping)
1397             {
1398                 Error error = SetupSoftwareSingleStepping(static_cast<NativeThreadLinux &>(*thread_sp));
1399                 if (error.Fail())
1400                     return error;
1401             }
1402         }
1403     }
1404 
1405     for (auto thread_sp : m_threads)
1406     {
1407         assert (thread_sp && "thread list should not contain NULL threads");
1408 
1409         const ResumeAction *const action = resume_actions.GetActionForThread (thread_sp->GetID (), true);
1410 
1411         if (action == nullptr)
1412         {
1413             if (log)
1414                 log->Printf ("NativeProcessLinux::%s no action specified for pid %" PRIu64 " tid %" PRIu64,
1415                     __FUNCTION__, GetID (), thread_sp->GetID ());
1416             continue;
1417         }
1418 
1419         if (log)
1420         {
1421             log->Printf ("NativeProcessLinux::%s processing resume action state %s for pid %" PRIu64 " tid %" PRIu64,
1422                     __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ());
1423         }
1424 
1425         switch (action->state)
1426         {
1427         case eStateRunning:
1428         case eStateStepping:
1429         {
1430             // Run the thread, possibly feeding it the signal.
1431             const int signo = action->signal;
1432             ResumeThread(static_cast<NativeThreadLinux &>(*thread_sp), action->state, signo);
1433             break;
1434         }
1435 
1436         case eStateSuspended:
1437         case eStateStopped:
1438             lldbassert(0 && "Unexpected state");
1439 
1440         default:
1441             return Error ("NativeProcessLinux::%s (): unexpected state %s specified for pid %" PRIu64 ", tid %" PRIu64,
1442                     __FUNCTION__, StateAsCString (action->state), GetID (), thread_sp->GetID ());
1443         }
1444     }
1445 
1446     return Error();
1447 }
1448 
1449 Error
1450 NativeProcessLinux::Halt ()
1451 {
1452     Error error;
1453 
1454     if (kill (GetID (), SIGSTOP) != 0)
1455         error.SetErrorToErrno ();
1456 
1457     return error;
1458 }
1459 
1460 Error
1461 NativeProcessLinux::Detach ()
1462 {
1463     Error error;
1464 
1465     // Stop monitoring the inferior.
1466     m_sigchld_handle.reset();
1467 
1468     // Tell ptrace to detach from the process.
1469     if (GetID () == LLDB_INVALID_PROCESS_ID)
1470         return error;
1471 
1472     for (auto thread_sp : m_threads)
1473     {
1474         Error e = Detach(thread_sp->GetID());
1475         if (e.Fail())
1476             error = e; // Save the error, but still attempt to detach from other threads.
1477     }
1478 
1479     return error;
1480 }
1481 
1482 Error
1483 NativeProcessLinux::Signal (int signo)
1484 {
1485     Error error;
1486 
1487     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1488     if (log)
1489         log->Printf ("NativeProcessLinux::%s: sending signal %d (%s) to pid %" PRIu64,
1490                 __FUNCTION__, signo, Host::GetSignalAsCString(signo), GetID());
1491 
1492     if (kill(GetID(), signo))
1493         error.SetErrorToErrno();
1494 
1495     return error;
1496 }
1497 
1498 Error
1499 NativeProcessLinux::Interrupt ()
1500 {
1501     // Pick a running thread (or if none, a not-dead stopped thread) as
1502     // the chosen thread that will be the stop-reason thread.
1503     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1504 
1505     NativeThreadProtocolSP running_thread_sp;
1506     NativeThreadProtocolSP stopped_thread_sp;
1507 
1508     if (log)
1509         log->Printf ("NativeProcessLinux::%s selecting running thread for interrupt target", __FUNCTION__);
1510 
1511     for (auto thread_sp : m_threads)
1512     {
1513         // The thread shouldn't be null but lets just cover that here.
1514         if (!thread_sp)
1515             continue;
1516 
1517         // If we have a running or stepping thread, we'll call that the
1518         // target of the interrupt.
1519         const auto thread_state = thread_sp->GetState ();
1520         if (thread_state == eStateRunning ||
1521             thread_state == eStateStepping)
1522         {
1523             running_thread_sp = thread_sp;
1524             break;
1525         }
1526         else if (!stopped_thread_sp && StateIsStoppedState (thread_state, true))
1527         {
1528             // Remember the first non-dead stopped thread.  We'll use that as a backup if there are no running threads.
1529             stopped_thread_sp = thread_sp;
1530         }
1531     }
1532 
1533     if (!running_thread_sp && !stopped_thread_sp)
1534     {
1535         Error error("found no running/stepping or live stopped threads as target for interrupt");
1536         if (log)
1537             log->Printf ("NativeProcessLinux::%s skipping due to error: %s", __FUNCTION__, error.AsCString ());
1538 
1539         return error;
1540     }
1541 
1542     NativeThreadProtocolSP deferred_signal_thread_sp = running_thread_sp ? running_thread_sp : stopped_thread_sp;
1543 
1544     if (log)
1545         log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " %s tid %" PRIu64 " chosen for interrupt target",
1546                      __FUNCTION__,
1547                      GetID (),
1548                      running_thread_sp ? "running" : "stopped",
1549                      deferred_signal_thread_sp->GetID ());
1550 
1551     StopRunningThreads(deferred_signal_thread_sp->GetID());
1552 
1553     return Error();
1554 }
1555 
1556 Error
1557 NativeProcessLinux::Kill ()
1558 {
1559     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1560     if (log)
1561         log->Printf ("NativeProcessLinux::%s called for PID %" PRIu64, __FUNCTION__, GetID ());
1562 
1563     Error error;
1564 
1565     switch (m_state)
1566     {
1567         case StateType::eStateInvalid:
1568         case StateType::eStateExited:
1569         case StateType::eStateCrashed:
1570         case StateType::eStateDetached:
1571         case StateType::eStateUnloaded:
1572             // Nothing to do - the process is already dead.
1573             if (log)
1574                 log->Printf ("NativeProcessLinux::%s ignored for PID %" PRIu64 " due to current state: %s", __FUNCTION__, GetID (), StateAsCString (m_state));
1575             return error;
1576 
1577         case StateType::eStateConnected:
1578         case StateType::eStateAttaching:
1579         case StateType::eStateLaunching:
1580         case StateType::eStateStopped:
1581         case StateType::eStateRunning:
1582         case StateType::eStateStepping:
1583         case StateType::eStateSuspended:
1584             // We can try to kill a process in these states.
1585             break;
1586     }
1587 
1588     if (kill (GetID (), SIGKILL) != 0)
1589     {
1590         error.SetErrorToErrno ();
1591         return error;
1592     }
1593 
1594     return error;
1595 }
1596 
1597 static Error
1598 ParseMemoryRegionInfoFromProcMapsLine (const std::string &maps_line, MemoryRegionInfo &memory_region_info)
1599 {
1600     memory_region_info.Clear();
1601 
1602     StringExtractor line_extractor (maps_line.c_str ());
1603 
1604     // Format: {address_start_hex}-{address_end_hex} perms offset  dev   inode   pathname
1605     // perms: rwxp   (letter is present if set, '-' if not, final character is p=private, s=shared).
1606 
1607     // Parse out the starting address
1608     lldb::addr_t start_address = line_extractor.GetHexMaxU64 (false, 0);
1609 
1610     // Parse out hyphen separating start and end address from range.
1611     if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != '-'))
1612         return Error ("malformed /proc/{pid}/maps entry, missing dash between address range");
1613 
1614     // Parse out the ending address
1615     lldb::addr_t end_address = line_extractor.GetHexMaxU64 (false, start_address);
1616 
1617     // Parse out the space after the address.
1618     if (!line_extractor.GetBytesLeft () || (line_extractor.GetChar () != ' '))
1619         return Error ("malformed /proc/{pid}/maps entry, missing space after range");
1620 
1621     // Save the range.
1622     memory_region_info.GetRange ().SetRangeBase (start_address);
1623     memory_region_info.GetRange ().SetRangeEnd (end_address);
1624 
1625     // Any memory region in /proc/{pid}/maps is by definition mapped into the process.
1626     memory_region_info.SetMapped(MemoryRegionInfo::OptionalBool::eYes);
1627 
1628     // Parse out each permission entry.
1629     if (line_extractor.GetBytesLeft () < 4)
1630         return Error ("malformed /proc/{pid}/maps entry, missing some portion of permissions");
1631 
1632     // Handle read permission.
1633     const char read_perm_char = line_extractor.GetChar ();
1634     if (read_perm_char == 'r')
1635         memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eYes);
1636     else if (read_perm_char == '-')
1637         memory_region_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
1638     else
1639         return Error ("unexpected /proc/{pid}/maps read permission char");
1640 
1641     // Handle write permission.
1642     const char write_perm_char = line_extractor.GetChar ();
1643     if (write_perm_char == 'w')
1644         memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eYes);
1645     else if (write_perm_char == '-')
1646         memory_region_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
1647     else
1648         return Error ("unexpected /proc/{pid}/maps write permission char");
1649 
1650     // Handle execute permission.
1651     const char exec_perm_char = line_extractor.GetChar ();
1652     if (exec_perm_char == 'x')
1653         memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eYes);
1654     else if (exec_perm_char == '-')
1655         memory_region_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
1656     else
1657         return Error ("unexpected /proc/{pid}/maps exec permission char");
1658 
1659     line_extractor.GetChar();              // Read the private bit
1660     line_extractor.SkipSpaces();           // Skip the separator
1661     line_extractor.GetHexMaxU64(false, 0); // Read the offset
1662     line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1663     line_extractor.GetChar();              // Read the device id separator
1664     line_extractor.GetHexMaxU64(false, 0); // Read the major device number
1665     line_extractor.SkipSpaces();           // Skip the separator
1666     line_extractor.GetU64(0, 10);          // Read the inode number
1667 
1668     line_extractor.SkipSpaces();
1669     const char* name = line_extractor.Peek();
1670     if (name)
1671         memory_region_info.SetName(name);
1672 
1673     return Error ();
1674 }
1675 
1676 Error
1677 NativeProcessLinux::GetMemoryRegionInfo (lldb::addr_t load_addr, MemoryRegionInfo &range_info)
1678 {
1679     // FIXME review that the final memory region returned extends to the end of the virtual address space,
1680     // with no perms if it is not mapped.
1681 
1682     // Use an approach that reads memory regions from /proc/{pid}/maps.
1683     // Assume proc maps entries are in ascending order.
1684     // FIXME assert if we find differently.
1685 
1686     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1687     Error error;
1688 
1689     if (m_supports_mem_region == LazyBool::eLazyBoolNo)
1690     {
1691         // We're done.
1692         error.SetErrorString ("unsupported");
1693         return error;
1694     }
1695 
1696     // If our cache is empty, pull the latest.  There should always be at least one memory region
1697     // if memory region handling is supported.
1698     if (m_mem_region_cache.empty ())
1699     {
1700         error = ProcFileReader::ProcessLineByLine (GetID (), "maps",
1701              [&] (const std::string &line) -> bool
1702              {
1703                  MemoryRegionInfo info;
1704                  const Error parse_error = ParseMemoryRegionInfoFromProcMapsLine (line, info);
1705                  if (parse_error.Success ())
1706                  {
1707                      m_mem_region_cache.push_back (info);
1708                      return true;
1709                  }
1710                  else
1711                  {
1712                      if (log)
1713                          log->Printf ("NativeProcessLinux::%s failed to parse proc maps line '%s': %s", __FUNCTION__, line.c_str (), error.AsCString ());
1714                      return false;
1715                  }
1716              });
1717 
1718         // If we had an error, we'll mark unsupported.
1719         if (error.Fail ())
1720         {
1721             m_supports_mem_region = LazyBool::eLazyBoolNo;
1722             return error;
1723         }
1724         else if (m_mem_region_cache.empty ())
1725         {
1726             // No entries after attempting to read them.  This shouldn't happen if /proc/{pid}/maps
1727             // is supported.  Assume we don't support map entries via procfs.
1728             if (log)
1729                 log->Printf ("NativeProcessLinux::%s failed to find any procfs maps entries, assuming no support for memory region metadata retrieval", __FUNCTION__);
1730             m_supports_mem_region = LazyBool::eLazyBoolNo;
1731             error.SetErrorString ("not supported");
1732             return error;
1733         }
1734 
1735         if (log)
1736             log->Printf ("NativeProcessLinux::%s read %" PRIu64 " memory region entries from /proc/%" PRIu64 "/maps", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()), GetID ());
1737 
1738         // We support memory retrieval, remember that.
1739         m_supports_mem_region = LazyBool::eLazyBoolYes;
1740     }
1741     else
1742     {
1743         if (log)
1744             log->Printf ("NativeProcessLinux::%s reusing %" PRIu64 " cached memory region entries", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()));
1745     }
1746 
1747     lldb::addr_t prev_base_address = 0;
1748 
1749     // FIXME start by finding the last region that is <= target address using binary search.  Data is sorted.
1750     // There can be a ton of regions on pthreads apps with lots of threads.
1751     for (auto it = m_mem_region_cache.begin(); it != m_mem_region_cache.end (); ++it)
1752     {
1753         MemoryRegionInfo &proc_entry_info = *it;
1754 
1755         // Sanity check assumption that /proc/{pid}/maps entries are ascending.
1756         assert ((proc_entry_info.GetRange ().GetRangeBase () >= prev_base_address) && "descending /proc/pid/maps entries detected, unexpected");
1757         prev_base_address = proc_entry_info.GetRange ().GetRangeBase ();
1758 
1759         // If the target address comes before this entry, indicate distance to next region.
1760         if (load_addr < proc_entry_info.GetRange ().GetRangeBase ())
1761         {
1762             range_info.GetRange ().SetRangeBase (load_addr);
1763             range_info.GetRange ().SetByteSize (proc_entry_info.GetRange ().GetRangeBase () - load_addr);
1764             range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
1765             range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
1766             range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
1767             range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
1768 
1769             return error;
1770         }
1771         else if (proc_entry_info.GetRange ().Contains (load_addr))
1772         {
1773             // The target address is within the memory region we're processing here.
1774             range_info = proc_entry_info;
1775             return error;
1776         }
1777 
1778         // The target memory address comes somewhere after the region we just parsed.
1779     }
1780 
1781     // If we made it here, we didn't find an entry that contained the given address. Return the
1782     // load_addr as start and the amount of bytes betwwen load address and the end of the memory as
1783     // size.
1784     range_info.GetRange ().SetRangeBase (load_addr);
1785     range_info.GetRange ().SetRangeEnd(LLDB_INVALID_ADDRESS);
1786     range_info.SetReadable (MemoryRegionInfo::OptionalBool::eNo);
1787     range_info.SetWritable (MemoryRegionInfo::OptionalBool::eNo);
1788     range_info.SetExecutable (MemoryRegionInfo::OptionalBool::eNo);
1789     range_info.SetMapped(MemoryRegionInfo::OptionalBool::eNo);
1790     return error;
1791 }
1792 
1793 void
1794 NativeProcessLinux::DoStopIDBumped (uint32_t newBumpId)
1795 {
1796     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
1797     if (log)
1798         log->Printf ("NativeProcessLinux::%s(newBumpId=%" PRIu32 ") called", __FUNCTION__, newBumpId);
1799 
1800         if (log)
1801             log->Printf ("NativeProcessLinux::%s clearing %" PRIu64 " entries from the cache", __FUNCTION__, static_cast<uint64_t> (m_mem_region_cache.size ()));
1802         m_mem_region_cache.clear ();
1803 }
1804 
1805 Error
1806 NativeProcessLinux::AllocateMemory(size_t size, uint32_t permissions, lldb::addr_t &addr)
1807 {
1808     // FIXME implementing this requires the equivalent of
1809     // InferiorCallPOSIX::InferiorCallMmap, which depends on
1810     // functional ThreadPlans working with Native*Protocol.
1811 #if 1
1812     return Error ("not implemented yet");
1813 #else
1814     addr = LLDB_INVALID_ADDRESS;
1815 
1816     unsigned prot = 0;
1817     if (permissions & lldb::ePermissionsReadable)
1818         prot |= eMmapProtRead;
1819     if (permissions & lldb::ePermissionsWritable)
1820         prot |= eMmapProtWrite;
1821     if (permissions & lldb::ePermissionsExecutable)
1822         prot |= eMmapProtExec;
1823 
1824     // TODO implement this directly in NativeProcessLinux
1825     // (and lift to NativeProcessPOSIX if/when that class is
1826     // refactored out).
1827     if (InferiorCallMmap(this, addr, 0, size, prot,
1828                          eMmapFlagsAnon | eMmapFlagsPrivate, -1, 0)) {
1829         m_addr_to_mmap_size[addr] = size;
1830         return Error ();
1831     } else {
1832         addr = LLDB_INVALID_ADDRESS;
1833         return Error("unable to allocate %" PRIu64 " bytes of memory with permissions %s", size, GetPermissionsAsCString (permissions));
1834     }
1835 #endif
1836 }
1837 
1838 Error
1839 NativeProcessLinux::DeallocateMemory (lldb::addr_t addr)
1840 {
1841     // FIXME see comments in AllocateMemory - required lower-level
1842     // bits not in place yet (ThreadPlans)
1843     return Error ("not implemented");
1844 }
1845 
1846 lldb::addr_t
1847 NativeProcessLinux::GetSharedLibraryInfoAddress ()
1848 {
1849     // punt on this for now
1850     return LLDB_INVALID_ADDRESS;
1851 }
1852 
1853 size_t
1854 NativeProcessLinux::UpdateThreads ()
1855 {
1856     // The NativeProcessLinux monitoring threads are always up to date
1857     // with respect to thread state and they keep the thread list
1858     // populated properly. All this method needs to do is return the
1859     // thread count.
1860     return m_threads.size ();
1861 }
1862 
1863 bool
1864 NativeProcessLinux::GetArchitecture (ArchSpec &arch) const
1865 {
1866     arch = m_arch;
1867     return true;
1868 }
1869 
1870 Error
1871 NativeProcessLinux::GetSoftwareBreakpointPCOffset(uint32_t &actual_opcode_size)
1872 {
1873     // FIXME put this behind a breakpoint protocol class that can be
1874     // set per architecture.  Need ARM, MIPS support here.
1875     static const uint8_t g_i386_opcode [] = { 0xCC };
1876     static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 };
1877 
1878     switch (m_arch.GetMachine ())
1879     {
1880         case llvm::Triple::x86:
1881         case llvm::Triple::x86_64:
1882             actual_opcode_size = static_cast<uint32_t> (sizeof(g_i386_opcode));
1883             return Error ();
1884 
1885         case llvm::Triple::systemz:
1886             actual_opcode_size = static_cast<uint32_t> (sizeof(g_s390x_opcode));
1887             return Error ();
1888 
1889         case llvm::Triple::arm:
1890         case llvm::Triple::aarch64:
1891         case llvm::Triple::mips64:
1892         case llvm::Triple::mips64el:
1893         case llvm::Triple::mips:
1894         case llvm::Triple::mipsel:
1895             // On these architectures the PC don't get updated for breakpoint hits
1896             actual_opcode_size = 0;
1897             return Error ();
1898 
1899         default:
1900             assert(false && "CPU type not supported!");
1901             return Error ("CPU type not supported");
1902     }
1903 }
1904 
1905 Error
1906 NativeProcessLinux::SetBreakpoint (lldb::addr_t addr, uint32_t size, bool hardware)
1907 {
1908     if (hardware)
1909         return Error ("NativeProcessLinux does not support hardware breakpoints");
1910     else
1911         return SetSoftwareBreakpoint (addr, size);
1912 }
1913 
1914 Error
1915 NativeProcessLinux::GetSoftwareBreakpointTrapOpcode (size_t trap_opcode_size_hint,
1916                                                      size_t &actual_opcode_size,
1917                                                      const uint8_t *&trap_opcode_bytes)
1918 {
1919     // FIXME put this behind a breakpoint protocol class that can be set per
1920     // architecture.  Need MIPS support here.
1921     static const uint8_t g_aarch64_opcode[] = { 0x00, 0x00, 0x20, 0xd4 };
1922     // The ARM reference recommends the use of 0xe7fddefe and 0xdefe but the
1923     // linux kernel does otherwise.
1924     static const uint8_t g_arm_breakpoint_opcode[] = { 0xf0, 0x01, 0xf0, 0xe7 };
1925     static const uint8_t g_i386_opcode [] = { 0xCC };
1926     static const uint8_t g_mips64_opcode[] = { 0x00, 0x00, 0x00, 0x0d };
1927     static const uint8_t g_mips64el_opcode[] = { 0x0d, 0x00, 0x00, 0x00 };
1928     static const uint8_t g_s390x_opcode[] = { 0x00, 0x01 };
1929     static const uint8_t g_thumb_breakpoint_opcode[] = { 0x01, 0xde };
1930 
1931     switch (m_arch.GetMachine ())
1932     {
1933     case llvm::Triple::aarch64:
1934         trap_opcode_bytes = g_aarch64_opcode;
1935         actual_opcode_size = sizeof(g_aarch64_opcode);
1936         return Error ();
1937 
1938     case llvm::Triple::arm:
1939         switch (trap_opcode_size_hint)
1940         {
1941         case 2:
1942             trap_opcode_bytes = g_thumb_breakpoint_opcode;
1943             actual_opcode_size = sizeof(g_thumb_breakpoint_opcode);
1944             return Error ();
1945         case 4:
1946             trap_opcode_bytes = g_arm_breakpoint_opcode;
1947             actual_opcode_size = sizeof(g_arm_breakpoint_opcode);
1948             return Error ();
1949         default:
1950             assert(false && "Unrecognised trap opcode size hint!");
1951             return Error ("Unrecognised trap opcode size hint!");
1952         }
1953 
1954     case llvm::Triple::x86:
1955     case llvm::Triple::x86_64:
1956         trap_opcode_bytes = g_i386_opcode;
1957         actual_opcode_size = sizeof(g_i386_opcode);
1958         return Error ();
1959 
1960     case llvm::Triple::mips:
1961     case llvm::Triple::mips64:
1962         trap_opcode_bytes = g_mips64_opcode;
1963         actual_opcode_size = sizeof(g_mips64_opcode);
1964         return Error ();
1965 
1966     case llvm::Triple::mipsel:
1967     case llvm::Triple::mips64el:
1968         trap_opcode_bytes = g_mips64el_opcode;
1969         actual_opcode_size = sizeof(g_mips64el_opcode);
1970         return Error ();
1971 
1972     case llvm::Triple::systemz:
1973         trap_opcode_bytes = g_s390x_opcode;
1974         actual_opcode_size = sizeof(g_s390x_opcode);
1975         return Error ();
1976 
1977     default:
1978         assert(false && "CPU type not supported!");
1979         return Error ("CPU type not supported");
1980     }
1981 }
1982 
1983 #if 0
1984 ProcessMessage::CrashReason
1985 NativeProcessLinux::GetCrashReasonForSIGSEGV(const siginfo_t *info)
1986 {
1987     ProcessMessage::CrashReason reason;
1988     assert(info->si_signo == SIGSEGV);
1989 
1990     reason = ProcessMessage::eInvalidCrashReason;
1991 
1992     switch (info->si_code)
1993     {
1994     default:
1995         assert(false && "unexpected si_code for SIGSEGV");
1996         break;
1997     case SI_KERNEL:
1998         // Linux will occasionally send spurious SI_KERNEL codes.
1999         // (this is poorly documented in sigaction)
2000         // One way to get this is via unaligned SIMD loads.
2001         reason = ProcessMessage::eInvalidAddress; // for lack of anything better
2002         break;
2003     case SEGV_MAPERR:
2004         reason = ProcessMessage::eInvalidAddress;
2005         break;
2006     case SEGV_ACCERR:
2007         reason = ProcessMessage::ePrivilegedAddress;
2008         break;
2009     }
2010 
2011     return reason;
2012 }
2013 #endif
2014 
2015 
2016 #if 0
2017 ProcessMessage::CrashReason
2018 NativeProcessLinux::GetCrashReasonForSIGILL(const siginfo_t *info)
2019 {
2020     ProcessMessage::CrashReason reason;
2021     assert(info->si_signo == SIGILL);
2022 
2023     reason = ProcessMessage::eInvalidCrashReason;
2024 
2025     switch (info->si_code)
2026     {
2027     default:
2028         assert(false && "unexpected si_code for SIGILL");
2029         break;
2030     case ILL_ILLOPC:
2031         reason = ProcessMessage::eIllegalOpcode;
2032         break;
2033     case ILL_ILLOPN:
2034         reason = ProcessMessage::eIllegalOperand;
2035         break;
2036     case ILL_ILLADR:
2037         reason = ProcessMessage::eIllegalAddressingMode;
2038         break;
2039     case ILL_ILLTRP:
2040         reason = ProcessMessage::eIllegalTrap;
2041         break;
2042     case ILL_PRVOPC:
2043         reason = ProcessMessage::ePrivilegedOpcode;
2044         break;
2045     case ILL_PRVREG:
2046         reason = ProcessMessage::ePrivilegedRegister;
2047         break;
2048     case ILL_COPROC:
2049         reason = ProcessMessage::eCoprocessorError;
2050         break;
2051     case ILL_BADSTK:
2052         reason = ProcessMessage::eInternalStackError;
2053         break;
2054     }
2055 
2056     return reason;
2057 }
2058 #endif
2059 
2060 #if 0
2061 ProcessMessage::CrashReason
2062 NativeProcessLinux::GetCrashReasonForSIGFPE(const siginfo_t *info)
2063 {
2064     ProcessMessage::CrashReason reason;
2065     assert(info->si_signo == SIGFPE);
2066 
2067     reason = ProcessMessage::eInvalidCrashReason;
2068 
2069     switch (info->si_code)
2070     {
2071     default:
2072         assert(false && "unexpected si_code for SIGFPE");
2073         break;
2074     case FPE_INTDIV:
2075         reason = ProcessMessage::eIntegerDivideByZero;
2076         break;
2077     case FPE_INTOVF:
2078         reason = ProcessMessage::eIntegerOverflow;
2079         break;
2080     case FPE_FLTDIV:
2081         reason = ProcessMessage::eFloatDivideByZero;
2082         break;
2083     case FPE_FLTOVF:
2084         reason = ProcessMessage::eFloatOverflow;
2085         break;
2086     case FPE_FLTUND:
2087         reason = ProcessMessage::eFloatUnderflow;
2088         break;
2089     case FPE_FLTRES:
2090         reason = ProcessMessage::eFloatInexactResult;
2091         break;
2092     case FPE_FLTINV:
2093         reason = ProcessMessage::eFloatInvalidOperation;
2094         break;
2095     case FPE_FLTSUB:
2096         reason = ProcessMessage::eFloatSubscriptRange;
2097         break;
2098     }
2099 
2100     return reason;
2101 }
2102 #endif
2103 
2104 #if 0
2105 ProcessMessage::CrashReason
2106 NativeProcessLinux::GetCrashReasonForSIGBUS(const siginfo_t *info)
2107 {
2108     ProcessMessage::CrashReason reason;
2109     assert(info->si_signo == SIGBUS);
2110 
2111     reason = ProcessMessage::eInvalidCrashReason;
2112 
2113     switch (info->si_code)
2114     {
2115     default:
2116         assert(false && "unexpected si_code for SIGBUS");
2117         break;
2118     case BUS_ADRALN:
2119         reason = ProcessMessage::eIllegalAlignment;
2120         break;
2121     case BUS_ADRERR:
2122         reason = ProcessMessage::eIllegalAddress;
2123         break;
2124     case BUS_OBJERR:
2125         reason = ProcessMessage::eHardwareError;
2126         break;
2127     }
2128 
2129     return reason;
2130 }
2131 #endif
2132 
2133 Error
2134 NativeProcessLinux::ReadMemory (lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
2135 {
2136     if (ProcessVmReadvSupported()) {
2137         // The process_vm_readv path is about 50 times faster than ptrace api. We want to use
2138         // this syscall if it is supported.
2139 
2140         const ::pid_t pid = GetID();
2141 
2142         struct iovec local_iov, remote_iov;
2143         local_iov.iov_base = buf;
2144         local_iov.iov_len = size;
2145         remote_iov.iov_base = reinterpret_cast<void *>(addr);
2146         remote_iov.iov_len = size;
2147 
2148         bytes_read = process_vm_readv(pid, &local_iov, 1, &remote_iov, 1, 0);
2149         const bool success = bytes_read == size;
2150 
2151         Log *log(GetLogIfAllCategoriesSet (LIBLLDB_LOG_PROCESS));
2152         if (log)
2153             log->Printf ("NativeProcessLinux::%s using process_vm_readv to read %zd bytes from inferior address 0x%" PRIx64": %s",
2154                     __FUNCTION__, size, addr, success ? "Success" : strerror(errno));
2155 
2156         if (success)
2157             return Error();
2158         // else
2159         //     the call failed for some reason, let's retry the read using ptrace api.
2160     }
2161 
2162     unsigned char *dst = static_cast<unsigned char*>(buf);
2163     size_t remainder;
2164     long data;
2165 
2166     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
2167     if (log)
2168         ProcessPOSIXLog::IncNestLevel();
2169     if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
2170         log->Printf ("NativeProcessLinux::%s(%p, %p, %zd, _)", __FUNCTION__, (void*)addr, buf, size);
2171 
2172     for (bytes_read = 0; bytes_read < size; bytes_read += remainder)
2173     {
2174         Error error = NativeProcessLinux::PtraceWrapper(PTRACE_PEEKDATA, GetID(), (void*)addr, nullptr, 0, &data);
2175         if (error.Fail())
2176         {
2177             if (log)
2178                 ProcessPOSIXLog::DecNestLevel();
2179             return error;
2180         }
2181 
2182         remainder = size - bytes_read;
2183         remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2184 
2185         // Copy the data into our buffer
2186         memcpy(dst, &data, remainder);
2187 
2188         if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2189                 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2190                         (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2191                                 size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2192         {
2193             uintptr_t print_dst = 0;
2194             // Format bytes from data by moving into print_dst for log output
2195             for (unsigned i = 0; i < remainder; ++i)
2196                 print_dst |= (((data >> i*8) & 0xFF) << i*8);
2197             log->Printf ("NativeProcessLinux::%s() [0x%" PRIx64 "]:0x%" PRIx64 " (0x%" PRIx64 ")",
2198                     __FUNCTION__, addr, uint64_t(print_dst), uint64_t(data));
2199         }
2200         addr += k_ptrace_word_size;
2201         dst += k_ptrace_word_size;
2202     }
2203 
2204     if (log)
2205         ProcessPOSIXLog::DecNestLevel();
2206     return Error();
2207 }
2208 
2209 Error
2210 NativeProcessLinux::ReadMemoryWithoutTrap(lldb::addr_t addr, void *buf, size_t size, size_t &bytes_read)
2211 {
2212     Error error = ReadMemory(addr, buf, size, bytes_read);
2213     if (error.Fail()) return error;
2214     return m_breakpoint_list.RemoveTrapsFromBuffer(addr, buf, size);
2215 }
2216 
2217 Error
2218 NativeProcessLinux::WriteMemory(lldb::addr_t addr, const void *buf, size_t size, size_t &bytes_written)
2219 {
2220     const unsigned char *src = static_cast<const unsigned char*>(buf);
2221     size_t remainder;
2222     Error error;
2223 
2224     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
2225     if (log)
2226         ProcessPOSIXLog::IncNestLevel();
2227     if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
2228         log->Printf ("NativeProcessLinux::%s(0x%" PRIx64 ", %p, %zu)", __FUNCTION__, addr, buf, size);
2229 
2230     for (bytes_written = 0; bytes_written < size; bytes_written += remainder)
2231     {
2232         remainder = size - bytes_written;
2233         remainder = remainder > k_ptrace_word_size ? k_ptrace_word_size : remainder;
2234 
2235         if (remainder == k_ptrace_word_size)
2236         {
2237             unsigned long data = 0;
2238             memcpy(&data, src, k_ptrace_word_size);
2239 
2240             if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2241                     (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2242                             (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2243                                     size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2244                 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2245                         (void*)addr, *(const unsigned long*)src, data);
2246 
2247             error = NativeProcessLinux::PtraceWrapper(PTRACE_POKEDATA, GetID(), (void*)addr, (void*)data);
2248             if (error.Fail())
2249             {
2250                 if (log)
2251                     ProcessPOSIXLog::DecNestLevel();
2252                 return error;
2253             }
2254         }
2255         else
2256         {
2257             unsigned char buff[8];
2258             size_t bytes_read;
2259             error = ReadMemory(addr, buff, k_ptrace_word_size, bytes_read);
2260             if (error.Fail())
2261             {
2262                 if (log)
2263                     ProcessPOSIXLog::DecNestLevel();
2264                 return error;
2265             }
2266 
2267             memcpy(buff, src, remainder);
2268 
2269             size_t bytes_written_rec;
2270             error = WriteMemory(addr, buff, k_ptrace_word_size, bytes_written_rec);
2271             if (error.Fail())
2272             {
2273                 if (log)
2274                     ProcessPOSIXLog::DecNestLevel();
2275                 return error;
2276             }
2277 
2278             if (log && ProcessPOSIXLog::AtTopNestLevel() &&
2279                     (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
2280                             (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
2281                                     size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
2282                 log->Printf ("NativeProcessLinux::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
2283                         (void*)addr, *(const unsigned long*)src, *(unsigned long*)buff);
2284         }
2285 
2286         addr += k_ptrace_word_size;
2287         src += k_ptrace_word_size;
2288     }
2289     if (log)
2290         ProcessPOSIXLog::DecNestLevel();
2291     return error;
2292 }
2293 
2294 Error
2295 NativeProcessLinux::GetSignalInfo(lldb::tid_t tid, void *siginfo)
2296 {
2297     return PtraceWrapper(PTRACE_GETSIGINFO, tid, nullptr, siginfo);
2298 }
2299 
2300 Error
2301 NativeProcessLinux::GetEventMessage(lldb::tid_t tid, unsigned long *message)
2302 {
2303     return PtraceWrapper(PTRACE_GETEVENTMSG, tid, nullptr, message);
2304 }
2305 
2306 Error
2307 NativeProcessLinux::Detach(lldb::tid_t tid)
2308 {
2309     if (tid == LLDB_INVALID_THREAD_ID)
2310         return Error();
2311 
2312     return PtraceWrapper(PTRACE_DETACH, tid);
2313 }
2314 
2315 bool
2316 NativeProcessLinux::HasThreadNoLock (lldb::tid_t thread_id)
2317 {
2318     for (auto thread_sp : m_threads)
2319     {
2320         assert (thread_sp && "thread list should not contain NULL threads");
2321         if (thread_sp->GetID () == thread_id)
2322         {
2323             // We have this thread.
2324             return true;
2325         }
2326     }
2327 
2328     // We don't have this thread.
2329     return false;
2330 }
2331 
2332 bool
2333 NativeProcessLinux::StopTrackingThread (lldb::tid_t thread_id)
2334 {
2335     Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2336 
2337     if (log)
2338         log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread_id);
2339 
2340     bool found = false;
2341 
2342     for (auto it = m_threads.begin (); it != m_threads.end (); ++it)
2343     {
2344         if (*it && ((*it)->GetID () == thread_id))
2345         {
2346             m_threads.erase (it);
2347             found = true;
2348             break;
2349         }
2350     }
2351 
2352     SignalIfAllThreadsStopped();
2353 
2354     return found;
2355 }
2356 
2357 NativeThreadLinuxSP
2358 NativeProcessLinux::AddThread (lldb::tid_t thread_id)
2359 {
2360     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD));
2361 
2362     if (log)
2363     {
2364         log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " adding thread with tid %" PRIu64,
2365                 __FUNCTION__,
2366                 GetID (),
2367                 thread_id);
2368     }
2369 
2370     assert (!HasThreadNoLock (thread_id) && "attempted to add a thread by id that already exists");
2371 
2372     // If this is the first thread, save it as the current thread
2373     if (m_threads.empty ())
2374         SetCurrentThreadID (thread_id);
2375 
2376     auto thread_sp = std::make_shared<NativeThreadLinux>(this, thread_id);
2377     m_threads.push_back (thread_sp);
2378     return thread_sp;
2379 }
2380 
2381 Error
2382 NativeProcessLinux::FixupBreakpointPCAsNeeded(NativeThreadLinux &thread)
2383 {
2384     Log *log (GetLogIfAllCategoriesSet (LIBLLDB_LOG_BREAKPOINTS));
2385 
2386     Error error;
2387 
2388     // Find out the size of a breakpoint (might depend on where we are in the code).
2389     NativeRegisterContextSP context_sp = thread.GetRegisterContext();
2390     if (!context_sp)
2391     {
2392         error.SetErrorString ("cannot get a NativeRegisterContext for the thread");
2393         if (log)
2394             log->Printf ("NativeProcessLinux::%s failed: %s", __FUNCTION__, error.AsCString ());
2395         return error;
2396     }
2397 
2398     uint32_t breakpoint_size = 0;
2399     error = GetSoftwareBreakpointPCOffset(breakpoint_size);
2400     if (error.Fail ())
2401     {
2402         if (log)
2403             log->Printf ("NativeProcessLinux::%s GetBreakpointSize() failed: %s", __FUNCTION__, error.AsCString ());
2404         return error;
2405     }
2406     else
2407     {
2408         if (log)
2409             log->Printf ("NativeProcessLinux::%s breakpoint size: %" PRIu32, __FUNCTION__, breakpoint_size);
2410     }
2411 
2412     // First try probing for a breakpoint at a software breakpoint location: PC - breakpoint size.
2413     const lldb::addr_t initial_pc_addr = context_sp->GetPCfromBreakpointLocation ();
2414     lldb::addr_t breakpoint_addr = initial_pc_addr;
2415     if (breakpoint_size > 0)
2416     {
2417         // Do not allow breakpoint probe to wrap around.
2418         if (breakpoint_addr >= breakpoint_size)
2419             breakpoint_addr -= breakpoint_size;
2420     }
2421 
2422     // Check if we stopped because of a breakpoint.
2423     NativeBreakpointSP breakpoint_sp;
2424     error = m_breakpoint_list.GetBreakpoint (breakpoint_addr, breakpoint_sp);
2425     if (!error.Success () || !breakpoint_sp)
2426     {
2427         // We didn't find one at a software probe location.  Nothing to do.
2428         if (log)
2429             log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " no lldb breakpoint found at current pc with adjustment: 0x%" PRIx64, __FUNCTION__, GetID (), breakpoint_addr);
2430         return Error ();
2431     }
2432 
2433     // If the breakpoint is not a software breakpoint, nothing to do.
2434     if (!breakpoint_sp->IsSoftwareBreakpoint ())
2435     {
2436         if (log)
2437             log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", not software, nothing to adjust", __FUNCTION__, GetID (), breakpoint_addr);
2438         return Error ();
2439     }
2440 
2441     //
2442     // We have a software breakpoint and need to adjust the PC.
2443     //
2444 
2445     // Sanity check.
2446     if (breakpoint_size == 0)
2447     {
2448         // Nothing to do!  How did we get here?
2449         if (log)
2450             log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " breakpoint found at 0x%" PRIx64 ", it is software, but the size is zero, nothing to do (unexpected)", __FUNCTION__, GetID (), breakpoint_addr);
2451         return Error ();
2452     }
2453 
2454     // Change the program counter.
2455     if (log)
2456         log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": changing PC from 0x%" PRIx64 " to 0x%" PRIx64, __FUNCTION__, GetID(), thread.GetID(), initial_pc_addr, breakpoint_addr);
2457 
2458     error = context_sp->SetPC (breakpoint_addr);
2459     if (error.Fail ())
2460     {
2461         if (log)
2462             log->Printf ("NativeProcessLinux::%s pid %" PRIu64 " tid %" PRIu64 ": failed to set PC: %s", __FUNCTION__, GetID(), thread.GetID(), error.AsCString ());
2463         return error;
2464     }
2465 
2466     return error;
2467 }
2468 
2469 Error
2470 NativeProcessLinux::GetLoadedModuleFileSpec(const char* module_path, FileSpec& file_spec)
2471 {
2472     FileSpec module_file_spec(module_path, true);
2473 
2474     bool found = false;
2475     file_spec.Clear();
2476     ProcFileReader::ProcessLineByLine(GetID(), "maps",
2477         [&] (const std::string &line)
2478         {
2479             SmallVector<StringRef, 16> columns;
2480             StringRef(line).split(columns, " ", -1, false);
2481             if (columns.size() < 6)
2482                 return true; // continue searching
2483 
2484             FileSpec this_file_spec(columns[5].str().c_str(), false);
2485             if (this_file_spec.GetFilename() != module_file_spec.GetFilename())
2486                 return true; // continue searching
2487 
2488             file_spec = this_file_spec;
2489             found = true;
2490             return false; // we are done
2491         });
2492 
2493     if (! found)
2494         return Error("Module file (%s) not found in /proc/%" PRIu64 "/maps file!",
2495                 module_file_spec.GetFilename().AsCString(), GetID());
2496 
2497     return Error();
2498 }
2499 
2500 Error
2501 NativeProcessLinux::GetFileLoadAddress(const llvm::StringRef& file_name, lldb::addr_t& load_addr)
2502 {
2503     load_addr = LLDB_INVALID_ADDRESS;
2504     Error error = ProcFileReader::ProcessLineByLine (GetID (), "maps",
2505         [&] (const std::string &line) -> bool
2506         {
2507             StringRef maps_row(line);
2508 
2509             SmallVector<StringRef, 16> maps_columns;
2510             maps_row.split(maps_columns, StringRef(" "), -1, false);
2511 
2512             if (maps_columns.size() < 6)
2513             {
2514                 // Return true to continue reading the proc file
2515                 return true;
2516             }
2517 
2518             if (maps_columns[5] == file_name)
2519             {
2520                 StringExtractor addr_extractor(maps_columns[0].str().c_str());
2521                 load_addr = addr_extractor.GetHexMaxU64(false, LLDB_INVALID_ADDRESS);
2522 
2523                 // Return false to stop reading the proc file further
2524                 return false;
2525             }
2526 
2527             // Return true to continue reading the proc file
2528             return true;
2529         });
2530     return error;
2531 }
2532 
2533 NativeThreadLinuxSP
2534 NativeProcessLinux::GetThreadByID(lldb::tid_t tid)
2535 {
2536     return std::static_pointer_cast<NativeThreadLinux>(NativeProcessProtocol::GetThreadByID(tid));
2537 }
2538 
2539 Error
2540 NativeProcessLinux::ResumeThread(NativeThreadLinux &thread, lldb::StateType state, int signo)
2541 {
2542     Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2543 
2544     if (log)
2545         log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")",
2546                 __FUNCTION__, thread.GetID());
2547 
2548     // Before we do the resume below, first check if we have a pending
2549     // stop notification that is currently waiting for
2550     // all threads to stop.  This is potentially a buggy situation since
2551     // we're ostensibly waiting for threads to stop before we send out the
2552     // pending notification, and here we are resuming one before we send
2553     // out the pending stop notification.
2554     if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && log)
2555     {
2556         log->Printf("NativeProcessLinux::%s about to resume tid %" PRIu64 " per explicit request but we have a pending stop notification (tid %" PRIu64 ") that is actively waiting for this thread to stop. Valid sequence of events?", __FUNCTION__, thread.GetID(), m_pending_notification_tid);
2557     }
2558 
2559     // Request a resume.  We expect this to be synchronous and the system
2560     // to reflect it is running after this completes.
2561     switch (state)
2562     {
2563     case eStateRunning:
2564     {
2565         const auto resume_result = thread.Resume(signo);
2566         if (resume_result.Success())
2567             SetState(eStateRunning, true);
2568         return resume_result;
2569     }
2570     case eStateStepping:
2571     {
2572         const auto step_result = thread.SingleStep(signo);
2573         if (step_result.Success())
2574             SetState(eStateRunning, true);
2575         return step_result;
2576     }
2577     default:
2578         if (log)
2579             log->Printf("NativeProcessLinux::%s Unhandled state %s.",
2580                     __FUNCTION__, StateAsCString(state));
2581         llvm_unreachable("Unhandled state for resume");
2582     }
2583 }
2584 
2585 //===----------------------------------------------------------------------===//
2586 
2587 void
2588 NativeProcessLinux::StopRunningThreads(const lldb::tid_t triggering_tid)
2589 {
2590     Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2591 
2592     if (log)
2593     {
2594         log->Printf("NativeProcessLinux::%s about to process event: (triggering_tid: %" PRIu64 ")",
2595                 __FUNCTION__, triggering_tid);
2596     }
2597 
2598     m_pending_notification_tid = triggering_tid;
2599 
2600     // Request a stop for all the thread stops that need to be stopped
2601     // and are not already known to be stopped.
2602     for (const auto &thread_sp: m_threads)
2603     {
2604         if (StateIsRunningState(thread_sp->GetState()))
2605             static_pointer_cast<NativeThreadLinux>(thread_sp)->RequestStop();
2606     }
2607 
2608     SignalIfAllThreadsStopped();
2609 
2610     if (log)
2611     {
2612         log->Printf("NativeProcessLinux::%s event processing done", __FUNCTION__);
2613     }
2614 }
2615 
2616 void
2617 NativeProcessLinux::SignalIfAllThreadsStopped()
2618 {
2619     if (m_pending_notification_tid == LLDB_INVALID_THREAD_ID)
2620         return; // No pending notification. Nothing to do.
2621 
2622     for (const auto &thread_sp: m_threads)
2623     {
2624         if (StateIsRunningState(thread_sp->GetState()))
2625             return; // Some threads are still running. Don't signal yet.
2626     }
2627 
2628     // We have a pending notification and all threads have stopped.
2629     Log *log(GetLogIfAnyCategoriesSet(LIBLLDB_LOG_PROCESS | LIBLLDB_LOG_BREAKPOINTS));
2630 
2631     // Clear any temporary breakpoints we used to implement software single stepping.
2632     for (const auto &thread_info: m_threads_stepping_with_breakpoint)
2633     {
2634         Error error = RemoveBreakpoint (thread_info.second);
2635         if (error.Fail())
2636             if (log)
2637                 log->Printf("NativeProcessLinux::%s() pid = %" PRIu64 " remove stepping breakpoint: %s",
2638                         __FUNCTION__, thread_info.first, error.AsCString());
2639     }
2640     m_threads_stepping_with_breakpoint.clear();
2641 
2642     // Notify the delegate about the stop
2643     SetCurrentThreadID(m_pending_notification_tid);
2644     SetState(StateType::eStateStopped, true);
2645     m_pending_notification_tid = LLDB_INVALID_THREAD_ID;
2646 }
2647 
2648 void
2649 NativeProcessLinux::ThreadWasCreated(NativeThreadLinux &thread)
2650 {
2651     Log *const log = GetLogIfAllCategoriesSet (LIBLLDB_LOG_THREAD);
2652 
2653     if (log)
2654         log->Printf("NativeProcessLinux::%s (tid: %" PRIu64 ")", __FUNCTION__, thread.GetID());
2655 
2656     if (m_pending_notification_tid != LLDB_INVALID_THREAD_ID && StateIsRunningState(thread.GetState()))
2657     {
2658         // We will need to wait for this new thread to stop as well before firing the
2659         // notification.
2660         thread.RequestStop();
2661     }
2662 }
2663 
2664 void
2665 NativeProcessLinux::SigchldHandler()
2666 {
2667     Log *log(GetLogIfAllCategoriesSet(LIBLLDB_LOG_PROCESS));
2668     // Process all pending waitpid notifications.
2669     while (true)
2670     {
2671         int status = -1;
2672         ::pid_t wait_pid = waitpid(-1, &status, __WALL | __WNOTHREAD | WNOHANG);
2673 
2674         if (wait_pid == 0)
2675             break; // We are done.
2676 
2677         if (wait_pid == -1)
2678         {
2679             if (errno == EINTR)
2680                 continue;
2681 
2682             Error error(errno, eErrorTypePOSIX);
2683             if (log)
2684                 log->Printf("NativeProcessLinux::%s waitpid (-1, &status, __WALL | __WNOTHREAD | WNOHANG) failed: %s",
2685                         __FUNCTION__, error.AsCString());
2686             break;
2687         }
2688 
2689         bool exited = false;
2690         int signal = 0;
2691         int exit_status = 0;
2692         const char *status_cstr = nullptr;
2693         if (WIFSTOPPED(status))
2694         {
2695             signal = WSTOPSIG(status);
2696             status_cstr = "STOPPED";
2697         }
2698         else if (WIFEXITED(status))
2699         {
2700             exit_status = WEXITSTATUS(status);
2701             status_cstr = "EXITED";
2702             exited = true;
2703         }
2704         else if (WIFSIGNALED(status))
2705         {
2706             signal = WTERMSIG(status);
2707             status_cstr = "SIGNALED";
2708             if (wait_pid == static_cast< ::pid_t>(GetID())) {
2709                 exited = true;
2710                 exit_status = -1;
2711             }
2712         }
2713         else
2714             status_cstr = "(\?\?\?)";
2715 
2716         if (log)
2717             log->Printf("NativeProcessLinux::%s: waitpid (-1, &status, __WALL | __WNOTHREAD | WNOHANG)"
2718                 "=> pid = %" PRIi32 ", status = 0x%8.8x (%s), signal = %i, exit_state = %i",
2719                 __FUNCTION__, wait_pid, status, status_cstr, signal, exit_status);
2720 
2721         MonitorCallback (wait_pid, exited, signal, exit_status);
2722     }
2723 }
2724 
2725 // Wrapper for ptrace to catch errors and log calls.
2726 // Note that ptrace sets errno on error because -1 can be a valid result (i.e. for PTRACE_PEEK*)
2727 Error
2728 NativeProcessLinux::PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size, long *result)
2729 {
2730     Error error;
2731     long int ret;
2732 
2733     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PTRACE));
2734 
2735     PtraceDisplayBytes(req, data, data_size);
2736 
2737     errno = 0;
2738     if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
2739         ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), *(unsigned int *)addr, data);
2740     else
2741         ret = ptrace(static_cast<__ptrace_request>(req), static_cast< ::pid_t>(pid), addr, data);
2742 
2743     if (ret == -1)
2744         error.SetErrorToErrno();
2745 
2746     if (result)
2747         *result = ret;
2748 
2749     if (log)
2750         log->Printf("ptrace(%d, %" PRIu64 ", %p, %p, %zu)=%lX", req, pid, addr, data, data_size, ret);
2751 
2752     PtraceDisplayBytes(req, data, data_size);
2753 
2754     if (log && error.GetError() != 0)
2755     {
2756         const char* str;
2757         switch (error.GetError())
2758         {
2759         case ESRCH:  str = "ESRCH"; break;
2760         case EINVAL: str = "EINVAL"; break;
2761         case EBUSY:  str = "EBUSY"; break;
2762         case EPERM:  str = "EPERM"; break;
2763         default:     str = error.AsCString();
2764         }
2765         log->Printf("ptrace() failed; errno=%d (%s)", error.GetError(), str);
2766     }
2767 
2768     return error;
2769 }
2770