blob: af8d7c39c35e66e17cd7f69b0b7b44ad8e6809aa [file] [log] [blame]
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001//===-- 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// C Includes
11#include <errno.h>
12#include <poll.h>
13#include <string.h>
14#include <unistd.h>
15#include <sys/ptrace.h>
16#include <sys/socket.h>
17#include <sys/types.h>
18#include <sys/wait.h>
19
20// C++ Includes
21// Other libraries and framework includes
22#include "lldb/Core/Error.h"
Johnny Chen13e8e1c2011-05-13 21:29:50 +000023#include "lldb/Core/RegisterValue.h"
Stephen Wilsone6f9f662010-07-24 02:19:04 +000024#include "lldb/Core/Scalar.h"
25#include "lldb/Host/Host.h"
26#include "lldb/Target/Thread.h"
27#include "lldb/Target/RegisterContext.h"
28#include "lldb/Utility/PseudoTerminal.h"
29
30#include "LinuxThread.h"
31#include "ProcessLinux.h"
32#include "ProcessMonitor.h"
33
34
35using namespace lldb_private;
36
37//------------------------------------------------------------------------------
38// Static implementations of ProcessMonitor::ReadMemory and
39// ProcessMonitor::WriteMemory. This enables mutual recursion between these
40// functions without needed to go thru the thread funnel.
41
42static size_t
43DoReadMemory(lldb::pid_t pid, unsigned word_size,
44 lldb::addr_t vm_addr, void *buf, size_t size, Error &error)
45{
46 unsigned char *dst = static_cast<unsigned char*>(buf);
47 size_t bytes_read;
48 size_t remainder;
49 long data;
50
51 for (bytes_read = 0; bytes_read < size; bytes_read += remainder)
52 {
53 errno = 0;
54 data = ptrace(PTRACE_PEEKDATA, pid, vm_addr, NULL);
55
56 if (data == -1L && errno)
57 {
58 error.SetErrorToErrno();
59 return bytes_read;
60 }
61
62 remainder = size - bytes_read;
63 remainder = remainder > word_size ? word_size : remainder;
64 for (unsigned i = 0; i < remainder; ++i)
65 dst[i] = ((data >> i*8) & 0xFF);
66 vm_addr += word_size;
67 dst += word_size;
68 }
69
70 return bytes_read;
71}
72
73static size_t
74DoWriteMemory(lldb::pid_t pid, unsigned word_size,
75 lldb::addr_t vm_addr, const void *buf, size_t size, Error &error)
76{
77 const unsigned char *src = static_cast<const unsigned char*>(buf);
78 size_t bytes_written = 0;
79 size_t remainder;
80
81 for (bytes_written = 0; bytes_written < size; bytes_written += remainder)
82 {
83 remainder = size - bytes_written;
84 remainder = remainder > word_size ? word_size : remainder;
85
86 if (remainder == word_size)
87 {
88 unsigned long data = 0;
89 for (unsigned i = 0; i < word_size; ++i)
90 data |= (unsigned long)src[i] << i*8;
91
92 if (ptrace(PTRACE_POKEDATA, pid, vm_addr, data))
93 {
94 error.SetErrorToErrno();
95 return bytes_written;
96 }
97 }
98 else
99 {
100 unsigned char buff[8];
101 if (DoReadMemory(pid, word_size, vm_addr,
102 buff, word_size, error) != word_size)
103 return bytes_written;
104
105 memcpy(buff, src, remainder);
106
107 if (DoWriteMemory(pid, word_size, vm_addr,
108 buff, word_size, error) != word_size)
109 return bytes_written;
110 }
111
112 vm_addr += word_size;
113 src += word_size;
114 }
115 return bytes_written;
116}
117
Stephen Wilson26977162011-03-23 02:14:42 +0000118// Simple helper function to ensure flags are enabled on the given file
119// descriptor.
120static bool
121EnsureFDFlags(int fd, int flags, Error &error)
122{
123 int status;
124
125 if ((status = fcntl(fd, F_GETFL)) == -1)
126 {
127 error.SetErrorToErrno();
128 return false;
129 }
130
131 if (fcntl(fd, F_SETFL, status | flags) == -1)
132 {
133 error.SetErrorToErrno();
134 return false;
135 }
136
137 return true;
138}
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000139
140//------------------------------------------------------------------------------
141/// @class Operation
142/// @brief Represents a ProcessMonitor operation.
143///
144/// Under Linux, it is not possible to ptrace() from any other thread but the
145/// one that spawned or attached to the process from the start. Therefore, when
146/// a ProcessMonitor is asked to deliver or change the state of an inferior
147/// process the operation must be "funneled" to a specific thread to perform the
148/// task. The Operation class provides an abstract base for all services the
149/// ProcessMonitor must perform via the single virtual function Execute, thus
150/// encapsulating the code that needs to run in the privileged context.
151class Operation
152{
153public:
154 virtual void Execute(ProcessMonitor *monitor) = 0;
155};
156
157//------------------------------------------------------------------------------
158/// @class ReadOperation
159/// @brief Implements ProcessMonitor::ReadMemory.
160class ReadOperation : public Operation
161{
162public:
163 ReadOperation(lldb::addr_t addr, void *buff, size_t size,
164 Error &error, size_t &result)
165 : m_addr(addr), m_buff(buff), m_size(size),
166 m_error(error), m_result(result)
167 { }
168
169 void Execute(ProcessMonitor *monitor);
170
171private:
172 lldb::addr_t m_addr;
173 void *m_buff;
174 size_t m_size;
175 Error &m_error;
176 size_t &m_result;
177};
178
179void
180ReadOperation::Execute(ProcessMonitor *monitor)
181{
182 const unsigned word_size = monitor->GetProcess().GetAddressByteSize();
183 lldb::pid_t pid = monitor->GetPID();
184
185 m_result = DoReadMemory(pid, word_size, m_addr, m_buff, m_size, m_error);
186}
187
188//------------------------------------------------------------------------------
189/// @class ReadOperation
190/// @brief Implements ProcessMonitor::WriteMemory.
191class WriteOperation : public Operation
192{
193public:
194 WriteOperation(lldb::addr_t addr, const void *buff, size_t size,
195 Error &error, size_t &result)
196 : m_addr(addr), m_buff(buff), m_size(size),
197 m_error(error), m_result(result)
198 { }
199
200 void Execute(ProcessMonitor *monitor);
201
202private:
203 lldb::addr_t m_addr;
204 const void *m_buff;
205 size_t m_size;
206 Error &m_error;
207 size_t &m_result;
208};
209
210void
211WriteOperation::Execute(ProcessMonitor *monitor)
212{
213 const unsigned word_size = monitor->GetProcess().GetAddressByteSize();
214 lldb::pid_t pid = monitor->GetPID();
215
216 m_result = DoWriteMemory(pid, word_size, m_addr, m_buff, m_size, m_error);
217}
218
219//------------------------------------------------------------------------------
220/// @class ReadRegOperation
221/// @brief Implements ProcessMonitor::ReadRegisterValue.
222class ReadRegOperation : public Operation
223{
224public:
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000225 ReadRegOperation(unsigned offset, RegisterValue &value, bool &result)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000226 : m_offset(offset), m_value(value), m_result(result)
227 { }
228
229 void Execute(ProcessMonitor *monitor);
230
231private:
232 unsigned m_offset;
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000233 RegisterValue &m_value;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000234 bool &m_result;
235};
236
237void
238ReadRegOperation::Execute(ProcessMonitor *monitor)
239{
240 lldb::pid_t pid = monitor->GetPID();
241
242 // Set errno to zero so that we can detect a failed peek.
243 errno = 0;
244 unsigned long data = ptrace(PTRACE_PEEKUSER, pid, m_offset, NULL);
245
246 if (data == -1UL && errno)
247 m_result = false;
248 else
249 {
250 m_value = data;
251 m_result = true;
252 }
253}
254
255//------------------------------------------------------------------------------
256/// @class WriteRegOperation
257/// @brief Implements ProcessMonitor::WriteRegisterValue.
258class WriteRegOperation : public Operation
259{
260public:
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000261 WriteRegOperation(unsigned offset, const RegisterValue &value, bool &result)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000262 : m_offset(offset), m_value(value), m_result(result)
263 { }
264
265 void Execute(ProcessMonitor *monitor);
266
267private:
268 unsigned m_offset;
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000269 const RegisterValue &m_value;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000270 bool &m_result;
271};
272
273void
274WriteRegOperation::Execute(ProcessMonitor *monitor)
275{
276 lldb::pid_t pid = monitor->GetPID();
277
Johnny Chen13e8e1c2011-05-13 21:29:50 +0000278 if (ptrace(PTRACE_POKEUSER, pid, m_offset, m_value.GetAsUInt64()))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000279 m_result = false;
280 else
281 m_result = true;
282}
283
284//------------------------------------------------------------------------------
Stephen Wilsonade1aea2011-01-19 01:31:38 +0000285/// @class ReadGPROperation
286/// @brief Implements ProcessMonitor::ReadGPR.
287class ReadGPROperation : public Operation
288{
289public:
290 ReadGPROperation(void *buf, bool &result)
291 : m_buf(buf), m_result(result)
292 { }
293
294 void Execute(ProcessMonitor *monitor);
295
296private:
297 void *m_buf;
298 bool &m_result;
299};
300
301void
302ReadGPROperation::Execute(ProcessMonitor *monitor)
303{
304 if (ptrace(PTRACE_GETREGS, monitor->GetPID(), NULL, m_buf) < 0)
305 m_result = false;
306 else
307 m_result = true;
308}
309
310//------------------------------------------------------------------------------
311/// @class ReadFPROperation
312/// @brief Implements ProcessMonitor::ReadFPR.
313class ReadFPROperation : public Operation
314{
315public:
316 ReadFPROperation(void *buf, bool &result)
317 : m_buf(buf), m_result(result)
318 { }
319
320 void Execute(ProcessMonitor *monitor);
321
322private:
323 void *m_buf;
324 bool &m_result;
325};
326
327void
328ReadFPROperation::Execute(ProcessMonitor *monitor)
329{
330 if (ptrace(PTRACE_GETFPREGS, monitor->GetPID(), NULL, m_buf) < 0)
331 m_result = false;
332 else
333 m_result = true;
334}
335
336//------------------------------------------------------------------------------
Peter Collingbourne10bc0102011-06-03 20:41:02 +0000337/// @class WriteGPROperation
338/// @brief Implements ProcessMonitor::WriteGPR.
339class WriteGPROperation : public Operation
340{
341public:
342 WriteGPROperation(void *buf, bool &result)
343 : m_buf(buf), m_result(result)
344 { }
345
346 void Execute(ProcessMonitor *monitor);
347
348private:
349 void *m_buf;
350 bool &m_result;
351};
352
353void
354WriteGPROperation::Execute(ProcessMonitor *monitor)
355{
356 if (ptrace(PTRACE_SETREGS, monitor->GetPID(), NULL, m_buf) < 0)
357 m_result = false;
358 else
359 m_result = true;
360}
361
362//------------------------------------------------------------------------------
363/// @class WriteFPROperation
364/// @brief Implements ProcessMonitor::WriteFPR.
365class WriteFPROperation : public Operation
366{
367public:
368 WriteFPROperation(void *buf, bool &result)
369 : m_buf(buf), m_result(result)
370 { }
371
372 void Execute(ProcessMonitor *monitor);
373
374private:
375 void *m_buf;
376 bool &m_result;
377};
378
379void
380WriteFPROperation::Execute(ProcessMonitor *monitor)
381{
382 if (ptrace(PTRACE_SETFPREGS, monitor->GetPID(), NULL, m_buf) < 0)
383 m_result = false;
384 else
385 m_result = true;
386}
387
388//------------------------------------------------------------------------------
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000389/// @class ResumeOperation
390/// @brief Implements ProcessMonitor::Resume.
391class ResumeOperation : public Operation
392{
393public:
Stephen Wilson84ffe702011-03-30 15:55:52 +0000394 ResumeOperation(lldb::tid_t tid, uint32_t signo, bool &result) :
395 m_tid(tid), m_signo(signo), m_result(result) { }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000396
397 void Execute(ProcessMonitor *monitor);
398
399private:
400 lldb::tid_t m_tid;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000401 uint32_t m_signo;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000402 bool &m_result;
403};
404
405void
406ResumeOperation::Execute(ProcessMonitor *monitor)
407{
Stephen Wilson84ffe702011-03-30 15:55:52 +0000408 int data = 0;
409
410 if (m_signo != LLDB_INVALID_SIGNAL_NUMBER)
411 data = m_signo;
412
413 if (ptrace(PTRACE_CONT, m_tid, NULL, data))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000414 m_result = false;
415 else
416 m_result = true;
417}
418
419//------------------------------------------------------------------------------
420/// @class ResumeOperation
421/// @brief Implements ProcessMonitor::SingleStep.
422class SingleStepOperation : public Operation
423{
424public:
Stephen Wilson84ffe702011-03-30 15:55:52 +0000425 SingleStepOperation(lldb::tid_t tid, uint32_t signo, bool &result)
426 : m_tid(tid), m_signo(signo), m_result(result) { }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000427
428 void Execute(ProcessMonitor *monitor);
429
430private:
431 lldb::tid_t m_tid;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000432 uint32_t m_signo;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000433 bool &m_result;
434};
435
436void
437SingleStepOperation::Execute(ProcessMonitor *monitor)
438{
Stephen Wilson84ffe702011-03-30 15:55:52 +0000439 int data = 0;
440
441 if (m_signo != LLDB_INVALID_SIGNAL_NUMBER)
442 data = m_signo;
443
444 if (ptrace(PTRACE_SINGLESTEP, m_tid, NULL, data))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000445 m_result = false;
446 else
447 m_result = true;
448}
449
450//------------------------------------------------------------------------------
451/// @class SiginfoOperation
452/// @brief Implements ProcessMonitor::GetSignalInfo.
453class SiginfoOperation : public Operation
454{
455public:
456 SiginfoOperation(lldb::tid_t tid, void *info, bool &result)
457 : m_tid(tid), m_info(info), m_result(result) { }
458
459 void Execute(ProcessMonitor *monitor);
460
461private:
462 lldb::tid_t m_tid;
463 void *m_info;
464 bool &m_result;
465};
466
467void
468SiginfoOperation::Execute(ProcessMonitor *monitor)
469{
470 if (ptrace(PTRACE_GETSIGINFO, m_tid, NULL, m_info))
471 m_result = false;
472 else
473 m_result = true;
474}
475
476//------------------------------------------------------------------------------
477/// @class EventMessageOperation
478/// @brief Implements ProcessMonitor::GetEventMessage.
479class EventMessageOperation : public Operation
480{
481public:
482 EventMessageOperation(lldb::tid_t tid, unsigned long *message, bool &result)
483 : m_tid(tid), m_message(message), m_result(result) { }
484
485 void Execute(ProcessMonitor *monitor);
486
487private:
488 lldb::tid_t m_tid;
489 unsigned long *m_message;
490 bool &m_result;
491};
492
493void
494EventMessageOperation::Execute(ProcessMonitor *monitor)
495{
496 if (ptrace(PTRACE_GETEVENTMSG, m_tid, NULL, m_message))
497 m_result = false;
498 else
499 m_result = true;
500}
501
502//------------------------------------------------------------------------------
503/// @class KillOperation
504/// @brief Implements ProcessMonitor::BringProcessIntoLimbo.
505class KillOperation : public Operation
506{
507public:
508 KillOperation(bool &result) : m_result(result) { }
509
510 void Execute(ProcessMonitor *monitor);
511
512private:
513 bool &m_result;
514};
515
516void
517KillOperation::Execute(ProcessMonitor *monitor)
518{
519 lldb::pid_t pid = monitor->GetPID();
520
521 if (ptrace(PTRACE_KILL, pid, NULL, NULL))
522 m_result = false;
523 else
524 m_result = true;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000525}
526
527ProcessMonitor::LaunchArgs::LaunchArgs(ProcessMonitor *monitor,
528 lldb_private::Module *module,
529 char const **argv,
530 char const **envp,
531 const char *stdin_path,
532 const char *stdout_path,
533 const char *stderr_path)
534 : m_monitor(monitor),
535 m_module(module),
536 m_argv(argv),
537 m_envp(envp),
538 m_stdin_path(stdin_path),
539 m_stdout_path(stdout_path),
540 m_stderr_path(stderr_path)
541{
542 sem_init(&m_semaphore, 0, 0);
543}
544
545ProcessMonitor::LaunchArgs::~LaunchArgs()
546{
547 sem_destroy(&m_semaphore);
548}
549
550//------------------------------------------------------------------------------
551/// The basic design of the ProcessMonitor is built around two threads.
552///
553/// One thread (@see SignalThread) simply blocks on a call to waitpid() looking
554/// for changes in the debugee state. When a change is detected a
555/// ProcessMessage is sent to the associated ProcessLinux instance. This thread
556/// "drives" state changes in the debugger.
557///
558/// The second thread (@see OperationThread) is responsible for two things 1)
Greg Clayton710dd5a2011-01-08 20:28:42 +0000559/// launching or attaching to the inferior process, and then 2) servicing
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000560/// operations such as register reads/writes, stepping, etc. See the comments
561/// on the Operation class for more info as to why this is needed.
562ProcessMonitor::ProcessMonitor(ProcessLinux *process,
563 Module *module,
564 const char *argv[],
565 const char *envp[],
566 const char *stdin_path,
567 const char *stdout_path,
568 const char *stderr_path,
569 lldb_private::Error &error)
570 : m_process(process),
571 m_operation_thread(LLDB_INVALID_HOST_THREAD),
572 m_pid(LLDB_INVALID_PROCESS_ID),
573 m_terminal_fd(-1),
Stephen Wilson9212d7f2011-01-04 21:40:25 +0000574 m_monitor_thread(LLDB_INVALID_HOST_THREAD),
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000575 m_client_fd(-1),
576 m_server_fd(-1)
577{
Stephen Wilson57740ec2011-01-15 00:12:41 +0000578 std::auto_ptr<LaunchArgs> args;
579
580 args.reset(new LaunchArgs(this, module, argv, envp,
581 stdin_path, stdout_path, stderr_path));
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000582
583 // Server/client descriptors.
584 if (!EnableIPC())
585 {
586 error.SetErrorToGenericError();
587 error.SetErrorString("Monitor failed to initialize.");
588 }
589
Stephen Wilson57740ec2011-01-15 00:12:41 +0000590 StartOperationThread(args.get(), error);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000591 if (!error.Success())
592 return;
593
594WAIT_AGAIN:
595 // Wait for the operation thread to initialize.
Stephen Wilson57740ec2011-01-15 00:12:41 +0000596 if (sem_wait(&args->m_semaphore))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000597 {
598 if (errno == EINTR)
599 goto WAIT_AGAIN;
600 else
601 {
602 error.SetErrorToErrno();
603 return;
604 }
605 }
606
607 // Check that the launch was a success.
Stephen Wilson57740ec2011-01-15 00:12:41 +0000608 if (!args->m_error.Success())
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000609 {
610 StopOperationThread();
Stephen Wilson57740ec2011-01-15 00:12:41 +0000611 error = args->m_error;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000612 return;
613 }
614
615 // Finally, start monitoring the child process for change in state.
Stephen Wilson57740ec2011-01-15 00:12:41 +0000616 m_monitor_thread = Host::StartMonitoringChildProcess(
617 ProcessMonitor::MonitorCallback, this, GetPID(), true);
Stephen Wilsond4182f42011-02-09 20:10:35 +0000618 if (!IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000619 {
620 error.SetErrorToGenericError();
621 error.SetErrorString("Process launch failed.");
622 return;
623 }
624}
625
626ProcessMonitor::~ProcessMonitor()
627{
Stephen Wilson84ffe702011-03-30 15:55:52 +0000628 StopMonitor();
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000629}
630
631//------------------------------------------------------------------------------
632// Thread setup and tear down.
633void
634ProcessMonitor::StartOperationThread(LaunchArgs *args, Error &error)
635{
636 static const char *g_thread_name = "lldb.process.linux.operation";
637
Stephen Wilsond4182f42011-02-09 20:10:35 +0000638 if (IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000639 return;
640
641 m_operation_thread =
642 Host::ThreadCreate(g_thread_name, OperationThread, args, &error);
643}
644
645void
646ProcessMonitor::StopOperationThread()
647{
648 lldb::thread_result_t result;
649
Stephen Wilsond4182f42011-02-09 20:10:35 +0000650 if (!IS_VALID_LLDB_HOST_THREAD(m_operation_thread))
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000651 return;
652
653 Host::ThreadCancel(m_operation_thread, NULL);
654 Host::ThreadJoin(m_operation_thread, &result, NULL);
655}
656
657void *
658ProcessMonitor::OperationThread(void *arg)
659{
660 LaunchArgs *args = static_cast<LaunchArgs*>(arg);
661
662 if (!Launch(args))
663 return NULL;
664
Stephen Wilson570243b2011-01-19 01:37:06 +0000665 ServeOperation(args);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000666 return NULL;
667}
668
669bool
670ProcessMonitor::Launch(LaunchArgs *args)
671{
672 ProcessMonitor *monitor = args->m_monitor;
673 ProcessLinux &process = monitor->GetProcess();
674 const char **argv = args->m_argv;
675 const char **envp = args->m_envp;
676 const char *stdin_path = args->m_stdin_path;
677 const char *stdout_path = args->m_stdout_path;
678 const char *stderr_path = args->m_stderr_path;
679
680 lldb_utility::PseudoTerminal terminal;
681 const size_t err_len = 1024;
682 char err_str[err_len];
683 lldb::pid_t pid;
684
685 lldb::ThreadSP inferior;
686
Stephen Wilson57740ec2011-01-15 00:12:41 +0000687 // Propagate the environment if one is not supplied.
688 if (envp == NULL || envp[0] == NULL)
689 envp = const_cast<const char **>(environ);
690
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000691 // Pseudo terminal setup.
692 if (!terminal.OpenFirstAvailableMaster(O_RDWR | O_NOCTTY, err_str, err_len))
693 {
694 args->m_error.SetErrorToGenericError();
695 args->m_error.SetErrorString("Could not open controlling TTY.");
696 goto FINISH;
697 }
698
699 if ((pid = terminal.Fork(err_str, err_len)) < 0)
700 {
701 args->m_error.SetErrorToGenericError();
702 args->m_error.SetErrorString("Process fork failed.");
703 goto FINISH;
704 }
705
706 // Child process.
707 if (pid == 0)
708 {
709 // Trace this process.
710 ptrace(PTRACE_TRACEME, 0, NULL, NULL);
711
712 // Do not inherit setgid powers.
713 setgid(getgid());
714
715 // Let us have our own process group.
716 setpgid(0, 0);
717
Greg Clayton710dd5a2011-01-08 20:28:42 +0000718 // Dup file descriptors if needed.
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000719 //
720 // FIXME: If two or more of the paths are the same we needlessly open
721 // the same file multiple times.
722 if (stdin_path != NULL && stdin_path[0])
723 if (!DupDescriptor(stdin_path, STDIN_FILENO, O_RDONLY | O_CREAT))
724 exit(1);
725
726 if (stdout_path != NULL && stdout_path[0])
727 if (!DupDescriptor(stdout_path, STDOUT_FILENO, O_WRONLY | O_CREAT))
728 exit(1);
729
730 if (stderr_path != NULL && stderr_path[0])
731 if (!DupDescriptor(stderr_path, STDOUT_FILENO, O_WRONLY | O_CREAT))
732 exit(1);
733
734 // Execute. We should never return.
735 execve(argv[0],
736 const_cast<char *const *>(argv),
737 const_cast<char *const *>(envp));
738 exit(-1);
739 }
740
741 // Wait for the child process to to trap on its call to execve.
742 int status;
743 if ((status = waitpid(pid, NULL, 0)) < 0)
744 {
745 // execve likely failed for some reason.
746 args->m_error.SetErrorToErrno();
747 goto FINISH;
748 }
749 assert(status == pid && "Could not sync with inferior process.");
750
751 // Have the child raise an event on exit. This is used to keep the child in
752 // limbo until it is destroyed.
753 if (ptrace(PTRACE_SETOPTIONS, pid, NULL, PTRACE_O_TRACEEXIT) < 0)
754 {
755 args->m_error.SetErrorToErrno();
756 goto FINISH;
757 }
758
759 // Release the master terminal descriptor and pass it off to the
760 // ProcessMonitor instance. Similarly stash the inferior pid.
761 monitor->m_terminal_fd = terminal.ReleaseMasterFileDescriptor();
762 monitor->m_pid = pid;
763
Stephen Wilson26977162011-03-23 02:14:42 +0000764 // Set the terminal fd to be in non blocking mode (it simplifies the
765 // implementation of ProcessLinux::GetSTDOUT to have a non-blocking
766 // descriptor to read from).
767 if (!EnsureFDFlags(monitor->m_terminal_fd, O_NONBLOCK, args->m_error))
768 goto FINISH;
769
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000770 // Update the process thread list with this new thread and mark it as
771 // current.
772 inferior.reset(new LinuxThread(process, pid));
773 process.GetThreadList().AddThread(inferior);
Stephen Wilson5a8feea2011-01-04 21:39:27 +0000774 process.GetThreadList().SetSelectedThreadByID(pid);
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000775
776 // Let our process instance know the thread has stopped.
777 process.SendMessage(ProcessMessage::Trace(pid));
778
779FINISH:
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000780 return args->m_error.Success();
781}
782
783bool
784ProcessMonitor::EnableIPC()
785{
786 int fd[2];
787
788 if (socketpair(AF_UNIX, SOCK_STREAM, 0, fd))
789 return false;
790
791 m_client_fd = fd[0];
792 m_server_fd = fd[1];
793 return true;
794}
795
796bool
797ProcessMonitor::MonitorCallback(void *callback_baton,
798 lldb::pid_t pid,
799 int signal,
800 int status)
801{
802 ProcessMessage message;
803 ProcessMonitor *monitor = static_cast<ProcessMonitor*>(callback_baton);
804 ProcessLinux *process = monitor->m_process;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000805 bool stop_monitoring;
806 siginfo_t info;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000807
Stephen Wilson84ffe702011-03-30 15:55:52 +0000808 if (!monitor->GetSignalInfo(pid, &info))
809 stop_monitoring = true; // pid is gone. Bail.
810 else {
811 switch (info.si_signo)
812 {
813 case SIGTRAP:
814 message = MonitorSIGTRAP(monitor, &info, pid);
815 break;
816
817 default:
818 message = MonitorSignal(monitor, &info, pid);
819 break;
820 }
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000821
Stephen Wilson84ffe702011-03-30 15:55:52 +0000822 process->SendMessage(message);
823 stop_monitoring = message.GetKind() == ProcessMessage::eExitMessage;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000824 }
825
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000826 return stop_monitoring;
827}
828
829ProcessMessage
Stephen Wilson84ffe702011-03-30 15:55:52 +0000830ProcessMonitor::MonitorSIGTRAP(ProcessMonitor *monitor,
831 const struct siginfo *info, lldb::pid_t pid)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000832{
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000833 ProcessMessage message;
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000834
Stephen Wilson84ffe702011-03-30 15:55:52 +0000835 assert(info->si_signo == SIGTRAP && "Unexpected child signal!");
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000836
Stephen Wilson84ffe702011-03-30 15:55:52 +0000837 switch (info->si_code)
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000838 {
839 default:
840 assert(false && "Unexpected SIGTRAP code!");
841 break;
842
843 case (SIGTRAP | (PTRACE_EVENT_EXIT << 8)):
844 {
845 // The inferior process is about to exit. Maintain the process in a
846 // state of "limbo" until we are explicitly commanded to detach,
847 // destroy, resume, etc.
848 unsigned long data = 0;
849 if (!monitor->GetEventMessage(pid, &data))
850 data = -1;
Stephen Wilson84ffe702011-03-30 15:55:52 +0000851 message = ProcessMessage::Limbo(pid, (data >> 8));
Stephen Wilsone6f9f662010-07-24 02:19:04 +0000852 break;
853 }
854
855 case 0:
856 case TRAP_TRACE:
857 message = ProcessMessage::Trace(pid);
858 break;
859
860 case SI_KERNEL:
861 case TRAP_BRKPT:
862 message = ProcessMessage::Break(pid);
863 break;
864 }
865
866 return message;
867}
868
Stephen Wilson84ffe702011-03-30 15:55:52 +0000869ProcessMessage
870ProcessMonitor::MonitorSignal(ProcessMonitor *monitor,
871 const struct siginfo *info, lldb::pid_t pid)
872{
873 ProcessMessage message;
874 int signo = info->si_signo;
875
876 // POSIX says that process behaviour is undefined after it ignores a SIGFPE,
877 // SIGILL, SIGSEGV, or SIGBUS *unless* that signal was generated by a
878 // kill(2) or raise(3). Similarly for tgkill(2) on Linux.
879 //
880 // IOW, user generated signals never generate what we consider to be a
881 // "crash".
882 //
883 // Similarly, ACK signals generated by this monitor.
884 if (info->si_code == SI_TKILL || info->si_code == SI_USER)
885 {
886 if (info->si_pid == getpid())
887 return ProcessMessage::SignalDelivered(pid, signo);
888 else
889 return ProcessMessage::Signal(pid, signo);
890 }
891
892 if (signo == SIGSEGV) {
893 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
894 ProcessMessage::CrashReason reason = GetCrashReasonForSIGSEGV(info);
895 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
896 }
897
898 if (signo == SIGILL) {
899 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
900 ProcessMessage::CrashReason reason = GetCrashReasonForSIGILL(info);
901 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
902 }
903
904 if (signo == SIGFPE) {
905 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
906 ProcessMessage::CrashReason reason = GetCrashReasonForSIGFPE(info);
907 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
908 }
909
910 if (signo == SIGBUS) {
911 lldb::addr_t fault_addr = reinterpret_cast<lldb::addr_t>(info->si_addr);
912 ProcessMessage::CrashReason reason = GetCrashReasonForSIGBUS(info);
913 return ProcessMessage::Crash(pid, reason, signo, fault_addr);
914 }
915
916 // Everything else is "normal" and does not require any special action on
917 // our part.
918 return ProcessMessage::Signal(pid, signo);
919}
920
921ProcessMessage::CrashReason
922ProcessMonitor::GetCrashReasonForSIGSEGV(const struct siginfo *info)
923{
924 ProcessMessage::CrashReason reason;
925 assert(info->si_signo == SIGSEGV);
926
927 reason = ProcessMessage::eInvalidCrashReason;
928
929 switch (info->si_code)
930 {
931 default:
932 assert(false && "unexpected si_code for SIGSEGV");
933 break;
934 case SEGV_MAPERR:
935 reason = ProcessMessage::eInvalidAddress;
936 break;
937 case SEGV_ACCERR:
938 reason = ProcessMessage::ePrivilegedAddress;
939 break;
940 }
941
942 return reason;
943}
944
945ProcessMessage::CrashReason
946ProcessMonitor::GetCrashReasonForSIGILL(const struct siginfo *info)
947{
948 ProcessMessage::CrashReason reason;
949 assert(info->si_signo == SIGILL);
950
951 reason = ProcessMessage::eInvalidCrashReason;
952
953 switch (info->si_code)
954 {
955 default:
956 assert(false && "unexpected si_code for SIGILL");
957 break;
958 case ILL_ILLOPC:
959 reason = ProcessMessage::eIllegalOpcode;
960 break;
961 case ILL_ILLOPN:
962 reason = ProcessMessage::eIllegalOperand;
963 break;
964 case ILL_ILLADR:
965 reason = ProcessMessage::eIllegalAddressingMode;
966 break;
967 case ILL_ILLTRP:
968 reason = ProcessMessage::eIllegalTrap;
969 break;
970 case ILL_PRVOPC:
971 reason = ProcessMessage::ePrivilegedOpcode;
972 break;
973 case ILL_PRVREG:
974 reason = ProcessMessage::ePrivilegedRegister;
975 break;
976 case ILL_COPROC:
977 reason = ProcessMessage::eCoprocessorError;
978 break;
979 case ILL_BADSTK:
980 reason = ProcessMessage::eInternalStackError;
981 break;
982 }
983
984 return reason;
985}
986
987ProcessMessage::CrashReason
988ProcessMonitor::GetCrashReasonForSIGFPE(const struct siginfo *info)
989{
990 ProcessMessage::CrashReason reason;
991 assert(info->si_signo == SIGFPE);
992
993 reason = ProcessMessage::eInvalidCrashReason;
994
995 switch (info->si_code)
996 {
997 default:
998 assert(false && "unexpected si_code for SIGFPE");
999 break;
1000 case FPE_INTDIV:
1001 reason = ProcessMessage::eIntegerDivideByZero;
1002 break;
1003 case FPE_INTOVF:
1004 reason = ProcessMessage::eIntegerOverflow;
1005 break;
1006 case FPE_FLTDIV:
1007 reason = ProcessMessage::eFloatDivideByZero;
1008 break;
1009 case FPE_FLTOVF:
1010 reason = ProcessMessage::eFloatOverflow;
1011 break;
1012 case FPE_FLTUND:
1013 reason = ProcessMessage::eFloatUnderflow;
1014 break;
1015 case FPE_FLTRES:
1016 reason = ProcessMessage::eFloatInexactResult;
1017 break;
1018 case FPE_FLTINV:
1019 reason = ProcessMessage::eFloatInvalidOperation;
1020 break;
1021 case FPE_FLTSUB:
1022 reason = ProcessMessage::eFloatSubscriptRange;
1023 break;
1024 }
1025
1026 return reason;
1027}
1028
1029ProcessMessage::CrashReason
1030ProcessMonitor::GetCrashReasonForSIGBUS(const struct siginfo *info)
1031{
1032 ProcessMessage::CrashReason reason;
1033 assert(info->si_signo == SIGBUS);
1034
1035 reason = ProcessMessage::eInvalidCrashReason;
1036
1037 switch (info->si_code)
1038 {
1039 default:
1040 assert(false && "unexpected si_code for SIGBUS");
1041 break;
1042 case BUS_ADRALN:
1043 reason = ProcessMessage::eIllegalAlignment;
1044 break;
1045 case BUS_ADRERR:
1046 reason = ProcessMessage::eIllegalAddress;
1047 break;
1048 case BUS_OBJERR:
1049 reason = ProcessMessage::eHardwareError;
1050 break;
1051 }
1052
1053 return reason;
1054}
1055
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001056void
Stephen Wilson570243b2011-01-19 01:37:06 +00001057ProcessMonitor::ServeOperation(LaunchArgs *args)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001058{
1059 int status;
1060 pollfd fdset;
Stephen Wilson570243b2011-01-19 01:37:06 +00001061 ProcessMonitor *monitor = args->m_monitor;
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001062
1063 fdset.fd = monitor->m_server_fd;
1064 fdset.events = POLLIN | POLLPRI;
1065 fdset.revents = 0;
1066
Stephen Wilson570243b2011-01-19 01:37:06 +00001067 // We are finised with the arguments and are ready to go. Sync with the
1068 // parent thread and start serving operations on the inferior.
1069 sem_post(&args->m_semaphore);
1070
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001071 for (;;)
1072 {
1073 if ((status = poll(&fdset, 1, -1)) < 0)
1074 {
1075 switch (errno)
1076 {
1077 default:
1078 assert(false && "Unexpected poll() failure!");
1079 continue;
1080
1081 case EINTR: continue; // Just poll again.
1082 case EBADF: return; // Connection terminated.
1083 }
1084 }
1085
1086 assert(status == 1 && "Too many descriptors!");
1087
1088 if (fdset.revents & POLLIN)
1089 {
1090 Operation *op = NULL;
1091
1092 READ_AGAIN:
1093 if ((status = read(fdset.fd, &op, sizeof(op))) < 0)
1094 {
1095 // There is only one acceptable failure.
1096 assert(errno == EINTR);
1097 goto READ_AGAIN;
1098 }
1099
1100 assert(status == sizeof(op));
1101 op->Execute(monitor);
1102 write(fdset.fd, &op, sizeof(op));
1103 }
1104 }
1105}
1106
1107void
1108ProcessMonitor::DoOperation(Operation *op)
1109{
1110 int status;
1111 Operation *ack = NULL;
1112 Mutex::Locker lock(m_server_mutex);
1113
1114 // FIXME: Do proper error checking here.
1115 write(m_client_fd, &op, sizeof(op));
1116
1117READ_AGAIN:
1118 if ((status = read(m_client_fd, &ack, sizeof(ack))) < 0)
1119 {
1120 // If interrupted by a signal handler try again. Otherwise the monitor
1121 // thread probably died and we have a stale file descriptor -- abort the
1122 // operation.
1123 if (errno == EINTR)
1124 goto READ_AGAIN;
1125 return;
1126 }
1127
1128 assert(status == sizeof(ack));
1129 assert(ack == op && "Invalid monitor thread response!");
1130}
1131
1132size_t
1133ProcessMonitor::ReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
1134 Error &error)
1135{
1136 size_t result;
1137 ReadOperation op(vm_addr, buf, size, error, result);
1138 DoOperation(&op);
1139 return result;
1140}
1141
1142size_t
1143ProcessMonitor::WriteMemory(lldb::addr_t vm_addr, const void *buf, size_t size,
1144 lldb_private::Error &error)
1145{
1146 size_t result;
1147 WriteOperation op(vm_addr, buf, size, error, result);
1148 DoOperation(&op);
1149 return result;
1150}
1151
1152bool
Johnny Chen13e8e1c2011-05-13 21:29:50 +00001153ProcessMonitor::ReadRegisterValue(unsigned offset, RegisterValue &value)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001154{
1155 bool result;
1156 ReadRegOperation op(offset, value, result);
1157 DoOperation(&op);
1158 return result;
1159}
1160
1161bool
Johnny Chen13e8e1c2011-05-13 21:29:50 +00001162ProcessMonitor::WriteRegisterValue(unsigned offset, const RegisterValue &value)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001163{
1164 bool result;
1165 WriteRegOperation op(offset, value, result);
1166 DoOperation(&op);
1167 return result;
1168}
1169
1170bool
Stephen Wilsonade1aea2011-01-19 01:31:38 +00001171ProcessMonitor::ReadGPR(void *buf)
1172{
1173 bool result;
1174 ReadGPROperation op(buf, result);
1175 DoOperation(&op);
1176 return result;
1177}
1178
1179bool
1180ProcessMonitor::ReadFPR(void *buf)
1181{
1182 bool result;
1183 ReadFPROperation op(buf, result);
1184 DoOperation(&op);
1185 return result;
1186}
1187
1188bool
Peter Collingbourne10bc0102011-06-03 20:41:02 +00001189ProcessMonitor::WriteGPR(void *buf)
1190{
1191 bool result;
1192 WriteGPROperation op(buf, result);
1193 DoOperation(&op);
1194 return result;
1195}
1196
1197bool
1198ProcessMonitor::WriteFPR(void *buf)
1199{
1200 bool result;
1201 WriteFPROperation op(buf, result);
1202 DoOperation(&op);
1203 return result;
1204}
1205
1206bool
Stephen Wilson84ffe702011-03-30 15:55:52 +00001207ProcessMonitor::Resume(lldb::tid_t tid, uint32_t signo)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001208{
1209 bool result;
Stephen Wilson84ffe702011-03-30 15:55:52 +00001210 ResumeOperation op(tid, signo, result);
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001211 DoOperation(&op);
1212 return result;
1213}
1214
1215bool
Stephen Wilson84ffe702011-03-30 15:55:52 +00001216ProcessMonitor::SingleStep(lldb::tid_t tid, uint32_t signo)
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001217{
1218 bool result;
Stephen Wilson84ffe702011-03-30 15:55:52 +00001219 SingleStepOperation op(tid, signo, result);
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001220 DoOperation(&op);
1221 return result;
1222}
1223
1224bool
1225ProcessMonitor::BringProcessIntoLimbo()
1226{
1227 bool result;
1228 KillOperation op(result);
1229 DoOperation(&op);
1230 return result;
1231}
1232
1233bool
1234ProcessMonitor::GetSignalInfo(lldb::tid_t tid, void *siginfo)
1235{
1236 bool result;
1237 SiginfoOperation op(tid, siginfo, result);
1238 DoOperation(&op);
1239 return result;
1240}
1241
1242bool
1243ProcessMonitor::GetEventMessage(lldb::tid_t tid, unsigned long *message)
1244{
1245 bool result;
1246 EventMessageOperation op(tid, message, result);
1247 DoOperation(&op);
1248 return result;
1249}
1250
1251bool
Stephen Wilson84ffe702011-03-30 15:55:52 +00001252ProcessMonitor::Detach()
1253{
1254 bool result;
1255 KillOperation op(result);
1256 DoOperation(&op);
1257 StopMonitor();
1258 return result;
1259}
1260
1261bool
Stephen Wilsone6f9f662010-07-24 02:19:04 +00001262ProcessMonitor::DupDescriptor(const char *path, int fd, int flags)
1263{
1264 int target_fd = open(path, flags);
1265
1266 if (target_fd == -1)
1267 return false;
1268
1269 return (dup2(fd, target_fd) == -1) ? false : true;
1270}
Stephen Wilson9212d7f2011-01-04 21:40:25 +00001271
1272void
1273ProcessMonitor::StopMonitoringChildProcess()
1274{
1275 lldb::thread_result_t thread_result;
1276
Stephen Wilsond4182f42011-02-09 20:10:35 +00001277 if (IS_VALID_LLDB_HOST_THREAD(m_monitor_thread))
Stephen Wilson9212d7f2011-01-04 21:40:25 +00001278 {
1279 Host::ThreadCancel(m_monitor_thread, NULL);
1280 Host::ThreadJoin(m_monitor_thread, &thread_result, NULL);
1281 m_monitor_thread = LLDB_INVALID_HOST_THREAD;
1282 }
1283}
Stephen Wilson84ffe702011-03-30 15:55:52 +00001284
1285void
1286ProcessMonitor::StopMonitor()
1287{
1288 StopMonitoringChildProcess();
1289 StopOperationThread();
1290 CloseFD(m_terminal_fd);
1291 CloseFD(m_client_fd);
1292 CloseFD(m_server_fd);
1293}
1294
1295void
1296ProcessMonitor::CloseFD(int &fd)
1297{
1298 if (fd != -1)
1299 {
1300 close(fd);
1301 fd = -1;
1302 }
1303}