1 //===-- ProcessMonitor.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 "lldb/lldb-python.h"
11 
12 // C Includes
13 #include <errno.h>
14 #include <poll.h>
15 #include <string.h>
16 #include <stdint.h>
17 #include <unistd.h>
18 #include <sys/ptrace.h>
19 #include <sys/socket.h>
20 #include <sys/syscall.h>
21 #include <sys/types.h>
22 #include <sys/wait.h>
23 
24 // C++ Includes
25 // Other libraries and framework includes
26 #include "lldb/Core/Debugger.h"
27 #include "lldb/Core/Error.h"
28 #include "lldb/Core/RegisterValue.h"
29 #include "lldb/Core/Scalar.h"
30 #include "lldb/Host/Host.h"
31 #include "lldb/Target/Thread.h"
32 #include "lldb/Target/RegisterContext.h"
33 #include "lldb/Utility/PseudoTerminal.h"
34 
35 #include "POSIXThread.h"
36 #include "ProcessLinux.h"
37 #include "ProcessPOSIXLog.h"
38 #include "ProcessMonitor.h"
39 
40 
41 #define DEBUG_PTRACE_MAXBYTES 20
42 
43 // Support ptrace extensions even when compiled without required kernel support
44 #ifndef PTRACE_GETREGSET
45   #define PTRACE_GETREGSET 0x4204
46 #endif
47 #ifndef PTRACE_SETREGSET
48   #define PTRACE_SETREGSET 0x4205
49 #endif
50 
51 // Support hardware breakpoints in case it has not been defined
52 #ifndef TRAP_HWBKPT
53   #define TRAP_HWBKPT 4
54 #endif
55 
56 // Try to define a macro to encapsulate the tgkill syscall
57 // fall back on kill() if tgkill isn't available
58 #define tgkill(pid, tid, sig)  syscall(SYS_tgkill, pid, tid, sig)
59 
60 using namespace lldb_private;
61 
62 // FIXME: this code is host-dependent with respect to types and
63 // endianness and needs to be fixed.  For example, lldb::addr_t is
64 // hard-coded to uint64_t, but on a 32-bit Linux host, ptrace requires
65 // 32-bit pointer arguments.  This code uses casts to work around the
66 // problem.
67 
68 // We disable the tracing of ptrace calls for integration builds to
69 // avoid the additional indirection and checks.
70 #ifndef LLDB_CONFIGURATION_BUILDANDINTEGRATION
71 
72 static void
DisplayBytes(lldb_private::StreamString & s,void * bytes,uint32_t count)73 DisplayBytes (lldb_private::StreamString &s, void *bytes, uint32_t count)
74 {
75     uint8_t *ptr = (uint8_t *)bytes;
76     const uint32_t loop_count = std::min<uint32_t>(DEBUG_PTRACE_MAXBYTES, count);
77     for(uint32_t i=0; i<loop_count; i++)
78     {
79         s.Printf ("[%x]", *ptr);
80         ptr++;
81     }
82 }
83 
PtraceDisplayBytes(int & req,void * data,size_t data_size)84 static void PtraceDisplayBytes(int &req, void *data, size_t data_size)
85 {
86     StreamString buf;
87     Log *verbose_log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (
88                                         POSIX_LOG_PTRACE | POSIX_LOG_VERBOSE));
89 
90     if (verbose_log)
91     {
92         switch(req)
93         {
94         case PTRACE_POKETEXT:
95             {
96                 DisplayBytes(buf, &data, 8);
97                 verbose_log->Printf("PTRACE_POKETEXT %s", buf.GetData());
98                 break;
99             }
100         case PTRACE_POKEDATA:
101             {
102                 DisplayBytes(buf, &data, 8);
103                 verbose_log->Printf("PTRACE_POKEDATA %s", buf.GetData());
104                 break;
105             }
106         case PTRACE_POKEUSER:
107             {
108                 DisplayBytes(buf, &data, 8);
109                 verbose_log->Printf("PTRACE_POKEUSER %s", buf.GetData());
110                 break;
111             }
112         case PTRACE_SETREGS:
113             {
114                 DisplayBytes(buf, data, data_size);
115                 verbose_log->Printf("PTRACE_SETREGS %s", buf.GetData());
116                 break;
117             }
118         case PTRACE_SETFPREGS:
119             {
120                 DisplayBytes(buf, data, data_size);
121                 verbose_log->Printf("PTRACE_SETFPREGS %s", buf.GetData());
122                 break;
123             }
124         case PTRACE_SETSIGINFO:
125             {
126                 DisplayBytes(buf, data, sizeof(siginfo_t));
127                 verbose_log->Printf("PTRACE_SETSIGINFO %s", buf.GetData());
128                 break;
129             }
130         case PTRACE_SETREGSET:
131             {
132                 // Extract iov_base from data, which is a pointer to the struct IOVEC
133                 DisplayBytes(buf, *(void **)data, data_size);
134                 verbose_log->Printf("PTRACE_SETREGSET %s", buf.GetData());
135                 break;
136             }
137         default:
138             {
139             }
140         }
141     }
142 }
143 
144 // Wrapper for ptrace to catch errors and log calls.
145 // Note that ptrace sets errno on error because -1 can be a valid result (i.e. for PTRACE_PEEK*)
146 extern long
PtraceWrapper(int req,lldb::pid_t pid,void * addr,void * data,size_t data_size,const char * reqName,const char * file,int line)147 PtraceWrapper(int req, lldb::pid_t pid, void *addr, void *data, size_t data_size,
148               const char* reqName, const char* file, int line)
149 {
150     long int result;
151 
152     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PTRACE));
153 
154     if (log)
155         log->Printf("ptrace(%s, %lu, %p, %p, %zu) called from file %s line %d",
156                     reqName, pid, addr, data, data_size, file, line);
157 
158     PtraceDisplayBytes(req, data, data_size);
159 
160     errno = 0;
161     if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
162         result = ptrace(static_cast<__ptrace_request>(req), pid, *(unsigned int *)addr, data);
163     else
164         result = ptrace(static_cast<__ptrace_request>(req), pid, addr, data);
165 
166     PtraceDisplayBytes(req, data, data_size);
167 
168     if (log && errno != 0)
169     {
170         const char* str;
171         switch (errno)
172         {
173         case ESRCH:  str = "ESRCH"; break;
174         case EINVAL: str = "EINVAL"; break;
175         case EBUSY:  str = "EBUSY"; break;
176         case EPERM:  str = "EPERM"; break;
177         default:     str = "<unknown>";
178         }
179         log->Printf("ptrace() failed; errno=%d (%s)", errno, str);
180     }
181 
182     return result;
183 }
184 
185 // Wrapper for ptrace when logging is not required.
186 // Sets errno to 0 prior to calling ptrace.
187 extern long
PtraceWrapper(int req,pid_t pid,void * addr,void * data,size_t data_size)188 PtraceWrapper(int req, pid_t pid, void *addr, void *data, size_t data_size)
189 {
190     long result = 0;
191     errno = 0;
192     if (req == PTRACE_GETREGSET || req == PTRACE_SETREGSET)
193         result = ptrace(static_cast<__ptrace_request>(req), pid, *(unsigned int *)addr, data);
194     else
195         result = ptrace(static_cast<__ptrace_request>(req), pid, addr, data);
196     return result;
197 }
198 
199 #define PTRACE(req, pid, addr, data, data_size) \
200     PtraceWrapper((req), (pid), (addr), (data), (data_size), #req, __FILE__, __LINE__)
201 #else
202     PtraceWrapper((req), (pid), (addr), (data), (data_size))
203 #endif
204 
205 //------------------------------------------------------------------------------
206 // Static implementations of ProcessMonitor::ReadMemory and
207 // ProcessMonitor::WriteMemory.  This enables mutual recursion between these
208 // functions without needed to go thru the thread funnel.
209 
210 static size_t
DoReadMemory(lldb::pid_t pid,lldb::addr_t vm_addr,void * buf,size_t size,Error & error)211 DoReadMemory(lldb::pid_t pid,
212              lldb::addr_t vm_addr, void *buf, size_t size, Error &error)
213 {
214     // ptrace word size is determined by the host, not the child
215     static const unsigned word_size = sizeof(void*);
216     unsigned char *dst = static_cast<unsigned char*>(buf);
217     size_t bytes_read;
218     size_t remainder;
219     long data;
220 
221     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
222     if (log)
223         ProcessPOSIXLog::IncNestLevel();
224     if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
225         log->Printf ("ProcessMonitor::%s(%" PRIu64 ", %d, %p, %p, %zd, _)", __FUNCTION__,
226                      pid, word_size, (void*)vm_addr, buf, size);
227 
228     assert(sizeof(data) >= word_size);
229     for (bytes_read = 0; bytes_read < size; bytes_read += remainder)
230     {
231         errno = 0;
232         data = PTRACE(PTRACE_PEEKDATA, pid, (void*)vm_addr, NULL, 0);
233         if (errno)
234         {
235             error.SetErrorToErrno();
236             if (log)
237                 ProcessPOSIXLog::DecNestLevel();
238             return bytes_read;
239         }
240 
241         remainder = size - bytes_read;
242         remainder = remainder > word_size ? word_size : remainder;
243 
244         // Copy the data into our buffer
245         for (unsigned i = 0; i < remainder; ++i)
246             dst[i] = ((data >> i*8) & 0xFF);
247 
248         if (log && ProcessPOSIXLog::AtTopNestLevel() &&
249             (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
250              (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
251               size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
252             {
253                 uintptr_t print_dst = 0;
254                 // Format bytes from data by moving into print_dst for log output
255                 for (unsigned i = 0; i < remainder; ++i)
256                     print_dst |= (((data >> i*8) & 0xFF) << i*8);
257                 log->Printf ("ProcessMonitor::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
258                              (void*)vm_addr, print_dst, (unsigned long)data);
259             }
260 
261         vm_addr += word_size;
262         dst += word_size;
263     }
264 
265     if (log)
266         ProcessPOSIXLog::DecNestLevel();
267     return bytes_read;
268 }
269 
270 static size_t
DoWriteMemory(lldb::pid_t pid,lldb::addr_t vm_addr,const void * buf,size_t size,Error & error)271 DoWriteMemory(lldb::pid_t pid,
272               lldb::addr_t vm_addr, const void *buf, size_t size, Error &error)
273 {
274     // ptrace word size is determined by the host, not the child
275     static const unsigned word_size = sizeof(void*);
276     const unsigned char *src = static_cast<const unsigned char*>(buf);
277     size_t bytes_written = 0;
278     size_t remainder;
279 
280     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_ALL));
281     if (log)
282         ProcessPOSIXLog::IncNestLevel();
283     if (log && ProcessPOSIXLog::AtTopNestLevel() && log->GetMask().Test(POSIX_LOG_MEMORY))
284         log->Printf ("ProcessMonitor::%s(%" PRIu64 ", %d, %p, %p, %zd, _)", __FUNCTION__,
285                      pid, word_size, (void*)vm_addr, buf, size);
286 
287     for (bytes_written = 0; bytes_written < size; bytes_written += remainder)
288     {
289         remainder = size - bytes_written;
290         remainder = remainder > word_size ? word_size : remainder;
291 
292         if (remainder == word_size)
293         {
294             unsigned long data = 0;
295             assert(sizeof(data) >= word_size);
296             for (unsigned i = 0; i < word_size; ++i)
297                 data |= (unsigned long)src[i] << i*8;
298 
299             if (log && ProcessPOSIXLog::AtTopNestLevel() &&
300                 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
301                  (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
302                   size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
303                  log->Printf ("ProcessMonitor::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
304                               (void*)vm_addr, *(unsigned long*)src, data);
305 
306             if (PTRACE(PTRACE_POKEDATA, pid, (void*)vm_addr, (void*)data, 0))
307             {
308                 error.SetErrorToErrno();
309                 if (log)
310                     ProcessPOSIXLog::DecNestLevel();
311                 return bytes_written;
312             }
313         }
314         else
315         {
316             unsigned char buff[8];
317             if (DoReadMemory(pid, vm_addr,
318                              buff, word_size, error) != word_size)
319             {
320                 if (log)
321                     ProcessPOSIXLog::DecNestLevel();
322                 return bytes_written;
323             }
324 
325             memcpy(buff, src, remainder);
326 
327             if (DoWriteMemory(pid, vm_addr,
328                               buff, word_size, error) != word_size)
329             {
330                 if (log)
331                     ProcessPOSIXLog::DecNestLevel();
332                 return bytes_written;
333             }
334 
335             if (log && ProcessPOSIXLog::AtTopNestLevel() &&
336                 (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_LONG) ||
337                  (log->GetMask().Test(POSIX_LOG_MEMORY_DATA_SHORT) &&
338                   size <= POSIX_LOG_MEMORY_SHORT_BYTES)))
339                  log->Printf ("ProcessMonitor::%s() [%p]:0x%lx (0x%lx)", __FUNCTION__,
340                               (void*)vm_addr, *(unsigned long*)src, *(unsigned long*)buff);
341         }
342 
343         vm_addr += word_size;
344         src += word_size;
345     }
346     if (log)
347         ProcessPOSIXLog::DecNestLevel();
348     return bytes_written;
349 }
350 
351 // Simple helper function to ensure flags are enabled on the given file
352 // descriptor.
353 static bool
EnsureFDFlags(int fd,int flags,Error & error)354 EnsureFDFlags(int fd, int flags, Error &error)
355 {
356     int status;
357 
358     if ((status = fcntl(fd, F_GETFL)) == -1)
359     {
360         error.SetErrorToErrno();
361         return false;
362     }
363 
364     if (fcntl(fd, F_SETFL, status | flags) == -1)
365     {
366         error.SetErrorToErrno();
367         return false;
368     }
369 
370     return true;
371 }
372 
373 //------------------------------------------------------------------------------
374 /// @class Operation
375 /// @brief Represents a ProcessMonitor operation.
376 ///
377 /// Under Linux, it is not possible to ptrace() from any other thread but the
378 /// one that spawned or attached to the process from the start.  Therefore, when
379 /// a ProcessMonitor is asked to deliver or change the state of an inferior
380 /// process the operation must be "funneled" to a specific thread to perform the
381 /// task.  The Operation class provides an abstract base for all services the
382 /// ProcessMonitor must perform via the single virtual function Execute, thus
383 /// encapsulating the code that needs to run in the privileged context.
384 class Operation
385 {
386 public:
~Operation()387     virtual ~Operation() {}
388     virtual void Execute(ProcessMonitor *monitor) = 0;
389 };
390 
391 //------------------------------------------------------------------------------
392 /// @class ReadOperation
393 /// @brief Implements ProcessMonitor::ReadMemory.
394 class ReadOperation : public Operation
395 {
396 public:
ReadOperation(lldb::addr_t addr,void * buff,size_t size,Error & error,size_t & result)397     ReadOperation(lldb::addr_t addr, void *buff, size_t size,
398                   Error &error, size_t &result)
399         : m_addr(addr), m_buff(buff), m_size(size),
400           m_error(error), m_result(result)
401         { }
402 
403     void Execute(ProcessMonitor *monitor);
404 
405 private:
406     lldb::addr_t m_addr;
407     void *m_buff;
408     size_t m_size;
409     Error &m_error;
410     size_t &m_result;
411 };
412 
413 void
Execute(ProcessMonitor * monitor)414 ReadOperation::Execute(ProcessMonitor *monitor)
415 {
416     lldb::pid_t pid = monitor->GetPID();
417 
418     m_result = DoReadMemory(pid, m_addr, m_buff, m_size, m_error);
419 }
420 
421 //------------------------------------------------------------------------------
422 /// @class WriteOperation
423 /// @brief Implements ProcessMonitor::WriteMemory.
424 class WriteOperation : public Operation
425 {
426 public:
WriteOperation(lldb::addr_t addr,const void * buff,size_t size,Error & error,size_t & result)427     WriteOperation(lldb::addr_t addr, const void *buff, size_t size,
428                    Error &error, size_t &result)
429         : m_addr(addr), m_buff(buff), m_size(size),
430           m_error(error), m_result(result)
431         { }
432 
433     void Execute(ProcessMonitor *monitor);
434 
435 private:
436     lldb::addr_t m_addr;
437     const void *m_buff;
438     size_t m_size;
439     Error &m_error;
440     size_t &m_result;
441 };
442 
443 void
Execute(ProcessMonitor * monitor)444 WriteOperation::Execute(ProcessMonitor *monitor)
445 {
446     lldb::pid_t pid = monitor->GetPID();
447 
448     m_result = DoWriteMemory(pid, m_addr, m_buff, m_size, m_error);
449 }
450 
451 
452 //------------------------------------------------------------------------------
453 /// @class ReadRegOperation
454 /// @brief Implements ProcessMonitor::ReadRegisterValue.
455 class ReadRegOperation : public Operation
456 {
457 public:
ReadRegOperation(lldb::tid_t tid,unsigned offset,const char * reg_name,RegisterValue & value,bool & result)458     ReadRegOperation(lldb::tid_t tid, unsigned offset, const char *reg_name,
459                      RegisterValue &value, bool &result)
460         : m_tid(tid), m_offset(offset), m_reg_name(reg_name),
461           m_value(value), m_result(result)
462         { }
463 
464     void Execute(ProcessMonitor *monitor);
465 
466 private:
467     lldb::tid_t m_tid;
468     uintptr_t m_offset;
469     const char *m_reg_name;
470     RegisterValue &m_value;
471     bool &m_result;
472 };
473 
474 void
Execute(ProcessMonitor * monitor)475 ReadRegOperation::Execute(ProcessMonitor *monitor)
476 {
477     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS));
478 
479     // Set errno to zero so that we can detect a failed peek.
480     errno = 0;
481     lldb::addr_t data = PTRACE(PTRACE_PEEKUSER, m_tid, (void*)m_offset, NULL, 0);
482     if (errno)
483         m_result = false;
484     else
485     {
486         m_value = data;
487         m_result = true;
488     }
489     if (log)
490         log->Printf ("ProcessMonitor::%s() reg %s: 0x%" PRIx64, __FUNCTION__,
491                      m_reg_name, data);
492 }
493 
494 //------------------------------------------------------------------------------
495 /// @class WriteRegOperation
496 /// @brief Implements ProcessMonitor::WriteRegisterValue.
497 class WriteRegOperation : public Operation
498 {
499 public:
WriteRegOperation(lldb::tid_t tid,unsigned offset,const char * reg_name,const RegisterValue & value,bool & result)500     WriteRegOperation(lldb::tid_t tid, unsigned offset, const char *reg_name,
501                       const RegisterValue &value, bool &result)
502         : m_tid(tid), m_offset(offset), m_reg_name(reg_name),
503           m_value(value), m_result(result)
504         { }
505 
506     void Execute(ProcessMonitor *monitor);
507 
508 private:
509     lldb::tid_t m_tid;
510     uintptr_t m_offset;
511     const char *m_reg_name;
512     const RegisterValue &m_value;
513     bool &m_result;
514 };
515 
516 void
Execute(ProcessMonitor * monitor)517 WriteRegOperation::Execute(ProcessMonitor *monitor)
518 {
519     void* buf;
520     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_REGISTERS));
521 
522 #if __WORDSIZE == 32
523     buf = (void*) m_value.GetAsUInt32();
524 #else
525     buf = (void*) m_value.GetAsUInt64();
526 #endif
527 
528     if (log)
529         log->Printf ("ProcessMonitor::%s() reg %s: %p", __FUNCTION__, m_reg_name, buf);
530     if (PTRACE(PTRACE_POKEUSER, m_tid, (void*)m_offset, buf, 0))
531         m_result = false;
532     else
533         m_result = true;
534 }
535 
536 //------------------------------------------------------------------------------
537 /// @class ReadGPROperation
538 /// @brief Implements ProcessMonitor::ReadGPR.
539 class ReadGPROperation : public Operation
540 {
541 public:
ReadGPROperation(lldb::tid_t tid,void * buf,size_t buf_size,bool & result)542     ReadGPROperation(lldb::tid_t tid, void *buf, size_t buf_size, bool &result)
543         : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_result(result)
544         { }
545 
546     void Execute(ProcessMonitor *monitor);
547 
548 private:
549     lldb::tid_t m_tid;
550     void *m_buf;
551     size_t m_buf_size;
552     bool &m_result;
553 };
554 
555 void
Execute(ProcessMonitor * monitor)556 ReadGPROperation::Execute(ProcessMonitor *monitor)
557 {
558     if (PTRACE(PTRACE_GETREGS, m_tid, NULL, m_buf, m_buf_size) < 0)
559         m_result = false;
560     else
561         m_result = true;
562 }
563 
564 //------------------------------------------------------------------------------
565 /// @class ReadFPROperation
566 /// @brief Implements ProcessMonitor::ReadFPR.
567 class ReadFPROperation : public Operation
568 {
569 public:
ReadFPROperation(lldb::tid_t tid,void * buf,size_t buf_size,bool & result)570     ReadFPROperation(lldb::tid_t tid, void *buf, size_t buf_size, bool &result)
571         : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_result(result)
572         { }
573 
574     void Execute(ProcessMonitor *monitor);
575 
576 private:
577     lldb::tid_t m_tid;
578     void *m_buf;
579     size_t m_buf_size;
580     bool &m_result;
581 };
582 
583 void
Execute(ProcessMonitor * monitor)584 ReadFPROperation::Execute(ProcessMonitor *monitor)
585 {
586     if (PTRACE(PTRACE_GETFPREGS, m_tid, NULL, m_buf, m_buf_size) < 0)
587         m_result = false;
588     else
589         m_result = true;
590 }
591 
592 //------------------------------------------------------------------------------
593 /// @class ReadRegisterSetOperation
594 /// @brief Implements ProcessMonitor::ReadRegisterSet.
595 class ReadRegisterSetOperation : public Operation
596 {
597 public:
ReadRegisterSetOperation(lldb::tid_t tid,void * buf,size_t buf_size,unsigned int regset,bool & result)598     ReadRegisterSetOperation(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset, bool &result)
599         : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_regset(regset), m_result(result)
600         { }
601 
602     void Execute(ProcessMonitor *monitor);
603 
604 private:
605     lldb::tid_t m_tid;
606     void *m_buf;
607     size_t m_buf_size;
608     const unsigned int m_regset;
609     bool &m_result;
610 };
611 
612 void
Execute(ProcessMonitor * monitor)613 ReadRegisterSetOperation::Execute(ProcessMonitor *monitor)
614 {
615     if (PTRACE(PTRACE_GETREGSET, m_tid, (void *)&m_regset, m_buf, m_buf_size) < 0)
616         m_result = false;
617     else
618         m_result = true;
619 }
620 
621 //------------------------------------------------------------------------------
622 /// @class WriteGPROperation
623 /// @brief Implements ProcessMonitor::WriteGPR.
624 class WriteGPROperation : public Operation
625 {
626 public:
WriteGPROperation(lldb::tid_t tid,void * buf,size_t buf_size,bool & result)627     WriteGPROperation(lldb::tid_t tid, void *buf, size_t buf_size, bool &result)
628         : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_result(result)
629         { }
630 
631     void Execute(ProcessMonitor *monitor);
632 
633 private:
634     lldb::tid_t m_tid;
635     void *m_buf;
636     size_t m_buf_size;
637     bool &m_result;
638 };
639 
640 void
Execute(ProcessMonitor * monitor)641 WriteGPROperation::Execute(ProcessMonitor *monitor)
642 {
643     if (PTRACE(PTRACE_SETREGS, m_tid, NULL, m_buf, m_buf_size) < 0)
644         m_result = false;
645     else
646         m_result = true;
647 }
648 
649 //------------------------------------------------------------------------------
650 /// @class WriteFPROperation
651 /// @brief Implements ProcessMonitor::WriteFPR.
652 class WriteFPROperation : public Operation
653 {
654 public:
WriteFPROperation(lldb::tid_t tid,void * buf,size_t buf_size,bool & result)655     WriteFPROperation(lldb::tid_t tid, void *buf, size_t buf_size, bool &result)
656         : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_result(result)
657         { }
658 
659     void Execute(ProcessMonitor *monitor);
660 
661 private:
662     lldb::tid_t m_tid;
663     void *m_buf;
664     size_t m_buf_size;
665     bool &m_result;
666 };
667 
668 void
Execute(ProcessMonitor * monitor)669 WriteFPROperation::Execute(ProcessMonitor *monitor)
670 {
671     if (PTRACE(PTRACE_SETFPREGS, m_tid, NULL, m_buf, m_buf_size) < 0)
672         m_result = false;
673     else
674         m_result = true;
675 }
676 
677 //------------------------------------------------------------------------------
678 /// @class WriteRegisterSetOperation
679 /// @brief Implements ProcessMonitor::WriteRegisterSet.
680 class WriteRegisterSetOperation : public Operation
681 {
682 public:
WriteRegisterSetOperation(lldb::tid_t tid,void * buf,size_t buf_size,unsigned int regset,bool & result)683     WriteRegisterSetOperation(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset, bool &result)
684         : m_tid(tid), m_buf(buf), m_buf_size(buf_size), m_regset(regset), m_result(result)
685         { }
686 
687     void Execute(ProcessMonitor *monitor);
688 
689 private:
690     lldb::tid_t m_tid;
691     void *m_buf;
692     size_t m_buf_size;
693     const unsigned int m_regset;
694     bool &m_result;
695 };
696 
697 void
Execute(ProcessMonitor * monitor)698 WriteRegisterSetOperation::Execute(ProcessMonitor *monitor)
699 {
700     if (PTRACE(PTRACE_SETREGSET, m_tid, (void *)&m_regset, m_buf, m_buf_size) < 0)
701         m_result = false;
702     else
703         m_result = true;
704 }
705 
706 //------------------------------------------------------------------------------
707 /// @class ResumeOperation
708 /// @brief Implements ProcessMonitor::Resume.
709 class ResumeOperation : public Operation
710 {
711 public:
ResumeOperation(lldb::tid_t tid,uint32_t signo,bool & result)712     ResumeOperation(lldb::tid_t tid, uint32_t signo, bool &result) :
713         m_tid(tid), m_signo(signo), m_result(result) { }
714 
715     void Execute(ProcessMonitor *monitor);
716 
717 private:
718     lldb::tid_t m_tid;
719     uint32_t m_signo;
720     bool &m_result;
721 };
722 
723 void
Execute(ProcessMonitor * monitor)724 ResumeOperation::Execute(ProcessMonitor *monitor)
725 {
726     intptr_t data = 0;
727 
728     if (m_signo != LLDB_INVALID_SIGNAL_NUMBER)
729         data = m_signo;
730 
731     if (PTRACE(PTRACE_CONT, m_tid, NULL, (void*)data, 0))
732     {
733         Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
734 
735         if (log)
736             log->Printf ("ResumeOperation (%"  PRIu64 ") failed: %s", m_tid, strerror(errno));
737         m_result = false;
738     }
739     else
740         m_result = true;
741 }
742 
743 //------------------------------------------------------------------------------
744 /// @class SingleStepOperation
745 /// @brief Implements ProcessMonitor::SingleStep.
746 class SingleStepOperation : public Operation
747 {
748 public:
SingleStepOperation(lldb::tid_t tid,uint32_t signo,bool & result)749     SingleStepOperation(lldb::tid_t tid, uint32_t signo, bool &result)
750         : m_tid(tid), m_signo(signo), m_result(result) { }
751 
752     void Execute(ProcessMonitor *monitor);
753 
754 private:
755     lldb::tid_t m_tid;
756     uint32_t m_signo;
757     bool &m_result;
758 };
759 
760 void
Execute(ProcessMonitor * monitor)761 SingleStepOperation::Execute(ProcessMonitor *monitor)
762 {
763     intptr_t data = 0;
764 
765     if (m_signo != LLDB_INVALID_SIGNAL_NUMBER)
766         data = m_signo;
767 
768     if (PTRACE(PTRACE_SINGLESTEP, m_tid, NULL, (void*)data, 0))
769         m_result = false;
770     else
771         m_result = true;
772 }
773 
774 //------------------------------------------------------------------------------
775 /// @class SiginfoOperation
776 /// @brief Implements ProcessMonitor::GetSignalInfo.
777 class SiginfoOperation : public Operation
778 {
779 public:
SiginfoOperation(lldb::tid_t tid,void * info,bool & result,int & ptrace_err)780     SiginfoOperation(lldb::tid_t tid, void *info, bool &result, int &ptrace_err)
781         : m_tid(tid), m_info(info), m_result(result), m_err(ptrace_err) { }
782 
783     void Execute(ProcessMonitor *monitor);
784 
785 private:
786     lldb::tid_t m_tid;
787     void *m_info;
788     bool &m_result;
789     int &m_err;
790 };
791 
792 void
Execute(ProcessMonitor * monitor)793 SiginfoOperation::Execute(ProcessMonitor *monitor)
794 {
795     if (PTRACE(PTRACE_GETSIGINFO, m_tid, NULL, m_info, 0)) {
796         m_result = false;
797         m_err = errno;
798     }
799     else
800         m_result = true;
801 }
802 
803 //------------------------------------------------------------------------------
804 /// @class EventMessageOperation
805 /// @brief Implements ProcessMonitor::GetEventMessage.
806 class EventMessageOperation : public Operation
807 {
808 public:
EventMessageOperation(lldb::tid_t tid,unsigned long * message,bool & result)809     EventMessageOperation(lldb::tid_t tid, unsigned long *message, bool &result)
810         : m_tid(tid), m_message(message), m_result(result) { }
811 
812     void Execute(ProcessMonitor *monitor);
813 
814 private:
815     lldb::tid_t m_tid;
816     unsigned long *m_message;
817     bool &m_result;
818 };
819 
820 void
Execute(ProcessMonitor * monitor)821 EventMessageOperation::Execute(ProcessMonitor *monitor)
822 {
823     if (PTRACE(PTRACE_GETEVENTMSG, m_tid, NULL, m_message, 0))
824         m_result = false;
825     else
826         m_result = true;
827 }
828 
829 //------------------------------------------------------------------------------
830 /// @class KillOperation
831 /// @brief Implements ProcessMonitor::BringProcessIntoLimbo.
832 class KillOperation : public Operation
833 {
834 public:
KillOperation(bool & result)835     KillOperation(bool &result) : m_result(result) { }
836 
837     void Execute(ProcessMonitor *monitor);
838 
839 private:
840     bool &m_result;
841 };
842 
843 void
Execute(ProcessMonitor * monitor)844 KillOperation::Execute(ProcessMonitor *monitor)
845 {
846     lldb::pid_t pid = monitor->GetPID();
847 
848     if (PTRACE(PTRACE_KILL, pid, NULL, NULL, 0))
849         m_result = false;
850     else
851         m_result = true;
852 }
853 
854 //------------------------------------------------------------------------------
855 /// @class KillOperation
856 /// @brief Implements ProcessMonitor::BringProcessIntoLimbo.
857 class DetachOperation : public Operation
858 {
859 public:
DetachOperation(lldb::tid_t tid,Error & result)860     DetachOperation(lldb::tid_t tid, Error &result) : m_tid(tid), m_error(result) { }
861 
862     void Execute(ProcessMonitor *monitor);
863 
864 private:
865     lldb::tid_t m_tid;
866     Error &m_error;
867 };
868 
869 void
Execute(ProcessMonitor * monitor)870 DetachOperation::Execute(ProcessMonitor *monitor)
871 {
872     if (ptrace(PT_DETACH, m_tid, NULL, 0) < 0)
873         m_error.SetErrorToErrno();
874 }
875 
OperationArgs(ProcessMonitor * monitor)876 ProcessMonitor::OperationArgs::OperationArgs(ProcessMonitor *monitor)
877     : m_monitor(monitor)
878 {
879     sem_init(&m_semaphore, 0, 0);
880 }
881 
~OperationArgs()882 ProcessMonitor::OperationArgs::~OperationArgs()
883 {
884     sem_destroy(&m_semaphore);
885 }
886 
LaunchArgs(ProcessMonitor * monitor,lldb_private::Module * module,char const ** argv,char const ** envp,const char * stdin_path,const char * stdout_path,const char * stderr_path,const char * working_dir)887 ProcessMonitor::LaunchArgs::LaunchArgs(ProcessMonitor *monitor,
888                                        lldb_private::Module *module,
889                                        char const **argv,
890                                        char const **envp,
891                                        const char *stdin_path,
892                                        const char *stdout_path,
893                                        const char *stderr_path,
894                                        const char *working_dir)
895     : OperationArgs(monitor),
896       m_module(module),
897       m_argv(argv),
898       m_envp(envp),
899       m_stdin_path(stdin_path),
900       m_stdout_path(stdout_path),
901       m_stderr_path(stderr_path),
902       m_working_dir(working_dir) { }
903 
~LaunchArgs()904 ProcessMonitor::LaunchArgs::~LaunchArgs()
905 { }
906 
AttachArgs(ProcessMonitor * monitor,lldb::pid_t pid)907 ProcessMonitor::AttachArgs::AttachArgs(ProcessMonitor *monitor,
908                                        lldb::pid_t pid)
909     : OperationArgs(monitor), m_pid(pid) { }
910 
~AttachArgs()911 ProcessMonitor::AttachArgs::~AttachArgs()
912 { }
913 
914 //------------------------------------------------------------------------------
915 /// The basic design of the ProcessMonitor is built around two threads.
916 ///
917 /// One thread (@see SignalThread) simply blocks on a call to waitpid() looking
918 /// for changes in the debugee state.  When a change is detected a
919 /// ProcessMessage is sent to the associated ProcessLinux instance.  This thread
920 /// "drives" state changes in the debugger.
921 ///
922 /// The second thread (@see OperationThread) is responsible for two things 1)
923 /// launching or attaching to the inferior process, and then 2) servicing
924 /// operations such as register reads/writes, stepping, etc.  See the comments
925 /// on the Operation class for more info as to why this is needed.
ProcessMonitor(ProcessPOSIX * process,Module * module,const char * argv[],const char * envp[],const char * stdin_path,const char * stdout_path,const char * stderr_path,const char * working_dir,lldb_private::Error & error)926 ProcessMonitor::ProcessMonitor(ProcessPOSIX *process,
927                                Module *module,
928                                const char *argv[],
929                                const char *envp[],
930                                const char *stdin_path,
931                                const char *stdout_path,
932                                const char *stderr_path,
933                                const char *working_dir,
934                                lldb_private::Error &error)
935     : m_process(static_cast<ProcessLinux *>(process)),
936       m_operation_thread(LLDB_INVALID_HOST_THREAD),
937       m_monitor_thread(LLDB_INVALID_HOST_THREAD),
938       m_pid(LLDB_INVALID_PROCESS_ID),
939       m_terminal_fd(-1),
940       m_client_fd(-1),
941       m_server_fd(-1)
942 {
943     std::unique_ptr<LaunchArgs> args;
944 
945     args.reset(new LaunchArgs(this, module, argv, envp,
946                               stdin_path, stdout_path, stderr_path, working_dir));
947 
948     // Server/client descriptors.
949     if (!EnableIPC())
950     {
951         error.SetErrorToGenericError();
952         error.SetErrorString("Monitor failed to initialize.");
953     }
954 
955     StartLaunchOpThread(args.get(), error);
956     if (!error.Success())
957         return;
958 
959 WAIT_AGAIN:
960     // Wait for the operation thread to initialize.
961     if (sem_wait(&args->m_semaphore))
962     {
963         if (errno == EINTR)
964             goto WAIT_AGAIN;
965         else
966         {
967             error.SetErrorToErrno();
968             return;
969         }
970     }
971 
972     // Check that the launch was a success.
973     if (!args->m_error.Success())
974     {
975         StopOpThread();
976         error = args->m_error;
977         return;
978     }
979 
980     // Finally, start monitoring the child process for change in state.
981     m_monitor_thread = Host::StartMonitoringChildProcess(
982         ProcessMonitor::MonitorCallback, this, GetPID(), true);
983     if (!IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
984     {
985         error.SetErrorToGenericError();
986         error.SetErrorString("Process launch failed.");
987         return;
988     }
989 }
990 
ProcessMonitor(ProcessPOSIX * process,lldb::pid_t pid,lldb_private::Error & error)991 ProcessMonitor::ProcessMonitor(ProcessPOSIX *process,
992                                lldb::pid_t pid,
993                                lldb_private::Error &error)
994   : m_process(static_cast<ProcessLinux *>(process)),
995       m_operation_thread(LLDB_INVALID_HOST_THREAD),
996       m_monitor_thread(LLDB_INVALID_HOST_THREAD),
997       m_pid(LLDB_INVALID_PROCESS_ID),
998       m_terminal_fd(-1),
999 
1000       m_client_fd(-1),
1001       m_server_fd(-1)
1002 {
1003     std::unique_ptr<AttachArgs> args;
1004 
1005     args.reset(new AttachArgs(this, pid));
1006 
1007     // Server/client descriptors.
1008     if (!EnableIPC())
1009     {
1010         error.SetErrorToGenericError();
1011         error.SetErrorString("Monitor failed to initialize.");
1012     }
1013 
1014     StartAttachOpThread(args.get(), error);
1015     if (!error.Success())
1016         return;
1017 
1018 WAIT_AGAIN:
1019     // Wait for the operation thread to initialize.
1020     if (sem_wait(&args->m_semaphore))
1021     {
1022         if (errno == EINTR)
1023             goto WAIT_AGAIN;
1024         else
1025         {
1026             error.SetErrorToErrno();
1027             return;
1028         }
1029     }
1030 
1031     // Check that the attach was a success.
1032     if (!args->m_error.Success())
1033     {
1034         StopOpThread();
1035         error = args->m_error;
1036         return;
1037     }
1038 
1039     // Finally, start monitoring the child process for change in state.
1040     m_monitor_thread = Host::StartMonitoringChildProcess(
1041         ProcessMonitor::MonitorCallback, this, GetPID(), true);
1042     if (!IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
1043     {
1044         error.SetErrorToGenericError();
1045         error.SetErrorString("Process attach failed.");
1046         return;
1047     }
1048 }
1049 
~ProcessMonitor()1050 ProcessMonitor::~ProcessMonitor()
1051 {
1052     StopMonitor();
1053 }
1054 
1055 //------------------------------------------------------------------------------
1056 // Thread setup and tear down.
1057 void
StartLaunchOpThread(LaunchArgs * args,Error & error)1058 ProcessMonitor::StartLaunchOpThread(LaunchArgs *args, Error &error)
1059 {
1060     static const char *g_thread_name = "lldb.process.linux.operation";
1061 
1062     if (IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
1063         return;
1064 
1065     m_operation_thread =
1066         Host::ThreadCreate(g_thread_name, LaunchOpThread, args, &error);
1067 }
1068 
1069 void *
LaunchOpThread(void * arg)1070 ProcessMonitor::LaunchOpThread(void *arg)
1071 {
1072     LaunchArgs *args = static_cast<LaunchArgs*>(arg);
1073 
1074     if (!Launch(args)) {
1075         sem_post(&args->m_semaphore);
1076         return NULL;
1077     }
1078 
1079     ServeOperation(args);
1080     return NULL;
1081 }
1082 
1083 bool
Launch(LaunchArgs * args)1084 ProcessMonitor::Launch(LaunchArgs *args)
1085 {
1086     ProcessMonitor *monitor = args->m_monitor;
1087     ProcessLinux &process = monitor->GetProcess();
1088     const char **argv = args->m_argv;
1089     const char **envp = args->m_envp;
1090     const char *stdin_path = args->m_stdin_path;
1091     const char *stdout_path = args->m_stdout_path;
1092     const char *stderr_path = args->m_stderr_path;
1093     const char *working_dir = args->m_working_dir;
1094 
1095     lldb_utility::PseudoTerminal terminal;
1096     const size_t err_len = 1024;
1097     char err_str[err_len];
1098     lldb::pid_t pid;
1099 
1100     lldb::ThreadSP inferior;
1101     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1102 
1103     // Propagate the environment if one is not supplied.
1104     if (envp == NULL || envp[0] == NULL)
1105         envp = const_cast<const char **>(environ);
1106 
1107     // Pseudo terminal setup.
1108     if (!terminal.OpenFirstAvailableMaster(O_RDWR | O_NOCTTY, err_str, err_len))
1109     {
1110         args->m_error.SetErrorToGenericError();
1111         args->m_error.SetErrorString("Could not open controlling TTY.");
1112         goto FINISH;
1113     }
1114 
1115     if ((pid = terminal.Fork(err_str, err_len)) == -1)
1116     {
1117         args->m_error.SetErrorToGenericError();
1118         args->m_error.SetErrorString("Process fork failed.");
1119         goto FINISH;
1120     }
1121 
1122     // Recognized child exit status codes.
1123     enum {
1124         ePtraceFailed = 1,
1125         eDupStdinFailed,
1126         eDupStdoutFailed,
1127         eDupStderrFailed,
1128         eChdirFailed,
1129         eExecFailed
1130     };
1131 
1132     // Child process.
1133     if (pid == 0)
1134     {
1135         // Trace this process.
1136         if (PTRACE(PTRACE_TRACEME, 0, NULL, NULL, 0) < 0)
1137             exit(ePtraceFailed);
1138 
1139         // Do not inherit setgid powers.
1140         setgid(getgid());
1141 
1142         // Let us have our own process group.
1143         setpgid(0, 0);
1144 
1145         // Dup file descriptors if needed.
1146         //
1147         // FIXME: If two or more of the paths are the same we needlessly open
1148         // the same file multiple times.
1149         if (stdin_path != NULL && stdin_path[0])
1150             if (!DupDescriptor(stdin_path, STDIN_FILENO, O_RDONLY))
1151                 exit(eDupStdinFailed);
1152 
1153         if (stdout_path != NULL && stdout_path[0])
1154             if (!DupDescriptor(stdout_path, STDOUT_FILENO, O_WRONLY | O_CREAT))
1155                 exit(eDupStdoutFailed);
1156 
1157         if (stderr_path != NULL && stderr_path[0])
1158             if (!DupDescriptor(stderr_path, STDERR_FILENO, O_WRONLY | O_CREAT))
1159                 exit(eDupStderrFailed);
1160 
1161         // Change working directory
1162         if (working_dir != NULL && working_dir[0])
1163           if (0 != ::chdir(working_dir))
1164               exit(eChdirFailed);
1165 
1166         // Execute.  We should never return.
1167         execve(argv[0],
1168                const_cast<char *const *>(argv),
1169                const_cast<char *const *>(envp));
1170         exit(eExecFailed);
1171     }
1172 
1173     // Wait for the child process to to trap on its call to execve.
1174     pid_t wpid;
1175     int status;
1176     if ((wpid = waitpid(pid, &status, 0)) < 0)
1177     {
1178         args->m_error.SetErrorToErrno();
1179         goto FINISH;
1180     }
1181     else if (WIFEXITED(status))
1182     {
1183         // open, dup or execve likely failed for some reason.
1184         args->m_error.SetErrorToGenericError();
1185         switch (WEXITSTATUS(status))
1186         {
1187             case ePtraceFailed:
1188                 args->m_error.SetErrorString("Child ptrace failed.");
1189                 break;
1190             case eDupStdinFailed:
1191                 args->m_error.SetErrorString("Child open stdin failed.");
1192                 break;
1193             case eDupStdoutFailed:
1194                 args->m_error.SetErrorString("Child open stdout failed.");
1195                 break;
1196             case eDupStderrFailed:
1197                 args->m_error.SetErrorString("Child open stderr failed.");
1198                 break;
1199             case eChdirFailed:
1200                 args->m_error.SetErrorString("Child failed to set working directory.");
1201                 break;
1202             case eExecFailed:
1203                 args->m_error.SetErrorString("Child exec failed.");
1204                 break;
1205             default:
1206                 args->m_error.SetErrorString("Child returned unknown exit status.");
1207                 break;
1208         }
1209         goto FINISH;
1210     }
1211     assert(WIFSTOPPED(status) && wpid == pid &&
1212            "Could not sync with inferior process.");
1213 
1214     if (!SetDefaultPtraceOpts(pid))
1215     {
1216         args->m_error.SetErrorToErrno();
1217         goto FINISH;
1218     }
1219 
1220     // Release the master terminal descriptor and pass it off to the
1221     // ProcessMonitor instance.  Similarly stash the inferior pid.
1222     monitor->m_terminal_fd = terminal.ReleaseMasterFileDescriptor();
1223     monitor->m_pid = pid;
1224 
1225     // Set the terminal fd to be in non blocking mode (it simplifies the
1226     // implementation of ProcessLinux::GetSTDOUT to have a non-blocking
1227     // descriptor to read from).
1228     if (!EnsureFDFlags(monitor->m_terminal_fd, O_NONBLOCK, args->m_error))
1229         goto FINISH;
1230 
1231     // Update the process thread list with this new thread.
1232     // FIXME: should we be letting UpdateThreadList handle this?
1233     // FIXME: by using pids instead of tids, we can only support one thread.
1234     inferior.reset(process.CreateNewPOSIXThread(process, pid));
1235 
1236     if (log)
1237         log->Printf ("ProcessMonitor::%s() adding pid = %" PRIu64, __FUNCTION__, pid);
1238     process.GetThreadList().AddThread(inferior);
1239 
1240     process.AddThreadForInitialStopIfNeeded(pid);
1241 
1242     // Let our process instance know the thread has stopped.
1243     process.SendMessage(ProcessMessage::Trace(pid));
1244 
1245 FINISH:
1246     return args->m_error.Success();
1247 }
1248 
1249 bool
EnableIPC()1250 ProcessMonitor::EnableIPC()
1251 {
1252     int fd[2];
1253 
1254     if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd))
1255         return false;
1256 
1257     m_client_fd = fd[0];
1258     m_server_fd = fd[1];
1259     return true;
1260 }
1261 
1262 void
StartAttachOpThread(AttachArgs * args,lldb_private::Error & error)1263 ProcessMonitor::StartAttachOpThread(AttachArgs *args, lldb_private::Error &error)
1264 {
1265     static const char *g_thread_name = "lldb.process.linux.operation";
1266 
1267     if (IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
1268         return;
1269 
1270     m_operation_thread =
1271         Host::ThreadCreate(g_thread_name, AttachOpThread, args, &error);
1272 }
1273 
1274 void *
AttachOpThread(void * arg)1275 ProcessMonitor::AttachOpThread(void *arg)
1276 {
1277     AttachArgs *args = static_cast<AttachArgs*>(arg);
1278 
1279     if (!Attach(args)) {
1280         sem_post(&args->m_semaphore);
1281         return NULL;
1282     }
1283 
1284     ServeOperation(args);
1285     return NULL;
1286 }
1287 
1288 bool
Attach(AttachArgs * args)1289 ProcessMonitor::Attach(AttachArgs *args)
1290 {
1291     lldb::pid_t pid = args->m_pid;
1292 
1293     ProcessMonitor *monitor = args->m_monitor;
1294     ProcessLinux &process = monitor->GetProcess();
1295     lldb::ThreadSP inferior;
1296     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1297 
1298     // Use a map to keep track of the threads which we have attached/need to attach.
1299     Host::TidMap tids_to_attach;
1300     if (pid <= 1)
1301     {
1302         args->m_error.SetErrorToGenericError();
1303         args->m_error.SetErrorString("Attaching to process 1 is not allowed.");
1304         goto FINISH;
1305     }
1306 
1307     while (Host::FindProcessThreads(pid, tids_to_attach))
1308     {
1309         for (Host::TidMap::iterator it = tids_to_attach.begin();
1310              it != tids_to_attach.end(); ++it)
1311         {
1312             if (it->second == false)
1313             {
1314                 lldb::tid_t tid = it->first;
1315 
1316                 // Attach to the requested process.
1317                 // An attach will cause the thread to stop with a SIGSTOP.
1318                 if (PTRACE(PTRACE_ATTACH, tid, NULL, NULL, 0) < 0)
1319                 {
1320                     // No such thread. The thread may have exited.
1321                     // More error handling may be needed.
1322                     if (errno == ESRCH)
1323                     {
1324                         tids_to_attach.erase(it);
1325                         continue;
1326                     }
1327                     else
1328                     {
1329                         args->m_error.SetErrorToErrno();
1330                         goto FINISH;
1331                     }
1332                 }
1333 
1334                 int status;
1335                 // Need to use __WALL otherwise we receive an error with errno=ECHLD
1336                 // At this point we should have a thread stopped if waitpid succeeds.
1337                 if ((status = waitpid(tid, NULL, __WALL)) < 0)
1338                 {
1339                     // No such thread. The thread may have exited.
1340                     // More error handling may be needed.
1341                     if (errno == ESRCH)
1342                     {
1343                         tids_to_attach.erase(it);
1344                         continue;
1345                     }
1346                     else
1347                     {
1348                         args->m_error.SetErrorToErrno();
1349                         goto FINISH;
1350                     }
1351                 }
1352 
1353                 if (!SetDefaultPtraceOpts(tid))
1354                 {
1355                     args->m_error.SetErrorToErrno();
1356                     goto FINISH;
1357                 }
1358 
1359                 // Update the process thread list with the attached thread.
1360                 inferior.reset(process.CreateNewPOSIXThread(process, tid));
1361 
1362                 if (log)
1363                     log->Printf ("ProcessMonitor::%s() adding tid = %" PRIu64, __FUNCTION__, tid);
1364                 process.GetThreadList().AddThread(inferior);
1365                 it->second = true;
1366                 process.AddThreadForInitialStopIfNeeded(tid);
1367             }
1368         }
1369     }
1370 
1371     if (tids_to_attach.size() > 0)
1372     {
1373         monitor->m_pid = pid;
1374         // Let our process instance know the thread has stopped.
1375         process.SendMessage(ProcessMessage::Trace(pid));
1376     }
1377     else
1378     {
1379         args->m_error.SetErrorToGenericError();
1380         args->m_error.SetErrorString("No such process.");
1381     }
1382 
1383  FINISH:
1384     return args->m_error.Success();
1385 }
1386 
1387 bool
SetDefaultPtraceOpts(lldb::pid_t pid)1388 ProcessMonitor::SetDefaultPtraceOpts(lldb::pid_t pid)
1389 {
1390     long ptrace_opts = 0;
1391 
1392     // Have the child raise an event on exit.  This is used to keep the child in
1393     // limbo until it is destroyed.
1394     ptrace_opts |= PTRACE_O_TRACEEXIT;
1395 
1396     // Have the tracer trace threads which spawn in the inferior process.
1397     // TODO: if we want to support tracing the inferiors' child, add the
1398     // appropriate ptrace flags here (PTRACE_O_TRACEFORK, PTRACE_O_TRACEVFORK)
1399     ptrace_opts |= PTRACE_O_TRACECLONE;
1400 
1401     // Have the tracer notify us before execve returns
1402     // (needed to disable legacy SIGTRAP generation)
1403     ptrace_opts |= PTRACE_O_TRACEEXEC;
1404 
1405     return PTRACE(PTRACE_SETOPTIONS, pid, NULL, (void*)ptrace_opts, 0) >= 0;
1406 }
1407 
1408 bool
MonitorCallback(void * callback_baton,lldb::pid_t pid,bool exited,int signal,int status)1409 ProcessMonitor::MonitorCallback(void *callback_baton,
1410                                 lldb::pid_t pid,
1411                                 bool exited,
1412                                 int signal,
1413                                 int status)
1414 {
1415     ProcessMessage message;
1416     ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton);
1417     ProcessLinux *process = monitor->m_process;
1418     assert(process);
1419     bool stop_monitoring;
1420     siginfo_t info;
1421     int ptrace_err;
1422 
1423     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1424 
1425     if (exited)
1426     {
1427         if (log)
1428             log->Printf ("ProcessMonitor::%s() got exit signal, tid = %"  PRIu64, __FUNCTION__, pid);
1429         message = ProcessMessage::Exit(pid, status);
1430         process->SendMessage(message);
1431         return pid == process->GetID();
1432     }
1433 
1434     if (!monitor->GetSignalInfo(pid, &info, ptrace_err)) {
1435         if (ptrace_err == EINVAL) {
1436             if (log)
1437                 log->Printf ("ProcessMonitor::%s() resuming from group-stop", __FUNCTION__);
1438             // inferior process is in 'group-stop', so deliver SIGSTOP signal
1439             if (!monitor->Resume(pid, SIGSTOP)) {
1440               assert(0 && "SIGSTOP delivery failed while in 'group-stop' state");
1441             }
1442             stop_monitoring = false;
1443         } else {
1444             // ptrace(GETSIGINFO) failed (but not due to group-stop). Most likely,
1445             // this means the child pid is gone (or not being debugged) therefore
1446             // stop the monitor thread if this is the main pid.
1447             if (log)
1448                 log->Printf ("ProcessMonitor::%s() GetSignalInfo failed: %s, tid = %" PRIu64 ", signal = %d, status = %d",
1449                               __FUNCTION__, strerror(ptrace_err), pid, signal, status);
1450             stop_monitoring = pid == monitor->m_process->GetID();
1451         }
1452     }
1453     else {
1454         switch (info.si_signo)
1455         {
1456         case SIGTRAP:
1457             message = MonitorSIGTRAP(monitor, &info, pid);
1458             break;
1459 
1460         default:
1461             message = MonitorSignal(monitor, &info, pid);
1462             break;
1463         }
1464 
1465         process->SendMessage(message);
1466         stop_monitoring = false;
1467     }
1468 
1469     return stop_monitoring;
1470 }
1471 
1472 ProcessMessage
MonitorSIGTRAP(ProcessMonitor * monitor,const siginfo_t * info,lldb::pid_t pid)1473 ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor,
1474                                const siginfo_t *info, lldb::pid_t pid)
1475 {
1476     ProcessMessage message;
1477 
1478     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1479 
1480     assert(monitor);
1481     assert(info && info->si_signo == SIGTRAP && "Unexpected child signal!");
1482 
1483     switch (info->si_code)
1484     {
1485     default:
1486         assert(false && "Unexpected SIGTRAP code!");
1487         break;
1488 
1489     // TODO: these two cases are required if we want to support tracing
1490     // of the inferiors' children
1491     // case (SIGTRAP | (PTRACE_EVENT_FORK << 8)):
1492     // case (SIGTRAP | (PTRACE_EVENT_VFORK << 8)):
1493 
1494     case (SIGTRAP | (PTRACE_EVENT_CLONE << 8)):
1495     {
1496         if (log)
1497             log->Printf ("ProcessMonitor::%s() received thread creation event, code = %d", __FUNCTION__, info->si_code ^ SIGTRAP);
1498 
1499         unsigned long tid = 0;
1500         if (!monitor->GetEventMessage(pid, &tid))
1501             tid = -1;
1502         message = ProcessMessage::NewThread(pid, tid);
1503         break;
1504     }
1505 
1506     case (SIGTRAP | (PTRACE_EVENT_EXEC << 8)):
1507         // Don't follow the child by default and resume
1508         monitor->Resume(pid, SIGCONT);
1509         break;
1510 
1511     case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):
1512     {
1513         // The inferior process or one of its threads is about to exit.
1514         // Maintain the process or thread in a state of "limbo" until we are
1515         // explicitly commanded to detach, destroy, resume, etc.
1516         unsigned long data = 0;
1517         if (!monitor->GetEventMessage(pid, &data))
1518             data = -1;
1519         if (log)
1520             log->Printf ("ProcessMonitor::%s() received limbo event, data = %lx, pid = %" PRIu64, __FUNCTION__, data, pid);
1521         message = ProcessMessage::Limbo(pid, (data >> 8));
1522         break;
1523     }
1524 
1525     case 0:
1526     case TRAP_TRACE:
1527         if (log)
1528             log->Printf ("ProcessMonitor::%s() received trace event, pid = %" PRIu64, __FUNCTION__, pid);
1529         message = ProcessMessage::Trace(pid);
1530         break;
1531 
1532     case SI_KERNEL:
1533     case TRAP_BRKPT:
1534         if (log)
1535             log->Printf ("ProcessMonitor::%s() received breakpoint event, pid = %" PRIu64, __FUNCTION__, pid);
1536         message = ProcessMessage::Break(pid);
1537         break;
1538 
1539     case TRAP_HWBKPT:
1540         if (log)
1541             log->Printf ("ProcessMonitor::%s() received watchpoint event, pid = %" PRIu64, __FUNCTION__, pid);
1542         message = ProcessMessage::Watch(pid, (lldb::addr_t)info->si_addr);
1543         break;
1544 
1545     case SIGTRAP:
1546     case (SIGTRAP | 0x80):
1547         if (log)
1548             log->Printf ("ProcessMonitor::%s() received system call stop event, pid = %" PRIu64, __FUNCTION__, pid);
1549         // Ignore these signals until we know more about them
1550         monitor->Resume(pid, eResumeSignalNone);
1551     }
1552 
1553     return message;
1554 }
1555 
1556 ProcessMessage
MonitorSignal(ProcessMonitor * monitor,const siginfo_t * info,lldb::pid_t pid)1557 ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
1558                               const siginfo_t *info, lldb::pid_t pid)
1559 {
1560     ProcessMessage message;
1561     int signo = info->si_signo;
1562 
1563     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1564 
1565     // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
1566     // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
1567     // kill(2) or raise(3).  Similarly for tgkill(2) on Linux.
1568     //
1569     // IOW, user generated signals never generate what we consider to be a
1570     // "crash".
1571     //
1572     // Similarly, ACK signals generated by this monitor.
1573     if (info->si_code == SI_TKILL || info->si_code == SI_USER)
1574     {
1575         if (log)
1576             log->Printf ("ProcessMonitor::%s() received signal %s with code %s, pid = %d",
1577                             __FUNCTION__,
1578                             monitor->m_process->GetUnixSignals().GetSignalAsCString (signo),
1579                             (info->si_code == SI_TKILL ? "SI_TKILL" : "SI_USER"),
1580                             info->si_pid);
1581 
1582         if (info->si_pid == getpid())
1583             return ProcessMessage::SignalDelivered(pid, signo);
1584         else
1585             return ProcessMessage::Signal(pid, signo);
1586     }
1587 
1588     if (log)
1589         log->Printf ("ProcessMonitor::%s() received signal %s", __FUNCTION__, monitor->m_process->GetUnixSignals().GetSignalAsCString (signo));
1590 
1591     if (signo == SIGSEGV) {
1592         lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
1593         ProcessMessage::CrashReason reason = GetCrashReasonForSIGSEGV(info);
1594         return ProcessMessage::Crash(pid, reason, signo, fault_addr);
1595     }
1596 
1597     if (signo == SIGILL) {
1598         lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
1599         ProcessMessage::CrashReason reason = GetCrashReasonForSIGILL(info);
1600         return ProcessMessage::Crash(pid, reason, signo, fault_addr);
1601     }
1602 
1603     if (signo == SIGFPE) {
1604         lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
1605         ProcessMessage::CrashReason reason = GetCrashReasonForSIGFPE(info);
1606         return ProcessMessage::Crash(pid, reason, signo, fault_addr);
1607     }
1608 
1609     if (signo == SIGBUS) {
1610         lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
1611         ProcessMessage::CrashReason reason = GetCrashReasonForSIGBUS(info);
1612         return ProcessMessage::Crash(pid, reason, signo, fault_addr);
1613     }
1614 
1615     // Everything else is "normal" and does not require any special action on
1616     // our part.
1617     return ProcessMessage::Signal(pid, signo);
1618 }
1619 
1620 bool
StopThread(lldb::tid_t tid)1621 ProcessMonitor::StopThread(lldb::tid_t tid)
1622 {
1623     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
1624 
1625     // FIXME: Try to use tgkill or tkill
1626     int ret = tgkill(m_pid, tid, SIGSTOP);
1627     if (log)
1628         log->Printf ("ProcessMonitor::%s(bp) stopping thread, tid = %" PRIu64 ", ret = %d", __FUNCTION__, tid, ret);
1629 
1630     // This can happen if a thread exited while we were trying to stop it.  That's OK.
1631     // We'll get the signal for that later.
1632     if (ret < 0)
1633         return false;
1634 
1635     // Wait for the thread to stop
1636     while (true)
1637     {
1638         int status = -1;
1639         if (log)
1640             log->Printf ("ProcessMonitor::%s(bp) waitpid...", __FUNCTION__);
1641         lldb::pid_t wait_pid = ::waitpid (-1*m_pid, &status, __WALL);
1642         if (log)
1643             log->Printf ("ProcessMonitor::%s(bp) waitpid, pid = %" PRIu64 ", status = %d", __FUNCTION__, wait_pid, status);
1644 
1645         if (wait_pid == -1)
1646         {
1647             // If we got interrupted by a signal (in our process, not the
1648             // inferior) try again.
1649             if (errno == EINTR)
1650                 continue;
1651             else
1652                 return false; // This is bad, but there's nothing we can do.
1653         }
1654 
1655         // If this is a thread exit, we won't get any more information.
1656         if (WIFEXITED(status))
1657         {
1658             m_process->SendMessage(ProcessMessage::Exit(wait_pid, WEXITSTATUS(status)));
1659             if (wait_pid == tid)
1660                 return true;
1661             continue;
1662         }
1663 
1664         siginfo_t info;
1665         int ptrace_err;
1666         if (!GetSignalInfo(wait_pid, &info, ptrace_err))
1667         {
1668             if (log)
1669             {
1670                 log->Printf ("ProcessMonitor::%s() GetSignalInfo failed.", __FUNCTION__);
1671 
1672                 // This would be a particularly interesting case
1673                 if (ptrace_err == EINVAL)
1674                     log->Printf ("ProcessMonitor::%s() in group-stop", __FUNCTION__);
1675             }
1676             return false;
1677         }
1678 
1679         // Handle events from other threads
1680         if (log)
1681             log->Printf ("ProcessMonitor::%s(bp) handling event, tid == %" PRIu64, __FUNCTION__, wait_pid);
1682 
1683         ProcessMessage message;
1684         if (info.si_signo == SIGTRAP)
1685             message = MonitorSIGTRAP(this, &info, wait_pid);
1686         else
1687             message = MonitorSignal(this, &info, wait_pid);
1688 
1689         POSIXThread *thread = static_cast<POSIXThread*>(m_process->GetThreadList().FindThreadByID(wait_pid).get());
1690 
1691         // When a new thread is created, we may get a SIGSTOP for the new thread
1692         // just before we get the SIGTRAP that we use to add the thread to our
1693         // process thread list.  We don't need to worry about that signal here.
1694         assert(thread || message.GetKind() == ProcessMessage::eSignalMessage);
1695 
1696         if (!thread)
1697         {
1698             m_process->SendMessage(message);
1699             continue;
1700         }
1701 
1702         switch (message.GetKind())
1703         {
1704             case ProcessMessage::eInvalidMessage:
1705                 break;
1706 
1707             // These need special handling because we don't want to send a
1708             // resume even if we already sent a SIGSTOP to this thread. In
1709             // this case the resume will cause the thread to disappear.  It is
1710             // unlikely that we'll ever get eExitMessage here, but the same
1711             // reasoning applies.
1712             case ProcessMessage::eLimboMessage:
1713             case ProcessMessage::eExitMessage:
1714                 if (log)
1715                     log->Printf ("ProcessMonitor::%s(bp) handling message", __FUNCTION__);
1716                 // SendMessage will set the thread state as needed.
1717                 m_process->SendMessage(message);
1718                 // If this is the thread we're waiting for, stop waiting. Even
1719                 // though this wasn't the signal we expected, it's the last
1720                 // signal we'll see while this thread is alive.
1721                 if (wait_pid == tid)
1722                     return true;
1723                 break;
1724 
1725             case ProcessMessage::eSignalMessage:
1726                 if (log)
1727                     log->Printf ("ProcessMonitor::%s(bp) handling message", __FUNCTION__);
1728                 if (WSTOPSIG(status) == SIGSTOP)
1729                 {
1730                     m_process->AddThreadForInitialStopIfNeeded(tid);
1731                     thread->SetState(lldb::eStateStopped);
1732                 }
1733                 else
1734                 {
1735                     m_process->SendMessage(message);
1736                     // This isn't the stop we were expecting, but the thread is
1737                     // stopped. SendMessage will handle processing of this event,
1738                     // but we need to resume here to get the stop we are waiting
1739                     // for (otherwise the thread will stop again immediately when
1740                     // we try to resume).
1741                     if (wait_pid == tid)
1742                         Resume(wait_pid, eResumeSignalNone);
1743                 }
1744                 break;
1745 
1746             case ProcessMessage::eSignalDeliveredMessage:
1747                 // This is the stop we're expecting.
1748                 if (wait_pid == tid && WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP && info.si_code == SI_TKILL)
1749                 {
1750                     if (log)
1751                         log->Printf ("ProcessMonitor::%s(bp) received signal, done waiting", __FUNCTION__);
1752                     thread->SetState(lldb::eStateStopped);
1753                     return true;
1754                 }
1755                 // else fall-through
1756             case ProcessMessage::eBreakpointMessage:
1757             case ProcessMessage::eTraceMessage:
1758             case ProcessMessage::eWatchpointMessage:
1759             case ProcessMessage::eCrashMessage:
1760             case ProcessMessage::eNewThreadMessage:
1761                 if (log)
1762                     log->Printf ("ProcessMonitor::%s(bp) handling message", __FUNCTION__);
1763                 // SendMessage will set the thread state as needed.
1764                 m_process->SendMessage(message);
1765                 // This isn't the stop we were expecting, but the thread is
1766                 // stopped. SendMessage will handle processing of this event,
1767                 // but we need to resume here to get the stop we are waiting
1768                 // for (otherwise the thread will stop again immediately when
1769                 // we try to resume).
1770                 if (wait_pid == tid)
1771                     Resume(wait_pid, eResumeSignalNone);
1772                 break;
1773         }
1774     }
1775     return false;
1776 }
1777 
1778 ProcessMessage::CrashReason
GetCrashReasonForSIGSEGV(const siginfo_t * info)1779 ProcessMonitor::GetCrashReasonForSIGSEGV(const siginfo_t *info)
1780 {
1781     ProcessMessage::CrashReason reason;
1782     assert(info->si_signo == SIGSEGV);
1783 
1784     reason = ProcessMessage::eInvalidCrashReason;
1785 
1786     switch (info->si_code)
1787     {
1788     default:
1789         assert(false && "unexpected si_code for SIGSEGV");
1790         break;
1791     case SEGV_MAPERR:
1792         reason = ProcessMessage::eInvalidAddress;
1793         break;
1794     case SEGV_ACCERR:
1795         reason = ProcessMessage::ePrivilegedAddress;
1796         break;
1797     }
1798 
1799     return reason;
1800 }
1801 
1802 ProcessMessage::CrashReason
GetCrashReasonForSIGILL(const siginfo_t * info)1803 ProcessMonitor::GetCrashReasonForSIGILL(const siginfo_t *info)
1804 {
1805     ProcessMessage::CrashReason reason;
1806     assert(info->si_signo == SIGILL);
1807 
1808     reason = ProcessMessage::eInvalidCrashReason;
1809 
1810     switch (info->si_code)
1811     {
1812     default:
1813         assert(false && "unexpected si_code for SIGILL");
1814         break;
1815     case ILL_ILLOPC:
1816         reason = ProcessMessage::eIllegalOpcode;
1817         break;
1818     case ILL_ILLOPN:
1819         reason = ProcessMessage::eIllegalOperand;
1820         break;
1821     case ILL_ILLADR:
1822         reason = ProcessMessage::eIllegalAddressingMode;
1823         break;
1824     case ILL_ILLTRP:
1825         reason = ProcessMessage::eIllegalTrap;
1826         break;
1827     case ILL_PRVOPC:
1828         reason = ProcessMessage::ePrivilegedOpcode;
1829         break;
1830     case ILL_PRVREG:
1831         reason = ProcessMessage::ePrivilegedRegister;
1832         break;
1833     case ILL_COPROC:
1834         reason = ProcessMessage::eCoprocessorError;
1835         break;
1836     case ILL_BADSTK:
1837         reason = ProcessMessage::eInternalStackError;
1838         break;
1839     }
1840 
1841     return reason;
1842 }
1843 
1844 ProcessMessage::CrashReason
GetCrashReasonForSIGFPE(const siginfo_t * info)1845 ProcessMonitor::GetCrashReasonForSIGFPE(const siginfo_t *info)
1846 {
1847     ProcessMessage::CrashReason reason;
1848     assert(info->si_signo == SIGFPE);
1849 
1850     reason = ProcessMessage::eInvalidCrashReason;
1851 
1852     switch (info->si_code)
1853     {
1854     default:
1855         assert(false && "unexpected si_code for SIGFPE");
1856         break;
1857     case FPE_INTDIV:
1858         reason = ProcessMessage::eIntegerDivideByZero;
1859         break;
1860     case FPE_INTOVF:
1861         reason = ProcessMessage::eIntegerOverflow;
1862         break;
1863     case FPE_FLTDIV:
1864         reason = ProcessMessage::eFloatDivideByZero;
1865         break;
1866     case FPE_FLTOVF:
1867         reason = ProcessMessage::eFloatOverflow;
1868         break;
1869     case FPE_FLTUND:
1870         reason = ProcessMessage::eFloatUnderflow;
1871         break;
1872     case FPE_FLTRES:
1873         reason = ProcessMessage::eFloatInexactResult;
1874         break;
1875     case FPE_FLTINV:
1876         reason = ProcessMessage::eFloatInvalidOperation;
1877         break;
1878     case FPE_FLTSUB:
1879         reason = ProcessMessage::eFloatSubscriptRange;
1880         break;
1881     }
1882 
1883     return reason;
1884 }
1885 
1886 ProcessMessage::CrashReason
GetCrashReasonForSIGBUS(const siginfo_t * info)1887 ProcessMonitor::GetCrashReasonForSIGBUS(const siginfo_t *info)
1888 {
1889     ProcessMessage::CrashReason reason;
1890     assert(info->si_signo == SIGBUS);
1891 
1892     reason = ProcessMessage::eInvalidCrashReason;
1893 
1894     switch (info->si_code)
1895     {
1896     default:
1897         assert(false && "unexpected si_code for SIGBUS");
1898         break;
1899     case BUS_ADRALN:
1900         reason = ProcessMessage::eIllegalAlignment;
1901         break;
1902     case BUS_ADRERR:
1903         reason = ProcessMessage::eIllegalAddress;
1904         break;
1905     case BUS_OBJERR:
1906         reason = ProcessMessage::eHardwareError;
1907         break;
1908     }
1909 
1910     return reason;
1911 }
1912 
1913 void
ServeOperation(OperationArgs * args)1914 ProcessMonitor::ServeOperation(OperationArgs *args)
1915 {
1916     int status;
1917     pollfd fdset;
1918 
1919     ProcessMonitor *monitor = args->m_monitor;
1920 
1921     fdset.fd = monitor->m_server_fd;
1922     fdset.events = POLLIN | POLLPRI;
1923     fdset.revents = 0;
1924 
1925     // We are finised with the arguments and are ready to go.  Sync with the
1926     // parent thread and start serving operations on the inferior.
1927     sem_post(&args->m_semaphore);
1928 
1929     for (;;)
1930     {
1931         if ((status = poll(&fdset, 1, -1)) < 0)
1932         {
1933             switch (errno)
1934             {
1935             default:
1936                 assert(false && "Unexpected poll() failure!");
1937                 continue;
1938 
1939             case EINTR: continue; // Just poll again.
1940             case EBADF: return;   // Connection terminated.
1941             }
1942         }
1943 
1944         assert(status == 1 && "Too many descriptors!");
1945 
1946         if (fdset.revents & POLLIN)
1947         {
1948             Operation *op = NULL;
1949 
1950         READ_AGAIN:
1951             if ((status = read(fdset.fd, &op, sizeof(op))) < 0)
1952             {
1953                 // There is only one acceptable failure.
1954                 assert(errno == EINTR);
1955                 goto READ_AGAIN;
1956             }
1957             if (status == 0)
1958                 continue; // Poll again. The connection probably terminated.
1959             assert(status == sizeof(op));
1960             op->Execute(monitor);
1961             write(fdset.fd, &op, sizeof(op));
1962         }
1963     }
1964 }
1965 
1966 void
DoOperation(Operation * op)1967 ProcessMonitor::DoOperation(Operation *op)
1968 {
1969     int status;
1970     Operation *ack = NULL;
1971     Mutex::Locker lock(m_server_mutex);
1972 
1973     // FIXME: Do proper error checking here.
1974     write(m_client_fd, &op, sizeof(op));
1975 
1976 READ_AGAIN:
1977     if ((status = read(m_client_fd, &ack, sizeof(ack))) < 0)
1978     {
1979         // If interrupted by a signal handler try again.  Otherwise the monitor
1980         // thread probably died and we have a stale file descriptor -- abort the
1981         // operation.
1982         if (errno == EINTR)
1983             goto READ_AGAIN;
1984         return;
1985     }
1986 
1987     assert(status == sizeof(ack));
1988     assert(ack == op && "Invalid monitor thread response!");
1989 }
1990 
1991 size_t
ReadMemory(lldb::addr_t vm_addr,void * buf,size_t size,Error & error)1992 ProcessMonitor::ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
1993                            Error &error)
1994 {
1995     size_t result;
1996     ReadOperation op(vm_addr, buf, size, error, result);
1997     DoOperation(&op);
1998     return result;
1999 }
2000 
2001 size_t
WriteMemory(lldb::addr_t vm_addr,const void * buf,size_t size,lldb_private::Error & error)2002 ProcessMonitor::WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
2003                             lldb_private::Error &error)
2004 {
2005     size_t result;
2006     WriteOperation op(vm_addr, buf, size, error, result);
2007     DoOperation(&op);
2008     return result;
2009 }
2010 
2011 bool
ReadRegisterValue(lldb::tid_t tid,unsigned offset,const char * reg_name,unsigned size,RegisterValue & value)2012 ProcessMonitor::ReadRegisterValue(lldb::tid_t tid, unsigned offset, const char* reg_name,
2013                                   unsigned size, RegisterValue &value)
2014 {
2015     bool result;
2016     ReadRegOperation op(tid, offset, reg_name, value, result);
2017     DoOperation(&op);
2018     return result;
2019 }
2020 
2021 bool
WriteRegisterValue(lldb::tid_t tid,unsigned offset,const char * reg_name,const RegisterValue & value)2022 ProcessMonitor::WriteRegisterValue(lldb::tid_t tid, unsigned offset,
2023                                    const char* reg_name, const RegisterValue &value)
2024 {
2025     bool result;
2026     WriteRegOperation op(tid, offset, reg_name, value, result);
2027     DoOperation(&op);
2028     return result;
2029 }
2030 
2031 bool
ReadGPR(lldb::tid_t tid,void * buf,size_t buf_size)2032 ProcessMonitor::ReadGPR(lldb::tid_t tid, void *buf, size_t buf_size)
2033 {
2034     bool result;
2035     ReadGPROperation op(tid, buf, buf_size, result);
2036     DoOperation(&op);
2037     return result;
2038 }
2039 
2040 bool
ReadFPR(lldb::tid_t tid,void * buf,size_t buf_size)2041 ProcessMonitor::ReadFPR(lldb::tid_t tid, void *buf, size_t buf_size)
2042 {
2043     bool result;
2044     ReadFPROperation op(tid, buf, buf_size, result);
2045     DoOperation(&op);
2046     return result;
2047 }
2048 
2049 bool
ReadRegisterSet(lldb::tid_t tid,void * buf,size_t buf_size,unsigned int regset)2050 ProcessMonitor::ReadRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset)
2051 {
2052     bool result;
2053     ReadRegisterSetOperation op(tid, buf, buf_size, regset, result);
2054     DoOperation(&op);
2055     return result;
2056 }
2057 
2058 bool
WriteGPR(lldb::tid_t tid,void * buf,size_t buf_size)2059 ProcessMonitor::WriteGPR(lldb::tid_t tid, void *buf, size_t buf_size)
2060 {
2061     bool result;
2062     WriteGPROperation op(tid, buf, buf_size, result);
2063     DoOperation(&op);
2064     return result;
2065 }
2066 
2067 bool
WriteFPR(lldb::tid_t tid,void * buf,size_t buf_size)2068 ProcessMonitor::WriteFPR(lldb::tid_t tid, void *buf, size_t buf_size)
2069 {
2070     bool result;
2071     WriteFPROperation op(tid, buf, buf_size, result);
2072     DoOperation(&op);
2073     return result;
2074 }
2075 
2076 bool
WriteRegisterSet(lldb::tid_t tid,void * buf,size_t buf_size,unsigned int regset)2077 ProcessMonitor::WriteRegisterSet(lldb::tid_t tid, void *buf, size_t buf_size, unsigned int regset)
2078 {
2079     bool result;
2080     WriteRegisterSetOperation op(tid, buf, buf_size, regset, result);
2081     DoOperation(&op);
2082     return result;
2083 }
2084 
2085 bool
Resume(lldb::tid_t tid,uint32_t signo)2086 ProcessMonitor::Resume(lldb::tid_t tid, uint32_t signo)
2087 {
2088     bool result;
2089     Log *log (ProcessPOSIXLog::GetLogIfAllCategoriesSet (POSIX_LOG_PROCESS));
2090 
2091     if (log)
2092         log->Printf ("ProcessMonitor::%s() resuming thread = %"  PRIu64 " with signal %s", __FUNCTION__, tid,
2093                                  m_process->GetUnixSignals().GetSignalAsCString (signo));
2094     ResumeOperation op(tid, signo, result);
2095     DoOperation(&op);
2096     if (log)
2097         log->Printf ("ProcessMonitor::%s() resuming result = %s", __FUNCTION__, result ? "true" : "false");
2098     return result;
2099 }
2100 
2101 bool
SingleStep(lldb::tid_t tid,uint32_t signo)2102 ProcessMonitor::SingleStep(lldb::tid_t tid, uint32_t signo)
2103 {
2104     bool result;
2105     SingleStepOperation op(tid, signo, result);
2106     DoOperation(&op);
2107     return result;
2108 }
2109 
2110 bool
BringProcessIntoLimbo()2111 ProcessMonitor::BringProcessIntoLimbo()
2112 {
2113     bool result;
2114     KillOperation op(result);
2115     DoOperation(&op);
2116     return result;
2117 }
2118 
2119 bool
GetSignalInfo(lldb::tid_t tid,void * siginfo,int & ptrace_err)2120 ProcessMonitor::GetSignalInfo(lldb::tid_t tid, void *siginfo, int &ptrace_err)
2121 {
2122     bool result;
2123     SiginfoOperation op(tid, siginfo, result, ptrace_err);
2124     DoOperation(&op);
2125     return result;
2126 }
2127 
2128 bool
GetEventMessage(lldb::tid_t tid,unsigned long * message)2129 ProcessMonitor::GetEventMessage(lldb::tid_t tid, unsigned long *message)
2130 {
2131     bool result;
2132     EventMessageOperation op(tid, message, result);
2133     DoOperation(&op);
2134     return result;
2135 }
2136 
2137 lldb_private::Error
Detach(lldb::tid_t tid)2138 ProcessMonitor::Detach(lldb::tid_t tid)
2139 {
2140     lldb_private::Error error;
2141     if (tid != LLDB_INVALID_THREAD_ID)
2142     {
2143         DetachOperation op(tid, error);
2144         DoOperation(&op);
2145     }
2146     return error;
2147 }
2148 
2149 bool
DupDescriptor(const char * path,int fd,int flags)2150 ProcessMonitor::DupDescriptor(const char *path, int fd, int flags)
2151 {
2152     int target_fd = open(path, flags, 0666);
2153 
2154     if (target_fd == -1)
2155         return false;
2156 
2157     return (dup2(target_fd, fd) == -1) ? false : true;
2158 }
2159 
2160 void
StopMonitoringChildProcess()2161 ProcessMonitor::StopMonitoringChildProcess()
2162 {
2163     lldb::thread_result_t thread_result;
2164 
2165     if (IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
2166     {
2167         Host::ThreadCancel(m_monitor_thread, NULL);
2168         Host::ThreadJoin(m_monitor_thread, &thread_result, NULL);
2169         m_monitor_thread = LLDB_INVALID_HOST_THREAD;
2170     }
2171 }
2172 
2173 void
StopMonitor()2174 ProcessMonitor::StopMonitor()
2175 {
2176     StopMonitoringChildProcess();
2177     StopOpThread();
2178     CloseFD(m_terminal_fd);
2179     CloseFD(m_client_fd);
2180     CloseFD(m_server_fd);
2181 }
2182 
2183 void
StopOpThread()2184 ProcessMonitor::StopOpThread()
2185 {
2186     lldb::thread_result_t result;
2187 
2188     if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
2189         return;
2190 
2191     Host::ThreadCancel(m_operation_thread, NULL);
2192     Host::ThreadJoin(m_operation_thread, &result, NULL);
2193     m_operation_thread = LLDB_INVALID_HOST_THREAD;
2194 }
2195 
2196 void
CloseFD(int & fd)2197 ProcessMonitor::CloseFD(int &fd)
2198 {
2199     if (fd != -1)
2200     {
2201         close(fd);
2202         fd = -1;
2203     }
2204 }
2205