Fix for proper interaction between full syscall tracing and proper postponing of...
[dyninst.git] / proccontrol / src / linux.C
1 /*
2  * See the dyninst/COPYRIGHT file for copyright information.
3  * 
4  * We provide the Paradyn Tools (below described as "Paradyn")
5  * on an AS IS basis, and do not warrant its validity or performance.
6  * We reserve the right to update, modify, or discontinue this
7  * software at any time.  We shall have no obligation to supply such
8  * updates or modifications or any other form of support to you.
9  * 
10  * By your use of Paradyn, you understand and agree that we (or any
11  * other person or entity with proprietary rights in Paradyn) are
12  * under no obligation to provide either maintenance services,
13  * update services, notices of latent defects, or correction of
14  * defects for Paradyn.
15  * 
16  * This library is free software; you can redistribute it and/or
17  * modify it under the terms of the GNU Lesser General Public
18  * License as published by the Free Software Foundation; either
19  * version 2.1 of the License, or (at your option) any later version.
20  * 
21  * This library is distributed in the hope that it will be useful,
22  * but WITHOUT ANY WARRANTY; without even the implied warranty of
23  * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
24  * Lesser General Public License for more details.
25  * 
26  * You should have received a copy of the GNU Lesser General Public
27  * License along with this library; if not, write to the Free Software
28  * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
29  */
30
31 #include <sys/types.h>
32 #include <sys/wait.h>
33 #include <sys/syscall.h>
34 #include <sys/stat.h>
35 #include <sys/mman.h>
36 #include <fcntl.h>
37 #include <unistd.h>
38 #include <errno.h>
39 #include <string.h>
40 #include <assert.h>
41 #include <time.h>
42 #include <iostream>
43
44 #include "common/h/dyn_regs.h"
45 #include "common/h/dyntypes.h"
46
47 #include "common/src/pathName.h"
48 #include "proccontrol/h/PCErrors.h"
49 #include "proccontrol/h/Generator.h"
50 #include "proccontrol/h/Event.h"
51 #include "proccontrol/h/Handler.h"
52 #include "proccontrol/h/Mailbox.h"
53 #include "proccontrol/h/PlatFeatures.h"
54
55 #include "proccontrol/src/procpool.h"
56 #include "proccontrol/src/irpc.h"
57 #include "proccontrol/src/int_thread_db.h"
58 #include "proccontrol/src/linux.h"
59 #include "proccontrol/src/int_handler.h"
60 #include "proccontrol/src/response.h"
61 #include "proccontrol/src/int_event.h"
62
63 #include "proccontrol/src/snippets.h"
64
65 #include "common/src/linuxKludges.h"
66 #include "common/src/parseauxv.h"
67
68 // Before glibc-2.7, sys/ptrace.h lacked PTRACE_O_* and PTRACE_EVENT_*, so we
69 // need them from linux/ptrace.h.  (Conditionally, as later glibc conflicts.)
70 #if !__GLIBC_PREREQ(2,7)
71 #include <linux/ptrace.h>
72 #endif
73
74 using namespace Dyninst;
75 using namespace ProcControlAPI;
76
77 #if defined(WITH_SYMLITE)
78 #include "symlite/h/SymLite-elf.h"
79 #elif defined(WITH_SYMTAB_API)
80 #include "symtabAPI/h/SymtabReader.h"
81 #else
82 #error "No defined symbol reader"
83 #endif
84
85 #if !defined(PTRACE_GETREGS) && defined(PPC_PTRACE_GETREGS)
86 #define PTRACE_GETREGS PPC_PTRACE_GETREGS
87 #endif
88
89 #if !defined(PTRACE_SETREGS) && defined(PPC_PTRACE_SETREGS)
90 #define PTRACE_SETREGS PPC_PTRACE_SETREGS
91 #endif
92
93 static pid_t P_gettid();
94 static bool t_kill(int pid, int sig);
95
96 using namespace Dyninst;
97 using namespace std;
98
99 static GeneratorLinux *gen = NULL;
100
101 Generator *Generator::getDefaultGenerator()
102 {
103    if (!gen) {
104       gen = new GeneratorLinux();
105       assert(gen);
106       gen->launch();
107    }
108    return static_cast<Generator *>(gen);
109 }
110
111 bool GeneratorLinux::initialize()
112 {
113    int result;
114    
115    sigset_t usr2_set;
116    sigemptyset(&usr2_set);
117    sigaddset(&usr2_set, SIGUSR2);
118    result = pthread_sigmask(SIG_UNBLOCK, &usr2_set, NULL);
119    if (result != 0) {
120       perr_printf("Unable to unblock SIGUSR2: %s\n", strerror(result));
121    }
122    
123    generator_lwp = P_gettid();
124    generator_pid = P_getpid();
125    return true;
126 }
127
128 bool GeneratorLinux::canFastHandle()
129 {
130    return false;
131 }
132
133 ArchEvent *GeneratorLinux::getEvent(bool block)
134 {
135    int status, options;
136
137    //Block (or not block) in waitpid to receive a OS event
138    options = __WALL;
139    options |= block ? 0 : WNOHANG; 
140    pthrd_printf("%s in waitpid\n", block ? "blocking" : "polling");
141
142    if (isExitingState())
143       return NULL;
144    int pid = waitpid(-1, &status, options);
145
146    ArchEventLinux *newevent = NULL;
147    if (pid == -1) {
148       int errsv = errno;
149       if (errsv == EINTR) {
150          pthrd_printf("waitpid interrupted\n");
151          newevent = new ArchEventLinux(true);
152          return newevent;
153       }
154       perr_printf("Error. waitpid recieved error %s\n", strerror(errsv));
155       newevent = new ArchEventLinux(errsv);
156       return newevent;
157    }
158
159    if (dyninst_debug_proccontrol)
160    {
161       pthrd_printf("Waitpid return status %d for pid %d:\n", status, pid);
162       if (WIFEXITED(status))
163          pthrd_printf("Exited with %d\n", WEXITSTATUS(status));
164       else if (WIFSIGNALED(status))
165          pthrd_printf("Exited with signal %d\n", WTERMSIG(status));
166       else if (WIFSTOPPED(status))
167          pthrd_printf("Stopped with signal %d\n", WSTOPSIG(status));
168 #if defined(WIFCONTINUED)
169       else if (WIFCONTINUED(status))
170          perr_printf("Continued with signal SIGCONT (Unexpected)\n");
171 #endif
172       else 
173          pthrd_printf("Unable to interpret waitpid return.\n");
174    }
175    
176    newevent = new ArchEventLinux(pid, status);
177    return newevent;
178 }
179
180 GeneratorLinux::GeneratorLinux() :
181    GeneratorMT(std::string("Linux Generator")),
182    generator_lwp(0),
183    generator_pid(0)
184 {
185    decoders.insert(new DecoderLinux());
186 }
187
188 static volatile int on_sigusr2_hit;
189 static void on_sigusr2(int)
190 {
191    on_sigusr2_hit = 1;
192 }
193
194 void GeneratorLinux::evictFromWaitpid()
195 {
196    if (!generator_lwp)
197       return;
198    if (generator_pid != P_getpid())
199       return;
200    
201    //Throw a SIGUSR2 at the generator thread.  This will kick it out of
202    // a waitpid with EINTR, and allow it to exit.  Will do nothing if not
203    // blocked in waitpid.
204    //
205    //There's a subtle race condition here, which we can't easily fix.  
206    // The generator thread could be just before waitpid, but after 
207    // it's exit test when the signal hits.  We won't throw EINTR because
208    // we're not in waitpid yet, and we won't retest the exiting state.
209    // This exact kind of race is why we have things like pselect, but
210    // waitpid doesn't have a pwaitpid, so we're stuck.
211    struct sigaction newact, oldact;
212    memset(&newact, 0, sizeof(struct sigaction));
213    memset(&oldact, 0, sizeof(struct sigaction));
214    newact.sa_handler = on_sigusr2;
215
216    int result = sigaction(SIGUSR2, &newact, &oldact);
217    if (result == -1) {
218       int error = errno;
219       perr_printf("Error signaling generator thread: %s\n", strerror(error));
220       return;
221    }
222    on_sigusr2_hit = 0;
223    bool bresult = t_kill(generator_lwp, SIGUSR2);
224    while (bresult && !on_sigusr2_hit) {
225       //Don't use a lock because pthread_mutex_unlock is not signal safe
226       sched_yield();
227    }
228
229    result = sigaction(SIGUSR2, &oldact, NULL);
230    if (result == -1) {
231       int error = errno;
232       perr_printf("Error signaling generator thread: %s\n", strerror(error));
233    }
234 }
235
236
237 GeneratorLinux::~GeneratorLinux()
238 {
239    setState(exiting);
240    evictFromWaitpid();
241 }
242
243 DecoderLinux::DecoderLinux()
244 {
245 }
246
247 DecoderLinux::~DecoderLinux()
248 {
249 }
250
251 unsigned DecoderLinux::getPriority() const 
252 {
253    return Decoder::default_priority;
254 }
255
256 Dyninst::Address DecoderLinux::adjustTrapAddr(Dyninst::Address addr, Dyninst::Architecture arch)
257 {
258   if (arch == Dyninst::Arch_x86 || arch == Dyninst::Arch_x86_64) {
259     return addr-1;
260   }
261   return addr;
262 }
263
264 bool DecoderLinux::decode(ArchEvent *ae, std::vector<Event::ptr> &events)
265 {
266    bool result;
267    ArchEventLinux *archevent = static_cast<ArchEventLinux *>(ae);
268
269    int_process *proc = NULL;
270    linux_process *lproc = NULL;
271    int_thread *thread = ProcPool()->findThread(archevent->pid);
272    linux_thread *lthread = NULL;
273    if (thread) {
274       proc = thread->llproc();
275       lthread = dynamic_cast<linux_thread *>(thread);
276    }
277    if (proc) {
278       lproc = dynamic_cast<linux_process *>(proc);
279    }
280
281    if (ProcPool()->deadThread(archevent->pid)) {
282       return true;
283    }
284
285    if (!proc) {
286       pthrd_printf("Warning: could not find event for process %d\n", archevent->pid);
287    }
288
289    Event::ptr event = Event::ptr();
290    ArchEventLinux *child = NULL;
291    ArchEventLinux *parent = NULL;
292
293    pthrd_printf("Decoding event for %d/%d\n", proc ? proc->getPid() : -1,
294                 thread ? thread->getLWP() : -1);
295
296    const int status = archevent->status;
297    if (WIFSTOPPED(status))
298    {
299       const int stopsig = WSTOPSIG(status);
300       int ext;
301       pthrd_printf("Decoded to signal %d\n", stopsig);
302       switch (stopsig)
303       {
304          case (SIGTRAP | 0x80): //PTRACE_O_TRACESYSGOOD
305             if (!proc || !thread) {
306                 //Legacy event on old process?
307                 return true;
308             }
309             pthrd_printf("Decoded event to syscall-stop on %d/%d\n",
310                   proc->getPid(), thread->getLWP());
311             if (lthread->hasPostponedSyscallEvent()) {
312                delete archevent;
313                archevent = lthread->getPostponedSyscallEvent();
314                ext = archevent->event_ext;
315                switch (ext) {
316                   case PTRACE_EVENT_FORK:
317                   case PTRACE_EVENT_CLONE:
318                      pthrd_printf("Resuming %s event after syscall exit on %d/%d\n",
319                                   ext == PTRACE_EVENT_FORK ? "fork" : "clone",
320                                   proc->getPid(), thread->getLWP());
321                      if (!archevent->findPairedEvent(parent, child)) {
322                         pthrd_printf("Parent half of paired event, postponing decode "
323                                      "until child arrives\n");
324                         archevent->postponePairedEvent();
325                         return true;
326                      }
327                      break;
328                   case PTRACE_EVENT_EXEC:
329                      pthrd_printf("Resuming exec event after syscall exit on %d/%d\n",
330                                   proc->getPid(), thread->getLWP());
331                      event = Event::ptr(new EventExec(EventType::Post));
332                      event->setSyncType(Event::sync_process);
333                      break;
334                }
335                break;
336             }
337             // If we're expecting syscall events other than postponed ones, fall through the rest of
338             // the event handling
339             if(!thread->syscallMode())
340             {
341               perr_printf("Received an unexpected syscall TRAP\n");
342               return false;
343             }
344             
345          case SIGSTOP:
346             if (!proc) {               
347                //The child half of an event pair.  Find the parent or postpone it.
348                if (!archevent->findPairedEvent(parent, child)) {
349                   pthrd_printf("Child half of paired event, postponing decode " 
350                                "until parent arrives\n");
351                   archevent->postponePairedEvent();
352                   return true;
353                }
354                break;
355             }
356             if (lthread->hasPendingStop()) {
357                pthrd_printf("Recieved pending SIGSTOP on %d/%d\n", 
358                             thread->llproc()->getPid(), thread->getLWP());
359                event = Event::ptr(new EventStop());
360                break;
361             }
362             if (lthread->getGeneratorState().getState() == int_thread::neonatal ||
363                 lthread->getGeneratorState().getState() == int_thread::neonatal_intermediate)
364             {
365                //Discovered thread from refresh
366                pthrd_printf("Decoded event to thread bootstrap on %d/%d\n",
367                             proc->getPid(), thread->getLWP());
368                event = Event::ptr(new EventBootstrap());
369                break;
370             }
371          case SIGTRAP: {
372 #if 0
373             {
374                //Debugging code
375                Dyninst::MachRegisterVal addr;
376                result = thread->plat_getRegister(MachRegister::getPC(proc->getTargetArch()), addr);
377                if (!result) {
378                   fprintf(stderr, "Failed to read PC address upon crash\n");
379                }
380                fprintf(stderr, "Got SIGTRAP at %lx\n", addr);               
381             }
382 #endif
383             ext = status >> 16;
384             if (ext) {
385                bool postpone = false;
386                switch (ext) {
387                   case PTRACE_EVENT_EXIT:
388                      if (!proc || !thread) {
389                         //Legacy event on old process. 
390                         return true;
391                      }
392                      pthrd_printf("Decoded event to pre-exit on %d/%d\n",
393                                   proc->getPid(), thread->getLWP());
394                      if (thread->getLWP() == proc->getPid())
395                      {
396                        unsigned long exitcode = 0x0;
397                        int result = do_ptrace((pt_req)PTRACE_GETEVENTMSG, (pid_t) thread->getLWP(),
398                                               NULL, &exitcode);
399                        if(result == -1) 
400                        {
401                          perr_printf("Error getting event message from exit\n");
402                          return false;
403                        }
404                        exitcode = WEXITSTATUS(exitcode);
405                        
406                        pthrd_printf("Decoded event to pre-exit of process %d/%d with code %d\n",
407                                       proc->getPid(), thread->getLWP(), exitcode);
408                        event = Event::ptr(new EventExit(EventType::Pre, exitcode));
409                      } 
410                      else {
411                         EventLWPDestroy::ptr lwp_ev = EventLWPDestroy::ptr(new EventLWPDestroy(EventType::Pre));
412                         event = lwp_ev;
413                         event->setThread(thread->thread());
414                         lproc->decodeTdbLWPExit(lwp_ev);
415                      }
416                      thread->setExitingInGenerator(true);
417                      break;
418                   case PTRACE_EVENT_FORK: 
419                   case PTRACE_EVENT_CLONE: {
420                      if (!proc || !thread) {
421                         //Legacy event on old process. 
422                         return true;
423                      }
424                      pthrd_printf("Decoded event to %s on %d/%d\n",
425                                   ext == PTRACE_EVENT_FORK ? "fork" : "clone",
426                                   proc->getPid(), thread->getLWP());
427                      unsigned long cpid_l = 0x0;
428                      int result = do_ptrace((pt_req) PTRACE_GETEVENTMSG, (pid_t) thread->getLWP(), 
429                                             NULL, &cpid_l);
430                      if (result == -1) {
431                         perr_printf("Error getting event message from fork/clone\n");
432                         return false;
433                      }
434                      pid_t cpid = (pid_t) cpid_l;                     
435                      archevent->child_pid = cpid;
436                      postpone = true;
437                      break;
438                   }
439                   case PTRACE_EVENT_EXEC: {
440                      if (!proc || !thread) {
441                         //Legacy event on old process. 
442                         return true;
443                      }
444                      pthrd_printf("Decoded event to exec on %d/%d\n",
445                                   proc->getPid(), thread->getLWP());
446                      postpone = true;
447                      break;
448                   }
449                }
450                if (postpone) {
451                   pthrd_printf("Postponing event until syscall exit on %d/%d\n",
452                                proc->getPid(), thread->getLWP());
453                   archevent->event_ext = ext;
454                   event = Event::ptr(new EventPostponedSyscall());
455                   lthread->postponeSyscallEvent(archevent);
456                   archevent = NULL;
457                }
458                break;
459             }
460             if (proc->getState() == int_process::neonatal_intermediate) {
461                pthrd_printf("Decoded event to bootstrap on %d/%d\n",
462                             proc->getPid(), thread->getLWP());
463                event = Event::ptr(new EventBootstrap());
464                break;
465             }
466             Dyninst::MachRegisterVal addr;
467             Dyninst::Address adjusted_addr;
468             result = thread->plat_getRegister(MachRegister::getPC(proc->getTargetArch()), addr);
469             if (!result) {
470                perr_printf("Failed to read PC address upon SIGTRAP\n");
471                return false;
472             }
473             adjusted_addr = adjustTrapAddr(addr, proc->getTargetArch());
474
475             if (rpcMgr()->isRPCTrap(thread, adjusted_addr)) {
476                pthrd_printf("Decoded event to rpc completion on %d/%d at %lx\n",
477                             proc->getPid(), thread->getLWP(), adjusted_addr);
478                event = Event::ptr(new EventRPC(thread->runningRPC()->getWrapperForDecode()));
479                break;
480             }
481             bp_instance *clearingbp = thread->isClearingBreakpoint();
482             if (thread->singleStep() && clearingbp) {
483                 pthrd_printf("Decoded event to breakpoint restore\n");
484                 event = Event::ptr(new EventBreakpointRestore(new int_eventBreakpointRestore(clearingbp)));
485                 if (thread->singleStepUserMode()) {
486                    Event::ptr subservient_ss = EventSingleStep::ptr(new EventSingleStep());
487                    subservient_ss->setProcess(proc->proc());
488                    subservient_ss->setThread(thread->thread());
489                    subservient_ss->setSyncType(Event::sync_thread);
490                    event->addSubservientEvent(subservient_ss);
491                 }
492                 break;
493             }
494
495             // Need to distinguish case where the thread is single-stepped to a
496             // breakpoint and when a single step hits a breakpoint.
497             //
498             // If no forward progress was made due to a single step, then a
499             // breakpoint was hit
500             sw_breakpoint *ibp = proc->getBreakpoint(adjusted_addr);
501             if (thread->singleStep() && !ibp) {
502                pthrd_printf("Decoded event to single step on %d/%d\n",
503                        proc->getPid(), thread->getLWP());
504                event = Event::ptr(new EventSingleStep());
505                break;
506             }
507
508             if (thread->syscallMode() && !ibp) {
509                 if (thread->preSyscall()) {
510                     pthrd_printf("Decoded event to pre-syscall on %d/%d\n",
511                             proc->getPid(), thread->getLWP());
512                     event = Event::ptr(new EventPreSyscall());
513                     break; 
514                 } else {
515                     pthrd_printf("Decoded event to post-syscall on %d/%d\n",
516                             proc->getPid(), thread->getLWP());
517                     event = Event::ptr(new EventPostSyscall());
518                     break;
519                 }
520             }
521             
522             if (ibp && ibp != clearingbp) {
523                pthrd_printf("Decoded breakpoint on %d/%d at %lx\n", proc->getPid(), 
524                             thread->getLWP(), adjusted_addr);
525                EventBreakpoint::ptr event_bp = EventBreakpoint::ptr(new EventBreakpoint(new int_eventBreakpoint(adjusted_addr, ibp, thread)));
526                event = event_bp;
527                event->setThread(thread->thread());
528
529                if (thread->singleStepUserMode() && !proc->plat_breakpointAdvancesPC()) {
530                   Event::ptr subservient_ss = EventSingleStep::ptr(new EventSingleStep());
531                   subservient_ss->setProcess(proc->proc());
532                   subservient_ss->setThread(thread->thread());
533                   subservient_ss->setSyncType(Event::sync_thread);
534                   event->addSubservientEvent(subservient_ss);
535                }
536
537                if (adjusted_addr == lproc->getLibBreakpointAddr()) {
538                   pthrd_printf("Breakpoint is library load/unload\n");
539                   EventLibrary::ptr lib_event = EventLibrary::ptr(new EventLibrary());
540                   lib_event->setThread(thread->thread());
541                   lib_event->setProcess(proc->proc());
542                   lib_event->setSyncType(Event::sync_thread);
543                   event->addSubservientEvent(lib_event);
544                   break;
545                }
546                for (;;) {
547                   async_ret_t result = lproc->decodeTdbBreakpoint(event_bp);
548                   if (result == aret_error) {
549                      //Not really an error, just how we say that it isn't
550                      // a breakpoint.
551                      break;
552                   }
553                   if (result == aret_success) {
554                      //decodeTdbBreakpoint added a subservient event if this hits
555                      pthrd_printf("Breakpoint was thread event\n");
556                      break;
557                   }
558                   if (result == aret_async) {
559                      pthrd_printf("decodeTdbBreakpoint returned async\n");
560                      set<response::ptr> resps;
561                      lproc->getMemCache()->getPendingAsyncs(resps);
562                      pthrd_printf("%d asyncs are pending\n", (int) resps.size());
563                      int_process::waitForAsyncEvent(resps);
564                      continue;
565                   }
566                }
567
568                break;
569             }
570             response::ptr resp;
571             EventBreakpoint::ptr evhwbp = thread->decodeHWBreakpoint(resp);
572             if (evhwbp) {
573                pthrd_printf("Decoded SIGTRAP as hardware breakpoint\n");
574                event = evhwbp;
575                break;
576             }
577
578          }
579          default:
580             pthrd_printf("Decoded event to signal %d on %d/%d\n",
581                          stopsig, proc->getPid(), thread->getLWP());
582 #if 0
583             //Debugging code
584             if (stopsig == 11 || stopsig == 4) {
585                Dyninst::MachRegisterVal addr;
586                result = thread->plat_getRegister(MachRegister::getPC(proc->getTargetArch()), addr);
587                if (!result) {
588                   fprintf(stderr, "Failed to read PC address upon crash\n");
589                }
590                fprintf(stderr, "Got crash at %lx\n", addr);               
591                while (1) sleep(1);
592             }
593 #endif
594             event = Event::ptr(new EventSignal(stopsig));
595       }
596       if (event && event->getSyncType() == Event::unset)
597          event->setSyncType(Event::sync_thread);
598    }
599    else if ((WIFEXITED(status) || WIFSIGNALED(status)) && 
600             (!proc || !thread || thread->getGeneratorState().getState() == int_thread::exited)) 
601    {
602       //This can happen if the debugger process spawned the 
603       // child, but then detached.  We recieve the child process
604       // exit (because we're the parent), but are no longer debugging it.
605       // We'll just drop this event on the ground.
606       //Also seen when multiple termination signals hit a multi-threaded process
607       // we're debugging.  We'll keep pulling termination signals from the
608       // a defunct process.  Similar to above, we'll drop this event
609       // on the ground.
610       return true;
611    }
612    else if (WIFEXITED(status) && proc->getPid() != thread->getLWP())
613    {
614       int exitcode = WEXITSTATUS(status);
615
616       pthrd_printf("Decoded exit of thread %d/%d with code %d\n",
617                    proc->getPid(), thread->getLWP(), exitcode);
618       EventLWPDestroy::ptr lwp_ev = EventLWPDestroy::ptr(new EventLWPDestroy(EventType::Post));
619       event = lwp_ev;
620       event->setSyncType(Event::async);
621       event->setThread(thread->thread());
622       lproc->decodeTdbLWPExit(lwp_ev);
623       thread->getGeneratorState().setState(int_thread::exited);
624    }
625    else if (WIFEXITED(status) || WIFSIGNALED(status)) {
626       if (WIFEXITED(status)) {
627          int exitcode = WEXITSTATUS(status);
628          pthrd_printf("Decoded event to exit of process %d/%d with code %d\n",
629                       proc->getPid(), thread->getLWP(), exitcode);
630          event = Event::ptr(new EventExit(EventType::Post, exitcode));
631       }
632       else {
633          int termsig = WTERMSIG(status);
634          if( proc->wasForcedTerminated() ) {
635              pthrd_printf("Decoded event to force terminate of %d/%d\n",
636                      proc->getPid(), thread->getLWP());
637              event = Event::ptr(new EventForceTerminate(termsig));
638          }else{
639              pthrd_printf("Decoded event to crash of %d/%d with signal %d\n",
640                           proc->getPid(), thread->getLWP(), termsig);
641              event = Event::ptr(new EventCrash(termsig));
642          }
643       }
644       event->setSyncType(Event::sync_process);
645       int_threadPool::iterator i = proc->threadPool()->begin();
646       for (; i != proc->threadPool()->end(); i++) {
647          (*i)->getGeneratorState().setState(int_thread::exited);
648       }
649    }
650
651    if (parent && child)
652    {
653       //Paired event decoded
654       assert(!event);
655       thread = ProcPool()->findThread(parent->pid);
656       assert(thread);
657       proc = thread->llproc();
658       if (parent->event_ext == PTRACE_EVENT_FORK)
659          event = Event::ptr(new EventFork(EventType::Post, child->pid));
660       else if (parent->event_ext == PTRACE_EVENT_CLONE)
661          event = Event::ptr(new EventNewLWP(child->pid, (int) int_thread::as_created_attached));
662       else 
663          assert(0);
664       event->setSyncType(Event::sync_thread);
665       delete parent;
666       delete child;
667    }
668    else {
669       //Single event decoded
670       assert(event);
671       assert(!parent);
672       assert(!child);
673       assert(proc->proc());
674       assert(thread->thread());
675       delete archevent;
676    }
677    event->setThread(thread->thread());
678    event->setProcess(proc->proc());
679    events.push_back(event);
680
681    return true;
682 }
683
684 #if defined(arch_power)
685 #define DEFAULT_PROCESS_TYPE linux_ppc_process
686 #define DEFAULT_THREAD_TYPE linux_ppc_thread
687 #elif defined(arch_x86) || defined(arch_x86_64)
688 #define DEFAULT_PROCESS_TYPE linux_x86_process
689 #define DEFAULT_THREAD_TYPE linux_x86_thread
690 #endif
691
692 int_process *int_process::createProcess(Dyninst::PID p, std::string e)
693 {
694    std::vector<std::string> a;
695    std::map<int,int> f;
696    std::vector<std::string> envp;
697    LinuxPtrace::getPtracer(); //Make sure ptracer thread is initialized
698    linux_process *newproc = new DEFAULT_PROCESS_TYPE(p, e, a, envp, f);
699    assert(newproc);
700    return static_cast<int_process *>(newproc);
701 }
702
703 int_process *int_process::createProcess(std::string e, std::vector<std::string> a, std::vector<std::string> envp, 
704         std::map<int,int> f)
705 {
706    LinuxPtrace::getPtracer(); //Make sure ptracer thread is initialized
707    linux_process *newproc = new DEFAULT_PROCESS_TYPE(0, e, a, envp, f);
708    assert(newproc);
709    return static_cast<int_process *>(newproc);
710 }
711
712 int_process *int_process::createProcess(Dyninst::PID pid_, int_process *p)
713 {
714    linux_process *newproc = new DEFAULT_PROCESS_TYPE(pid_, p);
715    assert(newproc);
716    return static_cast<int_process *>(newproc);
717 }
718
719 int linux_process::computeAddrWidth(Dyninst::Architecture me)
720 {
721    /**
722     * It's surprisingly difficult to figure out the word size of a process
723     * without looking at the files it loads (we want to avoid disk accesses).
724     *
725     * /proc/PID/auxv offers a hackish opportunity to do this.  auxv contains
726     * a list of name value pairs.  On 64 bit processes these name values are
727     * a uint64/uint64 combo and on 32 bit processes they're uint32/uint32.
728     *
729     * The names are from a set of small integers (ranging from 0 to 37 at
730     * the time of this writing).  Since these are small numbers, the top half
731     * of name word will be 0x0 on 64 bit processes.  On 32-bit process this
732     * word will contain a value, of which some should be non-zero.  
733     *
734     * We'll thus check every word that is 1 mod 4.  If all are 0x0 we assume we're
735     * looking at a 64-bit process.
736     **/
737    uint32_t buffer[256];
738    char auxv_name[64];
739    
740    snprintf(auxv_name, 64, "/proc/%d/auxv", getPid());
741    int fd = open(auxv_name, O_RDONLY);
742    if (fd == -1) { 
743       pthrd_printf("Couldn't open %s to determine address width: %s",
744                    auxv_name, strerror(errno));
745       return -1;
746    }
747
748    long int result = read(fd, buffer, sizeof(buffer));
749    long int words_read = result / sizeof(uint32_t);
750    int word_size = 8;
751
752    // We want to check the highest 4 bytes of each integer
753    // On big-endian systems, these come first in memory
754    int start_index = 0;
755    switch (me) {
756       case Arch_x86:
757       case Arch_x86_64:
758          start_index = 1;
759          break;
760       case Arch_ppc32:
761       case Arch_ppc64:
762          start_index = 0;
763          break;
764       case Arch_none:
765       default:
766          assert(0);
767          return 0;
768    }
769
770    for (long int i=start_index; i<words_read; i+= 4)
771    {
772       if (buffer[i] != 0) {
773          word_size = 4;
774          break;
775       }
776    }
777    close(fd);
778    return word_size;
779 }
780
781 linux_process::linux_process(Dyninst::PID p, std::string e, std::vector<std::string> a, 
782                              std::vector<std::string> envp,  std::map<int,int> f) :
783    int_process(p, e, a, envp, f),
784    resp_process(p, e, a, envp, f),
785    sysv_process(p, e, a, envp, f),
786    unix_process(p, e, a, envp, f),
787    thread_db_process(p, e, a, envp, f),
788    indep_lwp_control_process(p, e, a, envp, f),
789    mmap_alloc_process(p, e, a, envp, f),
790    int_followFork(p, e, a, envp, f),
791    int_signalMask(p, e, a, envp, f),
792    int_LWPTracking(p, e, a, envp, f),
793    int_memUsage(p, e, a, envp, f)
794 {
795 }
796
797 linux_process::linux_process(Dyninst::PID pid_, int_process *p) :
798    int_process(pid_, p),
799    resp_process(pid_, p),
800    sysv_process(pid_, p),
801    unix_process(pid_, p),
802    thread_db_process(pid_, p),
803    indep_lwp_control_process(pid_, p),
804    mmap_alloc_process(pid_, p),
805    int_followFork(pid_, p),
806    int_signalMask(pid_, p),
807    int_LWPTracking(pid_, p),
808    int_memUsage(pid_, p)
809 {
810 }
811
812 linux_process::~linux_process()
813 {
814 }
815
816 bool linux_process::plat_create()
817 {
818    //Triggers plat_create_int on ptracer thread.
819    return LinuxPtrace::getPtracer()->plat_create(this);
820 }
821
822 bool linux_process::plat_create_int()
823 {
824    pid = fork();
825    if (pid == -1)
826    {
827       int errnum = errno;
828       pthrd_printf("Could not fork new process for %s: %s\n", 
829                    executable.c_str(), strerror(errnum));
830       setLastError(err_internal, "Unable to fork new process");
831       return false;
832    }
833
834    if (!pid)
835    {
836       // Make sure cleanup on failure goes smoothly
837       ProcPool()->condvar()->unlock();
838
839       //Child
840       long int result = ptrace((pt_req) PTRACE_TRACEME, 0, 0, 0);
841       if (result == -1)
842       {
843          pthrd_printf("Failed to execute a PTRACE_TRACME.  Odd.\n");
844          setLastError(err_internal, "Unable to debug trace new process");
845          exit(-1);
846       }
847
848       // Never returns
849       plat_execv();
850    }
851    return true;
852 }
853
854 bool linux_process::plat_getOSRunningStates(std::map<Dyninst::LWP, bool> &runningStates) {
855     vector<Dyninst::LWP> lwps;
856     if( !getThreadLWPs(lwps) ) {
857         pthrd_printf("Failed to determine lwps for process %d\n", getPid());
858         setLastError(err_noproc, "Failed to find /proc files for debuggee");
859         return false;
860     }
861
862     for(vector<Dyninst::LWP>::iterator i = lwps.begin();
863             i != lwps.end(); ++i)
864     {
865         char proc_stat_name[128];
866         char sstat[256];
867         char *status;
868         int paren_level = 1;
869         
870         snprintf(proc_stat_name, 128, "/proc/%d/stat", *i);
871         FILE *sfile = fopen(proc_stat_name, "r");
872
873         if (sfile == NULL) {
874             pthrd_printf("Failed to open /proc/%d/stat file\n", *i);
875             setLastError(err_noproc, "Failed to find /proc files for debuggee");
876             return false;
877         }
878         if( fread(sstat, 1, 256, sfile) == 0 ) {
879             pthrd_printf("Failed to read /proc/%d/stat file \n", *i);
880             setLastError(err_noproc, "Failed to find /proc files for debuggee");
881             fclose(sfile);
882             return false;
883         }
884         fclose(sfile);
885
886         sstat[255] = '\0';
887         status = sstat;
888
889         while (*status != '\0' && *(status++) != '(') ;
890         while (*status != '\0' && paren_level != 0) {
891             if (*status == '(') paren_level++;
892             if (*status == ')') paren_level--;
893             status++;
894         }
895
896         while (*status == ' ') status++;
897
898         runningStates.insert(make_pair(*i, (*status != 'T')));
899     }
900
901     return true;
902 }
903
904 // Ubuntu 10.10 and other hardened systems do not allow arbitrary ptrace_attaching; instead
905 // you may only attach to a child process (https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening)
906 //
907 // We can detect this and warn the user; however, it takes root to disable it. 
908
909 #include <fstream>
910
911 static void warn_user_ptrace_restrictions() {
912   ifstream ptrace_scope("/proc/sys/kernel/yama/ptrace_scope");
913   if (ptrace_scope.is_open()) {
914     int val = 99;
915     ptrace_scope >> val;
916     if (val == 1) {
917       cerr << "Warning: your Linux system provides limited ptrace functionality as a security" << endl
918            << "measure. This measure prevents ProcControl and Dyninst from attaching to binaries." << endl
919            << "To temporarily disable this measure (until a reboot), execute the following command:" << endl
920            << "\techo 0 > /proc/sys/kernel/yama/ptrace_scope" << endl;
921       struct stat statbuf;
922       if (!stat("/etc/sysctl.d/10-ptrace.conf", &statbuf)) {
923         cerr << "To permanently disable this measure, edit the file \"/etc/sysctl.d/10-ptrace.conf\"" << endl
924              << "and follow the directions in that file." << endl;
925       }
926       cerr << "For more information, see https://wiki.ubuntu.com/SecurityTeam/Roadmap/KernelHardening" << endl;
927       is_restricted_ptrace = true;
928     }
929   } 
930 }
931
932
933 bool linux_process::plat_attach(bool, bool &)
934 {
935    pthrd_printf("Attaching to pid %d\n", pid);
936
937    bool attachWillTriggerStop = plat_attachWillTriggerStop();
938
939    int result = do_ptrace((pt_req) PTRACE_ATTACH, pid, NULL, NULL);
940    if (result != 0) {
941       int errnum = errno;
942       pthrd_printf("Unable to attach to process %d: %s\n", pid, strerror(errnum));
943       switch(errnum) {
944       case EPERM:
945         warn_user_ptrace_restrictions();
946         setLastError(err_prem, "Do not have correct premissions to attach to pid");
947         break;
948       case ESRCH:
949          setLastError(err_noproc, "The specified process was not found");
950          break;
951       default:
952          setLastError(err_internal, "Unable to attach to the specified process");
953          break;
954       }
955       return false;
956    }
957
958    if ( !attachWillTriggerStop ) {
959        // Force the SIGSTOP delivered by the attach to be handled
960        pthrd_printf("Attach will not trigger stop, calling PTRACE_CONT to flush out stop\n");
961        int result = do_ptrace((pt_req) PTRACE_CONT, pid, NULL, NULL);
962        if( result != 0 ) {
963            int errnum = errno;
964            pthrd_printf("Unable to continue process %d to flush out attach: %s\n",
965                    pid, strerror(errnum));
966            return false;
967        }
968    }
969    
970    return true;
971 }
972
973 bool linux_process::plat_attachWillTriggerStop() {
974     char procName[64];
975     char cmd[256];
976     pid_t tmpPid;
977     char state;
978     int ttyNumber;
979
980     // Retrieve the state of the process and its controlling tty
981     snprintf(procName, 64, "/proc/%d/stat", pid);
982
983     FILE *sfile = fopen(procName, "r");
984     if ( sfile == NULL ) {
985         perr_printf("Failed to determine whether attach would trigger stop -- assuming it will\n");
986         return true;
987     }
988
989     fscanf(sfile, "%d %255s %c %d %d %d",
990             &tmpPid, cmd, &state,
991             &tmpPid, &tmpPid, &ttyNumber);
992     fclose(sfile);
993
994     // If the process is stopped and it has a controlling tty, an attach
995     // will not trigger a stop
996     if ( state == 'T' && ttyNumber != 0 ) {
997         return false;
998     }
999
1000     return true;
1001 }
1002
1003 bool linux_process::plat_execed()
1004 {
1005    bool result = sysv_process::plat_execed();
1006    if (!result)
1007       return false;
1008
1009    char proc_exec_name[128];
1010    snprintf(proc_exec_name, 128, "/proc/%d/exe", getPid());
1011    executable = resolve_file_path(proc_exec_name);
1012    return true;
1013 }
1014
1015 bool linux_process::plat_forked()
1016 {
1017    return true;
1018 }
1019
1020 bool linux_process::plat_readMem(int_thread *thr, void *local, 
1021                                  Dyninst::Address remote, size_t size)
1022 {
1023    return LinuxPtrace::getPtracer()->ptrace_read(remote, size, local, thr->getLWP());
1024 }
1025
1026 bool linux_process::plat_writeMem(int_thread *thr, const void *local, 
1027                                   Dyninst::Address remote, size_t size, bp_write_t)
1028 {
1029    return LinuxPtrace::getPtracer()->ptrace_write(remote, size, local, thr->getLWP());
1030 }
1031
1032 linux_x86_process::linux_x86_process(Dyninst::PID p, std::string e, std::vector<std::string> a, 
1033                                      std::vector<std::string> envp, std::map<int,int> f) :
1034    int_process(p, e, a, envp, f),
1035    resp_process(p, e, a, envp, f),
1036    linux_process(p, e, a, envp, f),
1037    x86_process(p, e, a, envp, f)
1038 {
1039 }
1040
1041 linux_x86_process::linux_x86_process(Dyninst::PID pid_, int_process *p) :
1042    int_process(pid_, p),
1043    resp_process(pid_, p),
1044    linux_process(pid_, p),
1045    x86_process(pid_, p)
1046 {
1047 }
1048
1049
1050 linux_x86_process::~linux_x86_process()
1051 {
1052 }
1053
1054 Dyninst::Architecture linux_x86_process::getTargetArch()
1055 {
1056    if (arch != Dyninst::Arch_none) {
1057       return arch;
1058    }
1059    int addr_width = computeAddrWidth(sizeof(void *) == 4 ? Arch_x86 : Arch_x86_64);
1060    arch = (addr_width == 4) ? Dyninst::Arch_x86 : Dyninst::Arch_x86_64;
1061    return arch;
1062 }
1063
1064 bool linux_x86_process::plat_supportHWBreakpoint()
1065 {
1066    return true;
1067 }
1068
1069 linux_ppc_process::linux_ppc_process(Dyninst::PID p, std::string e, std::vector<std::string> a, 
1070                                      std::vector<std::string> envp, std::map<int,int> f) :
1071    int_process(p, e, a, envp, f),
1072    resp_process(p, e, a, envp, f),
1073    linux_process(p, e, a, envp, f),
1074    ppc_process(p, e, a, envp, f)
1075 {
1076 }
1077
1078 linux_ppc_process::linux_ppc_process(Dyninst::PID pid_, int_process *p) :
1079    int_process(pid_, p),
1080    resp_process(pid_, p),
1081    linux_process(pid_, p),
1082    ppc_process(pid_, p)
1083 {
1084 }
1085
1086
1087 linux_ppc_process::~linux_ppc_process()
1088 {
1089 }
1090
1091 Dyninst::Architecture linux_ppc_process::getTargetArch()
1092 {
1093    if (arch != Dyninst::Arch_none) {
1094       return arch;
1095    }
1096    int addr_width = computeAddrWidth(sizeof(void *) == 4 ? Arch_ppc32 : Arch_ppc64);
1097    arch = (addr_width == 4) ? Dyninst::Arch_ppc32 : Dyninst::Arch_ppc64;
1098    return arch;
1099 }
1100
1101 static std::vector<unsigned int> fake_async_msgs;
1102 void linux_thread::fake_async_main(void *)
1103 {
1104    for (;;) {
1105       //Sleep for a small amount of time.
1106       struct timespec sleep_time;
1107       sleep_time.tv_sec = 0;
1108       sleep_time.tv_nsec = 1000000; //One milisecond
1109       nanosleep(&sleep_time, NULL);
1110
1111       if (fake_async_msgs.empty())
1112          continue;
1113
1114       getResponses().lock();
1115       
1116       //Pick a random async response to fill.
1117       int size = fake_async_msgs.size();
1118       int elem = rand() % size;
1119       unsigned int id = fake_async_msgs[elem];
1120       fake_async_msgs[elem] = fake_async_msgs[size-1];
1121       fake_async_msgs.pop_back();
1122       
1123       pthrd_printf("Faking response for event %d\n", id);
1124       //Pull the response from the list
1125       response::ptr resp = getResponses().rmResponse(id);
1126       assert(resp != response::ptr());
1127       
1128       //Add data to the response.
1129       reg_response::ptr regr = resp->getRegResponse();
1130       allreg_response::ptr allr = resp->getAllRegResponse();
1131       result_response::ptr resr = resp->getResultResponse();
1132       mem_response::ptr memr = resp->getMemResponse();
1133       if (regr)
1134          regr->postResponse(regr->val);
1135       else if (allr)
1136          allr->postResponse();
1137       else if (resr)
1138          resr->postResponse(resr->b);
1139       else if (memr)
1140          memr->postResponse();
1141       else
1142          assert(0);
1143       
1144       Event::ptr ev = resp->getEvent();
1145       if (ev == Event::ptr()) {
1146          //Someone is blocking for this response, mark it ready
1147          pthrd_printf("Marking response %s ready\n", resp->name().c_str());
1148          resp->markReady();
1149       }
1150       else {
1151          //An event triggered this async, create a new Async event
1152          // with the original event as subservient.
1153          int_eventAsync *internal = new int_eventAsync(resp);
1154          EventAsync::ptr async_ev(new EventAsync(internal));
1155          async_ev->setProcess(ev->getProcess());
1156          async_ev->setThread(ev->getThread());
1157          async_ev->setSyncType(Event::async);
1158          async_ev->addSubservientEvent(ev);
1159          
1160          pthrd_printf("Enqueueing Async event with subservient %s to mailbox\n", ev->name().c_str());
1161          mbox()->enqueue(async_ev, true);
1162       }
1163       
1164       getResponses().signal();
1165       getResponses().unlock();
1166    }
1167 }
1168
1169 bool linux_process::plat_needsAsyncIO() const
1170 {
1171 #if !defined(debug_async_simulate)
1172    return false;
1173 #endif
1174    static DThread *fake_async_thread = NULL;
1175    if (!fake_async_thread) {
1176       fake_async_thread = new DThread();
1177       bool result = fake_async_thread->spawn(linux_thread::fake_async_main, NULL);
1178       assert(result);
1179       if(!result) return false;
1180    }
1181    return true;
1182 }
1183
1184 bool linux_process::plat_readMemAsync(int_thread *thr, Dyninst::Address addr, mem_response::ptr result)
1185 {
1186    bool b = plat_readMem(thr, result->getBuffer(), addr, result->getSize());
1187    if (!b) {
1188       result->markError(getLastError());      
1189    }
1190    result->setLastBase(addr);
1191    fake_async_msgs.push_back(result->getID());
1192    return true;
1193 }
1194
1195 bool linux_process::plat_writeMemAsync(int_thread *thr, const void *local, Dyninst::Address addr, size_t size, 
1196                                        result_response::ptr result, bp_write_t bp_write)
1197 {
1198    bool b = plat_writeMem(thr, local, addr, size, bp_write);
1199    if (!b) {
1200       result->markError(getLastError());
1201       result->b = false;
1202    }
1203    else {
1204       result->b = true;
1205    }
1206    fake_async_msgs.push_back(result->getID());
1207    return true;
1208 }
1209
1210 bool linux_process::needIndividualThreadAttach()
1211 {
1212    return true;
1213 }
1214
1215 bool linux_process::getThreadLWPs(std::vector<Dyninst::LWP> &lwps)
1216 {
1217    return findProcLWPs(pid, lwps);
1218 }
1219
1220 bool linux_process::plat_supportLWPCreate() 
1221 {
1222    return true;
1223 }
1224
1225 bool linux_process::plat_supportLWPPreDestroy()
1226 {
1227    return true;
1228 }
1229
1230 bool linux_process::plat_supportLWPPostDestroy()
1231 {
1232    return true;
1233 }
1234
1235 void linux_thread::postponeSyscallEvent(ArchEventLinux *event)
1236 {
1237    assert(!postponed_syscall_event);
1238    postponed_syscall_event = event;
1239 }
1240
1241 bool linux_thread::hasPostponedSyscallEvent()
1242 {
1243    return postponed_syscall_event != NULL;
1244 }
1245
1246 ArchEventLinux *linux_thread::getPostponedSyscallEvent()
1247 {
1248    ArchEventLinux *ret = postponed_syscall_event;
1249    postponed_syscall_event = NULL;
1250    return ret;
1251 }
1252
1253
1254 bool linux_thread::plat_cont()
1255 {
1256    pthrd_printf("Continuing thread %d\n", lwp);
1257
1258    switch (getHandlerState().getState()) {
1259       case neonatal:
1260       case running:
1261       case exited:
1262       case errorstate:
1263       case detached:
1264          perr_printf("Continue attempted on thread in invalid state %s\n", 
1265                      int_thread::stateStr(handler_state.getState()));
1266          return false;
1267       case neonatal_intermediate:
1268       case stopped:
1269          //OK
1270          break;
1271       case none:
1272       case dontcare:
1273       case ditto:
1274          assert(0);
1275    }
1276
1277    // The following case poses a problem:
1278    // 1) This thread has received a signal, but the event hasn't been handled yet
1279    // 2) An event that precedes the signal event triggers a callback where
1280    //    the user requests that the whole process stop. This in turn causes
1281    //    the thread to be sent a SIGSTOP because the Handler hasn't seen the
1282    //    signal event yet.
1283    // 3) Before handling the pending signal event, this thread is continued to
1284    //    clear out the pending stop and consequently, it is delivered the signal
1285    //    which can cause the whole process to crash
1286    //
1287    // The solution:
1288    // Don't continue the thread with the pending signal if there is a pending stop.
1289    // Wait until the user sees the signal event to deliver the signal to the process.
1290    //
1291    
1292    int tmpSignal = continueSig_;
1293    if( hasPendingStop() ) {
1294        tmpSignal = 0;
1295    }
1296
1297    void *data = (tmpSignal == 0) ? NULL : (void *) (long) tmpSignal;
1298    int result;
1299    if (hasPostponedSyscallEvent())
1300    {
1301       pthrd_printf("Calling PTRACE_SYSCALL on %d with signal %d\n", lwp, tmpSignal);
1302       result = do_ptrace((pt_req) PTRACE_SYSCALL, lwp, NULL, data);
1303    }
1304    else if (singleStep())
1305    {
1306       pthrd_printf("Calling PTRACE_SINGLESTEP on %d with signal %d\n", lwp, tmpSignal);
1307       result = do_ptrace((pt_req) PTRACE_SINGLESTEP, lwp, NULL, data);
1308    }
1309    else if (syscallMode())
1310    {
1311         pthrd_printf("Calling PTRACE_SYSCALL on %d with signal %d\n", lwp, tmpSignal);
1312         result = do_ptrace((pt_req) PTRACE_SYSCALL, lwp, NULL, data);
1313    }
1314    else 
1315    {
1316       pthrd_printf("Calling PTRACE_CONT on %d with signal %d\n", lwp, tmpSignal);
1317       result = do_ptrace((pt_req) PTRACE_CONT, lwp, NULL, data);
1318    }
1319    if (result == -1) {
1320       int error = errno;
1321       if (error == ESRCH) {
1322          pthrd_printf("Continue attempted on exited thread %d\n", lwp);
1323          setLastError(err_exited, "Continue on exited thread");
1324          return false;
1325       }
1326       perr_printf("low-level continue failed: %s\n", strerror(error));
1327       setLastError(err_internal, "Low-level continue failed\n");
1328       return false;
1329    }
1330    if( tmpSignal == continueSig_ ) continueSig_ = 0;
1331
1332    return true;
1333 }
1334
1335 SymbolReaderFactory *getElfReader()
1336 {
1337 #if defined(WITH_SYMLITE)
1338   static SymbolReaderFactory *symreader_factory = NULL;
1339   if (symreader_factory)
1340     return symreader_factory;
1341
1342   symreader_factory = (SymbolReaderFactory *) new SymElfFactory();
1343   return symreader_factory;
1344 #elif defined(WITH_SYMTAB_API)
1345   return SymtabAPI::getSymtabReaderFactory();
1346 #else
1347 #error "No defined symbol reader"
1348 #endif
1349 }
1350
1351 SymbolReaderFactory *linux_process::plat_defaultSymReader()
1352 {
1353    return getElfReader();
1354 }
1355
1356
1357 #ifndef SYS_tkill
1358 #define SYS_tkill 238
1359 #endif
1360
1361 static pid_t P_gettid()
1362 {
1363   static int gettid_not_valid = 0;
1364   long int result;
1365
1366   if (gettid_not_valid)
1367     return getpid();
1368
1369   result = syscall(SYS_gettid);
1370   if (result == -1 && errno == ENOSYS)
1371   {
1372     gettid_not_valid = 1;
1373     return getpid();
1374   }
1375   return (int) result;
1376 }
1377
1378 static bool t_kill(int pid, int sig)
1379 {
1380   static bool has_tkill = true;
1381   long int result = 0;
1382   pthrd_printf("Sending %d to %d\n", sig, pid);
1383   if (has_tkill) {
1384      result = syscall(SYS_tkill, pid, sig);
1385      if (result == -1 && errno == ENOSYS)
1386      {
1387         pthrd_printf("Using kill instead of tkill on this system\n");
1388         has_tkill = false;
1389      }
1390   }
1391   if (!has_tkill) {
1392      result = kill(pid, sig);
1393   }
1394
1395   return (result == 0);
1396 }
1397
1398 int_thread *int_thread::createThreadPlat(int_process *proc, 
1399                                          Dyninst::THR_ID thr_id, 
1400                                          Dyninst::LWP lwp_id,
1401                                          bool initial_thrd)
1402 {
1403    if (initial_thrd) {
1404       lwp_id = proc->getPid();
1405    }
1406    linux_thread *lthrd = new DEFAULT_THREAD_TYPE(proc, thr_id, lwp_id);
1407    assert(lthrd);
1408    return static_cast<int_thread *>(lthrd);
1409 }
1410
1411 linux_thread::linux_thread(int_process *p, Dyninst::THR_ID t, Dyninst::LWP l) :
1412    int_thread(p, t, l),
1413    thread_db_thread(p, t, l),
1414    postponed_syscall_event(NULL)
1415 {
1416 }
1417
1418 linux_thread::~linux_thread()
1419 {
1420    delete postponed_syscall_event;
1421 }
1422
1423 bool linux_thread::plat_stop()
1424 {
1425    bool result;
1426
1427    assert(pending_stop.local());
1428    result = t_kill(lwp, SIGSTOP);
1429    if (!result) {
1430       int err = errno;
1431       if (err == ESRCH) {
1432          pthrd_printf("t_kill failed on %d, thread doesn't exist\n", lwp);
1433          setLastError(err_noproc, "Thread no longer exists");
1434          return false;
1435       }
1436       pthrd_printf("t_kill failed on %d: %s\n", lwp, strerror(err));
1437       setLastError(err_internal, "Could not send signal to process while stopping");
1438       return false;
1439    }
1440
1441    return true;
1442 }
1443
1444 void linux_thread::setOptions()
1445 {
1446    long options = 0;
1447    options |= PTRACE_O_TRACEEXIT;
1448    options |= PTRACE_O_TRACEEXEC;
1449    options |= PTRACE_O_TRACESYSGOOD;
1450    if (llproc()->getLWPTracking()->lwp_getTracking())
1451       options |= PTRACE_O_TRACECLONE;
1452    if (llproc()->getFollowFork()->fork_isTracking() != FollowFork::ImmediateDetach)
1453       options |= PTRACE_O_TRACEFORK;
1454
1455    if (options) {
1456       int result = do_ptrace((pt_req) PTRACE_SETOPTIONS, lwp, NULL, 
1457                           (void *) options);
1458       if (result == -1) {
1459          pthrd_printf("Failed to set options for %lu: %s\n", tid, strerror(errno));
1460       }
1461    }   
1462 }
1463
1464 bool linux_thread::unsetOptions()
1465 {
1466     long options = 0;
1467
1468     int result = do_ptrace((pt_req) PTRACE_SETOPTIONS, lwp, NULL,
1469             (void *) options);
1470     if (result == -1) {
1471         pthrd_printf("Failed to set options for %lu: %s\n", tid, strerror(errno));
1472         return false;
1473     }
1474     return true;
1475 }
1476
1477 bool linux_process::plat_individualRegAccess()
1478 {
1479    return true;
1480 }
1481
1482 bool linux_process::plat_detach(result_response::ptr, bool leave_stopped)
1483 {
1484    int_threadPool *tp = threadPool();
1485    bool had_error = false;
1486    bool first_thread_signaled = false;
1487
1488    for (int_threadPool::iterator i = tp->begin(); i != tp->end(); i++) {
1489       int_thread *thr = *i;
1490       if (leave_stopped && !first_thread_signaled) {
1491          pthrd_printf("Signaling %d/%d with SIGSTOP during detach to leave stopped\n", getPid(), thr->getLWP());
1492          t_kill(thr->getLWP(), SIGSTOP);
1493          first_thread_signaled = true;
1494       }
1495       pthrd_printf("PTRACE_DETACH on %d\n", thr->getLWP());
1496       long result = do_ptrace((pt_req) PTRACE_DETACH, thr->getLWP(), NULL, (void *) 0);
1497       if (result == -1) {
1498          had_error = true;
1499          perr_printf("Failed to PTRACE_DETACH on %d/%d (%s)\n", getPid(), thr->getLWP(), strerror(errno));
1500          setLastError(err_internal, "PTRACE_DETACH operation failed\n");
1501       }
1502    }
1503    // Before we return from detach, make sure that we've gotten out of waitpid()
1504    // so that we don't steal events on that process.
1505    GeneratorLinux* g = dynamic_cast<GeneratorLinux*>(Generator::getDefaultGenerator());
1506    assert(g);
1507    g->evictFromWaitpid();
1508    
1509    return !had_error;
1510 }
1511
1512 bool linux_process::plat_terminate(bool &needs_sync)
1513 {
1514    //ProcPool lock should be held.
1515    //I had been using PTRACE_KILL here, but that was proving to be inconsistent.
1516
1517
1518    pthrd_printf("Terminating process %d\n", getPid());
1519    int result = kill(getPid(), SIGKILL);
1520    if (result == -1) {
1521       if (errno == ESRCH) {
1522          perr_printf("Process %d no longer exists\n", getPid());
1523          setLastError(err_noproc, "Process no longer exists");
1524       }
1525       else {
1526          perr_printf("Failed to kill(%d, SIGKILL) process\n", getPid());
1527          setLastError(err_internal, "Unexpected failure of kill\n");
1528          return false;
1529       }
1530    }
1531
1532    needs_sync = true;
1533    return true;
1534 }
1535
1536 bool linux_process::preTerminate() {
1537
1538    pthrd_printf("Stopping process %d for pre-terminate handling\n", getPid());
1539    threadPool()->initialThread()->getInternalState().desyncStateProc(int_thread::stopped);
1540    bool threw_event = false;
1541    while (!threadPool()->allStopped(int_thread::InternalStateID)) {
1542       if (!threw_event) {
1543          throwNopEvent();
1544          threw_event = true;
1545       }
1546       bool exited = false;
1547       auto pid = getPid();
1548       int_process::waitAndHandleForProc(true, this, exited);
1549       if (exited) {
1550          // Note, can't even call getPid() anymore, since 'this' is ironically deleted.
1551          perr_printf("Process %d exited during terminate handling.  Is this irony?\n", pid);
1552          return false;
1553       }
1554    }
1555    pthrd_printf("Putting process %d back into previous state\n", getPid());
1556    threadPool()->initialThread()->getInternalState().restoreStateProc();
1557
1558 #if defined(bug_force_terminate_failure)
1559     // On some Linux versions (currently only identified on our power platform),
1560     // a force terminate can fail to actually kill a process due to some OS level
1561     // race condition. The result is that some threads in a process are stopped
1562     // instead of exited and for some reason, continues will not continue the 
1563     // process. This can be detected because some OS level structures (such as pipes)
1564     // still exist for the terminated process
1565
1566     // It appears that this bug largely results from the pre-LWP destroy and pre-Exit
1567     // events being delivered to the debugger, so we stop the process and disable these
1568     // events for all threads in the process
1569
1570    int_threadPool::iterator i;
1571    for(i = threadPool()->begin(); i != threadPool()->end(); i++)
1572    {
1573       linux_thread *thr = dynamic_cast<linux_thread *>(*i);
1574       pthrd_printf("Disabling syscall tracing events for thread %d/%d\n",
1575                    getPid(), thr->getLWP());
1576       if( !thr->unsetOptions() ) {
1577          perr_printf("Failed to unset options for thread %d/%d in pre-terminate handling\n",
1578                      getPid(), thr->getLWP());
1579          return false;
1580       }
1581    }
1582 #endif
1583    
1584    // We don't want to be mixing termination and breakpoint stepping. 
1585    removeAllBreakpoints();
1586
1587    // And put things back where we found them. 
1588    throwNopEvent();
1589
1590    pthrd_printf("Waiting for process %d to resynchronize before terminating\n", getPid());
1591    int_process::waitAndHandleEvents(false);
1592
1593    return true;
1594 }
1595
1596 OSType linux_process::getOS() const
1597 {
1598    return Dyninst::Linux;
1599 }
1600
1601 Dyninst::Address linux_process::plat_mallocExecMemory(Dyninst::Address min, unsigned size) {
1602     Dyninst::Address result = 0x0;
1603     bool found_result = false;
1604     unsigned maps_size;
1605     map_entries *maps = getVMMaps(getPid(), maps_size);
1606     assert(maps); //TODO, Perhaps go to libraries for address map if no /proc/
1607     for (unsigned i=0; i<maps_size; i++) {
1608         if (!(maps[i].prems & PREMS_EXEC))
1609             continue;
1610         if (min + size > maps[i].end)
1611             continue;
1612         if (maps[i].end - maps[i].start < size)
1613             continue;
1614
1615         if (maps[i].start > min)
1616             result = maps[i].start;
1617         else
1618             result = min;
1619         found_result = true;
1620         break;
1621     }
1622     assert(found_result);
1623     free(maps);
1624     return result;
1625 }
1626
1627 bool linux_process::fork_setTracking(FollowFork::follow_t f)
1628 {
1629    int_threadPool::iterator i;      
1630    for (i = threadPool()->begin(); i != threadPool()->end(); i++) {
1631       int_thread *thrd = *i;
1632       if (thrd->getUserState().getState() != int_thread::stopped) {
1633          perr_printf("Could not set fork tracking because thread %d/%d was not stopped\n", 
1634                      getPid(), thrd->getLWP());
1635          setLastError(err_notstopped, "All threads must be stopped to change fork tracking\n");
1636          return false;
1637       }
1638    }
1639    if (f == FollowFork::None) {
1640       perr_printf("Could not set fork tracking on %d to None\n", getPid());
1641       setLastError(err_badparam, "Cannot set fork tracking to None");
1642       return false;
1643    }
1644
1645    if (f == fork_tracking) {
1646       pthrd_printf("Leaving fork tracking for %d in state %d\n",
1647                    getPid(), (int) f);
1648       return true;
1649    }
1650
1651    for (i = threadPool()->begin(); i != threadPool()->end(); i++) {
1652       int_thread *thrd = *i;
1653       linux_thread *lthrd = dynamic_cast<linux_thread *>(thrd);
1654       pthrd_printf("Changing fork tracking for thread %d/%d to %d\n",
1655                    getPid(), lthrd->getLWP(), (int) f);
1656       lthrd->setOptions();
1657    }
1658    return true;
1659 }
1660
1661 FollowFork::follow_t linux_process::fork_isTracking() {
1662    return fork_tracking;
1663 }
1664
1665 bool linux_process::plat_lwpChangeTracking(bool) {
1666    int_threadPool *pool = threadPool();
1667    if (!pool->allStopped(int_thread::UserStateID)) {
1668       perr_printf("Attempted to change lwpTracking, but not all threads stopped in %d", getPid());
1669       setLastError(err_notstopped, "Process not stopped before changing LWP tracking state");
1670       return false;
1671    }
1672
1673    for (int_threadPool::iterator i = pool->begin(); i != pool->end(); i++) {
1674       int_thread *thrd = *i;
1675       linux_thread *lthrd = dynamic_cast<linux_thread *>(thrd);
1676       assert(lthrd);
1677       lthrd->setOptions();
1678    }
1679    return true;
1680 }
1681
1682 bool linux_process::allowSignal(int signal_no) {
1683    dyn_sigset_t mask = getSigMask();
1684    return sigismember(&mask, signal_no);
1685 }
1686
1687 bool linux_process::readStatM(unsigned long &stk, unsigned long &heap, unsigned long &shrd)
1688 {
1689    char path[64];
1690    snprintf(path, 64, "/proc/%d/statm", getPid());
1691    path[63] = '\0';
1692    
1693    unsigned long size, resident, shared, text, lib, data, dt;
1694    FILE *f = fopen(path, "r");
1695    if (!f) {
1696       perr_printf("Could not open %s: %s\n", path, strerror(errno));
1697       setLastError(err_internal, "Could not access /proc");
1698       return false;
1699    }
1700    fscanf(f, "%lu %lu %lu %lu %lu %lu %lu", &size, &resident, &shared, 
1701           &text, &lib, &data, &dt);
1702    fclose(f);
1703    unsigned long page_size = getpagesize();
1704
1705    stk = 0;
1706    shrd = (shared + text) * page_size;
1707    heap = data * page_size;
1708    return true;
1709 }
1710
1711 bool linux_process::plat_getStackUsage(MemUsageResp_t *resp)
1712 {
1713    unsigned long stk, heap, shrd;
1714    bool result = readStatM(stk, heap, shrd);
1715    if (!result) 
1716       return false;
1717    *resp->get() = stk;
1718    resp->done();
1719    return true;
1720 }
1721
1722 bool linux_process::plat_getHeapUsage(MemUsageResp_t *resp)
1723 {
1724    unsigned long stk, heap, shrd;
1725    bool result = readStatM(stk, heap, shrd);
1726    if (!result) 
1727       return false;
1728    *resp->get() = heap;
1729    resp->done();
1730    return true;
1731 }
1732
1733 bool linux_process::plat_getSharedUsage(MemUsageResp_t *resp)
1734 {
1735    unsigned long stk, heap, shrd;
1736    bool result = readStatM(stk, heap, shrd);
1737    if (!result) 
1738       return false;
1739    *resp->get() = shrd;
1740    resp->done();
1741    return true;
1742 }
1743
1744 bool linux_process::plat_residentNeedsMemVals()
1745 {
1746    return false;
1747 }
1748
1749 bool linux_process::plat_getResidentUsage(unsigned long, unsigned long, unsigned long,
1750                            MemUsageResp_t *)
1751 {
1752    return false;
1753 }
1754
1755 #if !defined(OFFSETOF)
1756 #define OFFSETOF(STR, FLD) (unsigned long) (&(((STR *) 0x0)->FLD))
1757 #endif
1758
1759 dynreg_to_user_t dynreg_to_user;
1760 static void init_dynreg_to_user()
1761 {
1762    static volatile bool initialized = false;
1763    static Mutex<> init_lock;
1764    if (initialized)
1765       return;
1766       
1767    init_lock.lock();
1768    if (initialized) {
1769       init_lock.unlock();
1770       return;
1771    }
1772     
1773    //Match the order of the 'user' structure to map registers correctly.
1774    int cur = 0;
1775    if (sizeof(void*) == 8) {
1776       /**
1777        * This is annoying, struct user is different for 64-bit processes debugging 
1778        * 32-bit processes.
1779        **/
1780       //r15
1781       cur+= 8; //r14
1782       cur+= 8; //r13
1783       cur+= 8; //r12
1784       dynreg_to_user[x86::ebp]   = make_pair(cur+=8, 4);
1785       dynreg_to_user[x86::ebx]   = make_pair(cur+=8, 4);
1786       cur+= 8; //r11
1787       cur+= 8; //r10
1788       cur+= 8; //r9
1789       cur+= 8; //r8
1790       dynreg_to_user[x86::eax]   = make_pair(cur+=8, 4);
1791       dynreg_to_user[x86::ecx]   = make_pair(cur+=8, 4);
1792       dynreg_to_user[x86::edx]   = make_pair(cur+=8, 4);
1793       dynreg_to_user[x86::esi]   = make_pair(cur+=8, 4);
1794       dynreg_to_user[x86::edi]   = make_pair(cur+=8, 4);
1795       dynreg_to_user[x86::oeax]  = make_pair(cur+=8, 4);
1796       dynreg_to_user[x86::eip]   = make_pair(cur+=8, 4);
1797       dynreg_to_user[x86::cs]    = make_pair(cur+=8, 4);
1798       dynreg_to_user[x86::flags] = make_pair(cur+=8, 4);
1799       dynreg_to_user[x86::esp]   = make_pair(cur+=8, 4);
1800       dynreg_to_user[x86::ss]    = make_pair(cur+=8, 4);
1801       dynreg_to_user[x86::fsbase]= make_pair(cur+=8, 4);
1802       dynreg_to_user[x86::gsbase]= make_pair(cur+=8, 4);
1803       dynreg_to_user[x86::ds]    = make_pair(cur+=8, 4);
1804       dynreg_to_user[x86::es]    = make_pair(cur+=8, 4);
1805       dynreg_to_user[x86::fs]    = make_pair(cur+=8, 4);
1806       dynreg_to_user[x86::gs]    = make_pair(cur+=8, 4);
1807 #if defined(arch_x86) || defined(arch_x86_64)
1808       cur = OFFSETOF(user, u_debugreg);
1809 #endif
1810       dynreg_to_user[x86::dr0]   = make_pair(cur, 4);
1811       dynreg_to_user[x86::dr1]   = make_pair(cur+=8, 4);
1812       dynreg_to_user[x86::dr2]   = make_pair(cur+=8, 4);
1813       dynreg_to_user[x86::dr3]   = make_pair(cur+=8, 4);
1814       dynreg_to_user[x86::dr4]   = make_pair(cur+=8, 4);
1815       dynreg_to_user[x86::dr5]   = make_pair(cur+=8, 4);
1816       dynreg_to_user[x86::dr6]   = make_pair(cur+=8, 4);
1817       dynreg_to_user[x86::dr7]   = make_pair(cur+=8, 4);
1818    }
1819    else {
1820       dynreg_to_user[x86::ebx]   = make_pair(cur, 4);
1821       dynreg_to_user[x86::ecx]   = make_pair(cur+=4, 4);
1822       dynreg_to_user[x86::edx]   = make_pair(cur+=4, 4);
1823       dynreg_to_user[x86::esi]   = make_pair(cur+=4, 4);
1824       dynreg_to_user[x86::edi]   = make_pair(cur+=4, 4);
1825       dynreg_to_user[x86::ebp]   = make_pair(cur+=4, 4);
1826       dynreg_to_user[x86::eax]   = make_pair(cur+=4, 4);
1827       dynreg_to_user[x86::ds]    = make_pair(cur+=4, 4);
1828       dynreg_to_user[x86::es]    = make_pair(cur+=4, 4);
1829       dynreg_to_user[x86::fs]    = make_pair(cur+=4, 4);
1830       dynreg_to_user[x86::gs]    = make_pair(cur+=4, 4);
1831       dynreg_to_user[x86::oeax]  = make_pair(cur+=4, 4);
1832       dynreg_to_user[x86::eip]   = make_pair(cur+=4, 4);
1833       dynreg_to_user[x86::cs]    = make_pair(cur+=4, 4);
1834       dynreg_to_user[x86::flags] = make_pair(cur+=4, 4);
1835       dynreg_to_user[x86::esp]   = make_pair(cur+=4, 4);
1836       dynreg_to_user[x86::ss]    = make_pair(cur+=4, 4);
1837 #if defined(arch_x86) || defined(arch_x86_64)
1838       cur = OFFSETOF(user, u_debugreg);
1839 #endif
1840       dynreg_to_user[x86::dr0]   = make_pair(cur, 4);
1841       dynreg_to_user[x86::dr1]   = make_pair(cur+=4, 4);
1842       dynreg_to_user[x86::dr2]   = make_pair(cur+=4, 4);
1843       dynreg_to_user[x86::dr3]   = make_pair(cur+=4, 4);
1844       dynreg_to_user[x86::dr4]   = make_pair(cur+=4, 4);
1845       dynreg_to_user[x86::dr5]   = make_pair(cur+=4, 4);
1846       dynreg_to_user[x86::dr6]   = make_pair(cur+=4, 4);
1847       dynreg_to_user[x86::dr7]   = make_pair(cur+=4, 4);
1848    }
1849    cur = 0;
1850    dynreg_to_user[x86_64::r15]    = make_pair(cur, 8);
1851    dynreg_to_user[x86_64::r14]    = make_pair(cur+=8, 8);
1852    dynreg_to_user[x86_64::r13]    = make_pair(cur+=8, 8);
1853    dynreg_to_user[x86_64::r12]    = make_pair(cur+=8, 8);
1854    dynreg_to_user[x86_64::rbp]    = make_pair(cur+=8, 8);
1855    dynreg_to_user[x86_64::rbx]    = make_pair(cur+=8, 8);
1856    dynreg_to_user[x86_64::r11]    = make_pair(cur+=8, 8);
1857    dynreg_to_user[x86_64::r10]    = make_pair(cur+=8, 8);
1858    dynreg_to_user[x86_64::r9]     = make_pair(cur+=8, 8);
1859    dynreg_to_user[x86_64::r8]     = make_pair(cur+=8, 8);
1860    dynreg_to_user[x86_64::rax]    = make_pair(cur+=8, 8);
1861    dynreg_to_user[x86_64::rcx]    = make_pair(cur+=8, 8);
1862    dynreg_to_user[x86_64::rdx]    = make_pair(cur+=8, 8);
1863    dynreg_to_user[x86_64::rsi]    = make_pair(cur+=8, 8);
1864    dynreg_to_user[x86_64::rdi]    = make_pair(cur+=8, 8);
1865    dynreg_to_user[x86_64::orax]   = make_pair(cur+=8, 8);
1866    dynreg_to_user[x86_64::rip]    = make_pair(cur+=8, 8);
1867    dynreg_to_user[x86_64::cs]     = make_pair(cur+=8, 8);
1868    dynreg_to_user[x86_64::flags]  = make_pair(cur+=8, 8);
1869    dynreg_to_user[x86_64::rsp]    = make_pair(cur+=8, 8);
1870    dynreg_to_user[x86_64::ss]     = make_pair(cur+=8, 8);
1871    dynreg_to_user[x86_64::fsbase] = make_pair(cur+=8, 8);
1872    dynreg_to_user[x86_64::gsbase] = make_pair(cur+=8, 8);
1873    dynreg_to_user[x86_64::ds]     = make_pair(cur+=8, 8);
1874    dynreg_to_user[x86_64::es]     = make_pair(cur+=8, 8);
1875    dynreg_to_user[x86_64::fs]     = make_pair(cur+=8, 8);
1876    dynreg_to_user[x86_64::gs]     = make_pair(cur+=8, 8);
1877 #if defined(arch_x86) || defined(arch_x86_64)
1878    cur = OFFSETOF(user, u_debugreg);
1879 #endif
1880    dynreg_to_user[x86_64::dr0]   = make_pair(cur, 8);
1881    dynreg_to_user[x86_64::dr1]   = make_pair(cur+=8, 8);
1882    dynreg_to_user[x86_64::dr2]   = make_pair(cur+=8, 8);
1883    dynreg_to_user[x86_64::dr3]   = make_pair(cur+=8, 8);
1884    dynreg_to_user[x86_64::dr4]   = make_pair(cur+=8, 8);
1885    dynreg_to_user[x86_64::dr5]   = make_pair(cur+=8, 8);
1886    dynreg_to_user[x86_64::dr6]   = make_pair(cur+=8, 8);
1887    dynreg_to_user[x86_64::dr7]   = make_pair(cur+=8, 8);
1888  
1889    cur = 0;
1890    if(sizeof(void *) == 8 ) {
1891        dynreg_to_user[ppc32::r0]        = make_pair(cur, 4);
1892        dynreg_to_user[ppc32::r1]        = make_pair(cur+=8, 4);
1893        dynreg_to_user[ppc32::r2]        = make_pair(cur+=8, 4);
1894        dynreg_to_user[ppc32::r3]        = make_pair(cur+=8, 4);
1895        dynreg_to_user[ppc32::r4]        = make_pair(cur+=8, 4);
1896        dynreg_to_user[ppc32::r5]        = make_pair(cur+=8, 4);
1897        dynreg_to_user[ppc32::r6]        = make_pair(cur+=8, 4);
1898        dynreg_to_user[ppc32::r7]        = make_pair(cur+=8, 4);
1899        dynreg_to_user[ppc32::r8]        = make_pair(cur+=8, 4);
1900        dynreg_to_user[ppc32::r9]        = make_pair(cur+=8, 4);
1901        dynreg_to_user[ppc32::r10]        = make_pair(cur+=8, 4);
1902        dynreg_to_user[ppc32::r11]        = make_pair(cur+=8, 4);
1903        dynreg_to_user[ppc32::r12]        = make_pair(cur+=8, 4);
1904        dynreg_to_user[ppc32::r13]        = make_pair(cur+=8, 4);
1905        dynreg_to_user[ppc32::r14]        = make_pair(cur+=8, 4);
1906        dynreg_to_user[ppc32::r15]        = make_pair(cur+=8, 4);
1907        dynreg_to_user[ppc32::r16]        = make_pair(cur+=8, 4);
1908        dynreg_to_user[ppc32::r17]        = make_pair(cur+=8, 4);
1909        dynreg_to_user[ppc32::r18]        = make_pair(cur+=8, 4);
1910        dynreg_to_user[ppc32::r19]        = make_pair(cur+=8, 4);
1911        dynreg_to_user[ppc32::r20]        = make_pair(cur+=8, 4);
1912        dynreg_to_user[ppc32::r21]        = make_pair(cur+=8, 4);
1913        dynreg_to_user[ppc32::r22]        = make_pair(cur+=8, 4);
1914        dynreg_to_user[ppc32::r23]        = make_pair(cur+=8, 4);
1915        dynreg_to_user[ppc32::r24]        = make_pair(cur+=8, 4);
1916        dynreg_to_user[ppc32::r25]        = make_pair(cur+=8, 4);
1917        dynreg_to_user[ppc32::r26]        = make_pair(cur+=8, 4);
1918        dynreg_to_user[ppc32::r27]        = make_pair(cur+=8, 4);
1919        dynreg_to_user[ppc32::r28]        = make_pair(cur+=8, 4);
1920        dynreg_to_user[ppc32::r29]        = make_pair(cur+=8, 4);
1921        dynreg_to_user[ppc32::r30]        = make_pair(cur+=8, 4);
1922        dynreg_to_user[ppc32::r31]        = make_pair(cur+=8, 4);
1923        dynreg_to_user[ppc32::pc]        = make_pair(cur+=8, 4);
1924        dynreg_to_user[ppc32::msr]        = make_pair(cur+=8, 4);
1925        dynreg_to_user[ppc32::or3]        = make_pair(cur+=8, 4);
1926        dynreg_to_user[ppc32::ctr]        = make_pair(cur+=8, 4);
1927        dynreg_to_user[ppc32::lr]        = make_pair(cur+=8, 4);
1928        dynreg_to_user[ppc32::xer]        = make_pair(cur+=8, 4);
1929        dynreg_to_user[ppc32::cr]        = make_pair(cur+=8, 4);
1930        dynreg_to_user[ppc32::mq]         = make_pair(cur+=8, 4);
1931        dynreg_to_user[ppc32::trap]       = make_pair(cur+=8, 4);
1932        dynreg_to_user[ppc32::dar]        = make_pair(cur+=8, 4);
1933        dynreg_to_user[ppc32::dsisr]      = make_pair(cur+=8, 4);
1934    }else{
1935        dynreg_to_user[ppc32::r0]        = make_pair(cur, 4);
1936        dynreg_to_user[ppc32::r1]        = make_pair(cur+=4, 4);
1937        dynreg_to_user[ppc32::r2]        = make_pair(cur+=4, 4);
1938        dynreg_to_user[ppc32::r3]        = make_pair(cur+=4, 4);
1939        dynreg_to_user[ppc32::r4]        = make_pair(cur+=4, 4);
1940        dynreg_to_user[ppc32::r5]        = make_pair(cur+=4, 4);
1941        dynreg_to_user[ppc32::r6]        = make_pair(cur+=4, 4);
1942        dynreg_to_user[ppc32::r7]        = make_pair(cur+=4, 4);
1943        dynreg_to_user[ppc32::r8]        = make_pair(cur+=4, 4);
1944        dynreg_to_user[ppc32::r9]        = make_pair(cur+=4, 4);
1945        dynreg_to_user[ppc32::r10]        = make_pair(cur+=4, 4);
1946        dynreg_to_user[ppc32::r11]        = make_pair(cur+=4, 4);
1947        dynreg_to_user[ppc32::r12]        = make_pair(cur+=4, 4);
1948        dynreg_to_user[ppc32::r13]        = make_pair(cur+=4, 4);
1949        dynreg_to_user[ppc32::r14]        = make_pair(cur+=4, 4);
1950        dynreg_to_user[ppc32::r15]        = make_pair(cur+=4, 4);
1951        dynreg_to_user[ppc32::r16]        = make_pair(cur+=4, 4);
1952        dynreg_to_user[ppc32::r17]        = make_pair(cur+=4, 4);
1953        dynreg_to_user[ppc32::r18]        = make_pair(cur+=4, 4);
1954        dynreg_to_user[ppc32::r19]        = make_pair(cur+=4, 4);
1955        dynreg_to_user[ppc32::r20]        = make_pair(cur+=4, 4);
1956        dynreg_to_user[ppc32::r21]        = make_pair(cur+=4, 4);
1957        dynreg_to_user[ppc32::r22]        = make_pair(cur+=4, 4);
1958        dynreg_to_user[ppc32::r23]        = make_pair(cur+=4, 4);
1959        dynreg_to_user[ppc32::r24]        = make_pair(cur+=4, 4);
1960        dynreg_to_user[ppc32::r25]        = make_pair(cur+=4, 4);
1961        dynreg_to_user[ppc32::r26]        = make_pair(cur+=4, 4);
1962        dynreg_to_user[ppc32::r27]        = make_pair(cur+=4, 4);
1963        dynreg_to_user[ppc32::r28]        = make_pair(cur+=4, 4);
1964        dynreg_to_user[ppc32::r29]        = make_pair(cur+=4, 4);
1965        dynreg_to_user[ppc32::r30]        = make_pair(cur+=4, 4);
1966        dynreg_to_user[ppc32::r31]        = make_pair(cur+=4, 4);
1967        dynreg_to_user[ppc32::pc]        = make_pair(cur+=4, 4);
1968        dynreg_to_user[ppc32::msr]        = make_pair(cur+=4, 4);
1969        dynreg_to_user[ppc32::or3]        = make_pair(cur+=4, 4);
1970        dynreg_to_user[ppc32::ctr]        = make_pair(cur+=4, 4);
1971        dynreg_to_user[ppc32::lr]        = make_pair(cur+=4, 4);
1972        dynreg_to_user[ppc32::xer]        = make_pair(cur+=4, 4);
1973        dynreg_to_user[ppc32::cr]        = make_pair(cur+=4, 4);
1974        dynreg_to_user[ppc32::mq]         = make_pair(cur+=4, 4);
1975        dynreg_to_user[ppc32::trap]       = make_pair(cur+=4, 4);
1976        dynreg_to_user[ppc32::dar]        = make_pair(cur+=4, 4);
1977        dynreg_to_user[ppc32::dsisr]      = make_pair(cur+=4, 4);
1978    }
1979    cur = 0;
1980    dynreg_to_user[ppc64::r0]        = make_pair(cur, 8);
1981    dynreg_to_user[ppc64::r1]        = make_pair(cur+=8, 8);
1982    dynreg_to_user[ppc64::r2]        = make_pair(cur+=8, 8);
1983    dynreg_to_user[ppc64::r3]        = make_pair(cur+=8, 8);
1984    dynreg_to_user[ppc64::r4]        = make_pair(cur+=8, 8);
1985    dynreg_to_user[ppc64::r5]        = make_pair(cur+=8, 8);
1986    dynreg_to_user[ppc64::r6]        = make_pair(cur+=8, 8);
1987    dynreg_to_user[ppc64::r7]        = make_pair(cur+=8, 8);
1988    dynreg_to_user[ppc64::r8]        = make_pair(cur+=8, 8);
1989    dynreg_to_user[ppc64::r9]        = make_pair(cur+=8, 8);
1990    dynreg_to_user[ppc64::r10]        = make_pair(cur+=8, 8);
1991    dynreg_to_user[ppc64::r11]        = make_pair(cur+=8, 8);
1992    dynreg_to_user[ppc64::r12]        = make_pair(cur+=8, 8);
1993    dynreg_to_user[ppc64::r13]        = make_pair(cur+=8, 8);
1994    dynreg_to_user[ppc64::r14]        = make_pair(cur+=8, 8);
1995    dynreg_to_user[ppc64::r15]        = make_pair(cur+=8, 8);
1996    dynreg_to_user[ppc64::r16]        = make_pair(cur+=8, 8);
1997    dynreg_to_user[ppc64::r17]        = make_pair(cur+=8, 8);
1998    dynreg_to_user[ppc64::r18]        = make_pair(cur+=8, 8);
1999    dynreg_to_user[ppc64::r19]        = make_pair(cur+=8, 8);
2000    dynreg_to_user[ppc64::r20]        = make_pair(cur+=8, 8);
2001    dynreg_to_user[ppc64::r21]        = make_pair(cur+=8, 8);
2002    dynreg_to_user[ppc64::r22]        = make_pair(cur+=8, 8);
2003    dynreg_to_user[ppc64::r23]        = make_pair(cur+=8, 8);
2004    dynreg_to_user[ppc64::r24]        = make_pair(cur+=8, 8);
2005    dynreg_to_user[ppc64::r25]        = make_pair(cur+=8, 8);
2006    dynreg_to_user[ppc64::r26]        = make_pair(cur+=8, 8);
2007    dynreg_to_user[ppc64::r27]        = make_pair(cur+=8, 8);
2008    dynreg_to_user[ppc64::r28]        = make_pair(cur+=8, 8);
2009    dynreg_to_user[ppc64::r29]        = make_pair(cur+=8, 8);
2010    dynreg_to_user[ppc64::r30]        = make_pair(cur+=8, 8);
2011    dynreg_to_user[ppc64::r31]        = make_pair(cur+=8, 8);
2012    dynreg_to_user[ppc64::pc]        = make_pair(cur+=8, 8);
2013    dynreg_to_user[ppc64::msr]        = make_pair(cur+=8, 8);
2014    dynreg_to_user[ppc64::or3]        = make_pair(cur+=8, 8);
2015    dynreg_to_user[ppc64::ctr]        = make_pair(cur+=8, 8);
2016    dynreg_to_user[ppc64::lr]        = make_pair(cur+=8, 8);
2017    dynreg_to_user[ppc64::xer]        = make_pair(cur+=8, 8);
2018    dynreg_to_user[ppc64::cr]        = make_pair(cur+=8, 8);
2019    dynreg_to_user[ppc64::mq]         = make_pair(cur+=8, 8);
2020    dynreg_to_user[ppc64::trap]       = make_pair(cur+=8, 8);
2021    dynreg_to_user[ppc64::dar]        = make_pair(cur+=8, 8);
2022    dynreg_to_user[ppc64::dsisr]      = make_pair(cur+=8, 8);
2023
2024    initialized = true;
2025
2026    init_lock.unlock();
2027 }
2028
2029 #if defined(PT_GETREGS)
2030 #define MY_PTRACE_GETREGS PTRACE_GETREGS
2031 #elif defined(arch_power)
2032 //Kernel value for PPC_PTRACE_SETREGS 0x99
2033 #define MY_PTRACE_GETREGS 12
2034 #endif
2035
2036 //912 is currently the x86_64 size, 128 bytes for just-because padding
2037 #define MAX_USER_SIZE (912+128)
2038 bool linux_thread::plat_getAllRegisters(int_registerPool &regpool)
2039 {
2040    static bool have_getregs = true;
2041    static bool tested_getregs = false;
2042
2043 #if defined(bug_registers_after_exit)
2044    /* On some kernels, attempting to read registers from a thread in a pre-Exit
2045     * state causes an oops
2046     */
2047    if( isExiting() ) {
2048        perr_printf("Cannot reliably retrieve registers from an exited thread\n");
2049        setLastError(err_exited, "Cannot retrieve registers from an exited thread");
2050        return false;
2051    }
2052 #endif
2053
2054    volatile unsigned int sentinel1 = 0xfeedface;
2055    unsigned char user_area[MAX_USER_SIZE];
2056    volatile unsigned int sentinel2 = 0xfeedface;
2057    memset(user_area, 0, MAX_USER_SIZE);
2058
2059    Dyninst::Architecture curplat = llproc()->getTargetArch();
2060    init_dynreg_to_user();
2061    dynreg_to_user_t::iterator i;
2062
2063    if (have_getregs)
2064    {
2065       long result = do_ptrace((pt_req) MY_PTRACE_GETREGS, lwp, user_area, user_area);
2066       if (result != 0) {
2067          int error = errno;
2068          if (error == EIO && !tested_getregs) {
2069             pthrd_printf("PTRACE_GETREGS not working.  Trying PTRACE_PEEKUSER\n");
2070             have_getregs = false;
2071          }
2072          else {
2073             perr_printf("Error reading registers from %d\n", lwp);
2074             setLastError(err_internal, "Could not read user area from thread");
2075             return false;
2076          }
2077       }
2078       tested_getregs = true;
2079    }
2080    if (!have_getregs)
2081    {
2082       for (i = dynreg_to_user.begin(); i != dynreg_to_user.end(); i++) {
2083          const MachRegister reg = i->first;
2084          if (reg.getArchitecture() != curplat)
2085             continue;
2086          long result = do_ptrace((pt_req) PTRACE_PEEKUSER, lwp, (void *) (unsigned long) i->second.first, NULL);
2087          if (errno == -1) {
2088             perr_printf("Error reading registers from %d at %x\n", lwp, i->second.first);
2089             setLastError(err_internal, "Could not read user area from thread");
2090             return false;
2091          }
2092          if (Dyninst::getArchAddressWidth(curplat) == 4) {
2093             uint32_t val = (uint32_t) result;
2094             *((uint32_t *) (user_area + i->second.first)) = val;
2095          }
2096          else if (Dyninst::getArchAddressWidth(curplat) == 8) {
2097             uint64_t val = (uint64_t) result;
2098             *((uint64_t *) (user_area + i->second.first)) = val;
2099          }
2100          else {
2101             assert(0);
2102          }
2103       }
2104    }
2105
2106    //If a sentinel assert fails, then someone forgot to increase MAX_USER_SIZE
2107    // for a new platform.
2108    assert(sentinel1 == 0xfeedface);
2109    assert(sentinel2 == 0xfeedface);
2110    if(sentinel1 != 0xfeedface || sentinel2 != 0xfeedface) return false;
2111    
2112
2113    regpool.regs.clear();
2114    for (i = dynreg_to_user.begin(); i != dynreg_to_user.end(); i++)
2115    {
2116       const MachRegister reg = i->first;
2117       MachRegisterVal val = 0;
2118       if (reg.getArchitecture() != curplat)
2119          continue;
2120       const unsigned int offset = i->second.first;
2121       const unsigned int size = i->second.second;
2122       if (size == 4) {
2123          if( sizeof(void *) == 8 ) {
2124             // Avoid endian issues
2125             uint64_t tmpVal = *((uint64_t *) (user_area+offset));
2126             val = (uint32_t) tmpVal;
2127          }else{
2128             val = *((uint32_t *) (user_area+offset));
2129          }
2130       }
2131       else if (size == 8) {
2132          val = *((uint64_t *) (user_area+offset));
2133       }
2134       else {
2135          assert(0);
2136       }
2137
2138      pthrd_printf("Register %s has value %lx, offset %d\n", reg.name().c_str(), val, offset);
2139       regpool.regs[reg] = val;
2140    }
2141    return true;
2142 }
2143
2144 bool linux_thread::plat_getRegister(Dyninst::MachRegister reg, Dyninst::MachRegisterVal &val)
2145 {
2146 #if defined(bug_registers_after_exit)
2147    /* On some kernels, attempting to read registers from a thread in a pre-Exit
2148     * state causes an oops
2149     */
2150    if( isExiting() ) {
2151        perr_printf("Cannot reliably retrieve registers from an exited thread\n");
2152        setLastError(err_exited, "Cannot retrieve registers from an exited thread");
2153        return false;
2154    }
2155 #endif
2156
2157    if (x86::fsbase == reg || x86::gsbase == reg 
2158        || x86_64::fsbase == reg || x86_64::gsbase == reg) {
2159       return getSegmentBase(reg, val);
2160    }
2161
2162    init_dynreg_to_user();
2163    dynreg_to_user_t::iterator i = dynreg_to_user.find(reg);
2164    if (i == dynreg_to_user.end() || reg.getArchitecture() != llproc()->getTargetArch()) {
2165       perr_printf("Recieved unexpected register %s on thread %d\n", reg.name().c_str(), lwp);
2166       setLastError(err_badparam, "Invalid register");
2167       return false;
2168    }
2169
2170    const unsigned offset = i->second.first;
2171    const unsigned size = i->second.second;
2172    assert(sizeof(val) >= size);
2173    if(sizeof(val) < size) return false;
2174    
2175    val = 0;
2176    unsigned long result = do_ptrace((pt_req) PTRACE_PEEKUSER, lwp, (void *) (unsigned long) offset, NULL);
2177    if (errno != 0) {
2178       perr_printf("Error reading registers from %d: %s\n", lwp, strerror(errno));
2179       setLastError(err_internal, "Could not read register from thread");
2180       return false;
2181    }
2182    val = result;
2183
2184    pthrd_printf("Register %s has value 0x%lx\n", reg.name().c_str(), val);
2185    return true;
2186 }
2187
2188 #if defined(PT_SETREGS)
2189 #define MY_PTRACE_SETREGS PT_SETREGS
2190 #else
2191 //Common kernel value for PTRACE_SETREGS
2192 #define MY_PTRACE_SETREGS 13
2193 #endif
2194
2195 bool linux_thread::plat_setAllRegisters(int_registerPool &regpool) 
2196 {
2197    static bool have_setregs = true;
2198    static bool tested_setregs = false;
2199 #if defined(bug_registers_after_exit)
2200    /* On some kernels, attempting to read registers from a thread in a pre-Exit
2201     * state causes an oops
2202     */
2203    if( isExiting() ) {
2204        perr_printf("Cannot reliably retrieve registers from an exited thread\n");
2205        setLastError(err_exited, "Cannot retrieve registers from an exited thread");
2206        return false;
2207    }
2208 #endif
2209    
2210
2211    if (have_setregs)
2212    {
2213       unsigned char user_area[MAX_USER_SIZE];
2214       //Fill in 'user_area' with the contents of regpool.   
2215       if( !plat_convertToSystemRegs(regpool, user_area) ) return false;
2216       
2217       //Double up the user_area parameter because if MY_PTRACE_SETREGS is
2218       // defined to PPC_PTRACE_SETREGS than the parameters data and addr
2219       // pointers get swapped (just because linux hates us).  Since the 
2220       // other is ignored, we pass it in twice.
2221       int result = do_ptrace((pt_req) MY_PTRACE_SETREGS, lwp, user_area, user_area);
2222       if (result != 0) {
2223          int error = errno;
2224          if (error == EIO && !tested_setregs) {
2225             pthrd_printf("PTRACE_SETREGS not working.  Trying PTRACE_POKEUSER\n");
2226             have_setregs = false;
2227          }
2228          else {
2229             perr_printf("Error setting registers for %d\n", lwp);
2230             setLastError(err_internal, "Could not read user area from thread");
2231             return false;
2232          }
2233       }
2234       tested_setregs = true;
2235    }
2236    if (!have_setregs)
2237    {
2238       Dyninst::Architecture curplat = llproc()->getTargetArch();
2239       init_dynreg_to_user();
2240       for (int_registerPool::iterator i = regpool.regs.begin(); i != regpool.regs.end(); i++) {
2241          assert(i->first.getArchitecture() == curplat);
2242          dynreg_to_user_t::iterator di = dynreg_to_user.find(i->first);
2243          assert(di != dynreg_to_user.end());
2244          
2245          //Don't treat errors on these registers as real errors.
2246          bool not_present = true;
2247          if (curplat == Arch_ppc32)
2248             not_present = (i->first == ppc32::mq || i->first == ppc32::dar || 
2249                            i->first == ppc32::dsisr || i->first == ppc32::trap ||
2250                            i->first == ppc32::or3);
2251          
2252          if (not_present)
2253             continue;
2254          
2255          int result;
2256          uintptr_t res;
2257          if (Dyninst::getArchAddressWidth(curplat) == 4) {
2258             res = (uint32_t) i->second;
2259          }
2260          else {
2261             res = (uint64_t) i->second;
2262          }
2263          result = do_ptrace((pt_req) PTRACE_POKEUSER, lwp, (void *) (unsigned long) di->second.first, (void *) res);
2264          
2265          if (result != 0) {
2266             int error = errno;
2267             perr_printf("Error setting register %s for %d at %d: %s\n", i->first.name().c_str(),
2268                         lwp, (int) di->second.first, strerror(error));
2269             setLastError(err_internal, "Could not read user area from thread");
2270             return false;
2271          }
2272       }
2273    }
2274
2275    pthrd_printf("Successfully set the values of all registers for %d\n", lwp);
2276    return true;
2277 }
2278
2279 bool linux_thread::plat_convertToSystemRegs(const int_registerPool &regpool, unsigned char *user_area,
2280                                             bool gprs_only)
2281 {
2282    init_dynreg_to_user();
2283
2284    Architecture curplat = llproc()->getTargetArch();
2285    unsigned num_found = 0;
2286    for (dynreg_to_user_t::const_iterator i = dynreg_to_user.begin(); i != dynreg_to_user.end(); i++)
2287    {
2288       const MachRegister reg = i->first;
2289       MachRegisterVal val;
2290       if (reg.getArchitecture() != curplat)
2291          continue;
2292
2293       if (gprs_only) {
2294          bool is_gpr;
2295          int rclass = (int) reg.regClass();
2296
2297          switch (llproc()->getTargetArch()) {
2298             //In this case our definition of GPR is anything stored in the elf_gregset_t of 
2299             // the user struct.
2300             case Dyninst::Arch_x86:
2301                is_gpr = ((rclass == x86::GPR) || (rclass == x86::FLAG) || 
2302                          (rclass == x86::MISC) || (rclass == x86::SEG) || !rclass);
2303                break;
2304             case Dyninst::Arch_x86_64:
2305                is_gpr = ((rclass == x86_64::GPR) || (rclass == x86_64::FLAG) || 
2306                          (rclass == x86_64::MISC) || (rclass == x86_64::SEG) || !rclass);
2307                break;
2308             case Dyninst::Arch_ppc32:
2309                is_gpr = true;
2310                break;
2311             case Dyninst::Arch_ppc64:
2312                is_gpr = true;
2313                break;
2314             default:
2315                assert(0);
2316                return false;
2317          }
2318
2319          if (!is_gpr) {
2320             continue;
2321          }
2322       }
2323
2324       num_found++;
2325       const unsigned int offset = i->second.first;
2326       const unsigned int size = i->second.second;
2327       assert(offset+size < MAX_USER_SIZE);
2328
2329       if ((offset+size) > sizeof(prgregset_t)) continue;
2330       
2331       int_registerPool::reg_map_t::const_iterator j = regpool.regs.find(reg);
2332       assert(j != regpool.regs.end());
2333       val = j->second;
2334       
2335       if (size == 4) {
2336           if( sizeof(void *) == 8 ) {
2337               *((uint64_t *) (user_area+offset)) = (uint64_t) val;
2338           } else {
2339               *((uint32_t *) (user_area+offset)) = (uint32_t) val;
2340           }
2341       }
2342       else if (size == 8) {
2343          *((uint64_t *) (user_area+offset)) = (uint64_t) val;
2344       }
2345       else {
2346          assert(0);
2347       }
2348       pthrd_printf("Register %s gets value %lx, offset %d\n", reg.name().c_str(), val, offset);
2349    }
2350
2351    if (!gprs_only && (num_found != regpool.regs.size()))
2352    {
2353       setLastError(err_badparam, "Invalid register set passed to setAllRegisters");
2354       perr_printf("Couldn't find all registers in the register set %u/%u\n", num_found,
2355                   (unsigned int) regpool.regs.size());
2356       return false;
2357    }
2358
2359    return true;
2360 }
2361
2362 bool linux_thread::plat_setRegister(Dyninst::MachRegister reg, Dyninst::MachRegisterVal val)
2363 {
2364 #if defined(bug_registers_after_exit)
2365    /* On some kernels, attempting to read registers from a thread in a pre-Exit
2366     * state causes an oops
2367     */
2368    if( isExiting() ) {
2369        perr_printf("Cannot reliably retrieve registers from an exited thread\n");
2370        setLastError(err_exited, "Cannot retrieve registers from an exited thread");
2371        return false;
2372    }
2373 #endif
2374
2375    init_dynreg_to_user();
2376    dynreg_to_user_t::iterator i = dynreg_to_user.find(reg);
2377    if (reg.getArchitecture() != llproc()->getTargetArch() ||
2378        i == dynreg_to_user.end()) 
2379    {
2380       setLastError(err_badparam, "Invalid register passed to setRegister");
2381       perr_printf("User passed invalid register %s to plat_setRegister, arch is %x\n",
2382                   reg.name().c_str(), (unsigned int) reg.getArchitecture());
2383       return false;
2384    }
2385    
2386    const unsigned int offset = i->second.first;
2387    const unsigned int size = i->second.second;
2388    int result;
2389    uintptr_t value;
2390    if (size == 4) {
2391       value = (uint32_t) val;
2392    }
2393    else if (size == 8) {
2394       value = (uint64_t) val;
2395    }
2396    else {
2397       assert(0);
2398       return false;
2399       
2400    }
2401    result = do_ptrace((pt_req) PTRACE_POKEUSER, lwp, (void *) (uintptr_t)offset, (void *) value);
2402    pthrd_printf("Set register %s (size %u, offset %u) to value %lx\n", reg.name().c_str(), size, offset, val);
2403    if (result != 0) {
2404       int error = errno;
2405       setLastError(err_internal, "Could not set register value");
2406       perr_printf("Unable to set value of register %s in thread %d: %s (%d)\n",
2407                   reg.name().c_str(), lwp, strerror(error), error);
2408       return false;
2409    }
2410    
2411    return true;
2412 }
2413
2414 bool linux_thread::plat_getAllRegistersAsync(allreg_response::ptr result)
2415 {
2416    bool b = plat_getAllRegisters(*result->getRegPool());
2417    if (!b) {
2418       result->markError(getLastError());
2419    }
2420    fake_async_msgs.push_back(result->getID());
2421    return true;
2422 }
2423
2424 bool linux_thread::plat_getRegisterAsync(Dyninst::MachRegister reg, 
2425                                          reg_response::ptr result)
2426 {
2427    Dyninst::MachRegisterVal val = 0;
2428    bool b = plat_getRegister(reg, val);
2429    result->val = val;
2430    if (!b) {
2431       result->markError(getLastError());
2432    }
2433    fake_async_msgs.push_back(result->getID());
2434    return true;
2435 }
2436
2437 bool linux_thread::plat_setAllRegistersAsync(int_registerPool &pool,
2438                                              result_response::ptr result)
2439 {
2440    bool b = plat_setAllRegisters(pool);
2441    if (!b) {
2442       result->markError(getLastError());
2443       result->b = false;
2444    }
2445    else {
2446       result->b = true;
2447    }
2448    fake_async_msgs.push_back(result->getID());
2449    return true;
2450 }
2451
2452 bool linux_thread::plat_setRegisterAsync(Dyninst::MachRegister reg, 
2453                                          Dyninst::MachRegisterVal val,
2454                                          result_response::ptr result)
2455 {
2456    bool b = plat_setRegister(reg, val);
2457    if (!b) {
2458       result->markError(getLastError());
2459       result->b = false;
2460    }
2461    else {
2462       result->b = true;
2463    }
2464    fake_async_msgs.push_back(result->getID());
2465    return true;
2466 }
2467
2468 bool linux_thread::attach()
2469 {
2470    if (llproc()->threadPool()->initialThread() == this) {
2471       return true;
2472    }
2473
2474    if (attach_status != as_needs_attach)
2475    {
2476       pthrd_printf("thread::attach called on running thread %d/%d, should " 
2477                    "be auto-attached.\n", llproc()->getPid(), lwp);
2478       return true;
2479    }
2480
2481    pthrd_printf("Calling PTRACE_ATTACH on thread %d/%d\n", 
2482                 llproc()->getPid(), lwp);
2483    int result = do_ptrace((pt_req) PTRACE_ATTACH, lwp, NULL, NULL);
2484    if (result != 0) {
2485       perr_printf("Failed to attach to thread: %s\n", strerror(errno));
2486       setLastError(err_internal, "Failed to attach to thread");
2487       return false;
2488    }
2489    return true;
2490 }
2491
2492 #if !defined(ARCH_GET_FS)
2493 #define ARCH_GET_FS 0x1003
2494 #endif
2495 #if !defined(ARCH_GET_GS)
2496 #define ARCH_GET_GS 0x1004
2497 #endif
2498 #if !defined(PTRACE_GET_THREAD_AREA)
2499 #define PTRACE_GET_THREAD_AREA 25
2500 #endif
2501 #if !defined(PTRACE_ARCH_PRCTL)
2502 #define PTRACE_ARCH_PRCTL 30
2503 #endif
2504 #define FS_REG_NUM 25
2505 #define GS_REG_NUM 26
2506
2507 bool linux_thread::thrdb_getThreadArea(int val, Dyninst::Address &addr)
2508 {
2509    Dyninst::Architecture arch = llproc()->getTargetArch();
2510    switch (arch) {
2511       case Arch_x86: {
2512          uint32_t addrv[4];
2513          int result = do_ptrace((pt_req) PTRACE_GET_THREAD_AREA, lwp, (void *) (intptr_t)val, &addrv);
2514          if (result != 0) {
2515             int error = errno;
2516             perr_printf("Error doing PTRACE_GET_THREAD_AREA on %d/%d: %s\n", llproc()->getPid(), lwp, strerror(error));
2517             setLastError(err_internal, "Error doing PTRACE_GET_THREAD_AREA\n");
2518             return false;
2519          }
2520          addr = (Dyninst::Address) addrv[1];
2521          break;
2522       }
2523       case Arch_x86_64: {
2524          intptr_t op;
2525          if (val == FS_REG_NUM)
2526             op = ARCH_GET_FS;
2527          else if (val == GS_REG_NUM)
2528             op = ARCH_GET_GS;
2529          else {
2530             perr_printf("Bad value (%d) passed to thrdb_getThreadArea\n", val);
2531             return false;
2532          }
2533          uint64_t addrv = 0;
2534          int result = do_ptrace((pt_req) PTRACE_ARCH_PRCTL, lwp, &addrv, (void *) op);
2535          if (result != 0) {
2536             int error = errno;
2537             perr_printf("Error doing PTRACE_ARCH_PRCTL on %d/%d: %s\n", llproc()->getPid(), lwp, strerror(error));
2538             setLastError(err_internal, "Error doing PTRACE_ARCH_PRCTL\n");
2539             return false;
2540          }
2541          addr = (Dyninst::Address) addrv;
2542          break;
2543       }
2544       default:
2545          assert(0); //Should not be needed on non-x86
2546    }
2547    return true;
2548 }
2549
2550 //Copied from /usr/include/asm/ldt.h, as it was not available on all machines
2551 struct linux_x86_user_desc {
2552    unsigned int  entry_number;   
2553    unsigned long base_addr;
2554    unsigned int  limit;
2555    unsigned int  seg_32bit:1;
2556    unsigned int  contents:2;
2557    unsigned int  read_exec_only:1;
2558    unsigned int  limit_in_pages:1;
2559    unsigned int  seg_not_present:1;
2560    unsigned int  useable:1;
2561 };
2562
2563 bool linux_thread::getSegmentBase(Dyninst::MachRegister reg, Dyninst::MachRegisterVal &val)
2564 {
2565    switch (llproc()->getTargetArch())
2566    {
2567       case Arch_x86_64:
2568          // TODO
2569          // use ptrace_arch_prctl     
2570          pthrd_printf("Segment bases on x86_64 not implemented\n");
2571          return false;
2572       case Arch_x86: {
2573          MachRegister segmentSelectorReg;
2574          MachRegisterVal segmentSelectorVal;
2575          unsigned long entryNumber;
2576          struct linux_x86_user_desc entryDesc;
2577
2578          switch (reg.val())
2579          {
2580             case x86::ifsbase: segmentSelectorReg = x86::fs; break;
2581             case x86::igsbase: segmentSelectorReg = x86::gs; break;
2582             default: {
2583                pthrd_printf("Failed to get unrecognized segment base\n");
2584                return false;
2585             }
2586          }
2587
2588          if (!plat_getRegister(segmentSelectorReg, segmentSelectorVal))
2589          {
2590            pthrd_printf("Failed to get segment base with selector %s\n", segmentSelectorReg.name().c_str());
2591            return false;
2592          }
2593          entryNumber = segmentSelectorVal / 8;
2594
2595          pthrd_printf("Get segment base doing PTRACE with entry %lu\n", entryNumber);
2596          long result = do_ptrace((pt_req) PTRACE_GET_THREAD_AREA, 
2597                                  lwp, (void *) entryNumber, (void *) &entryDesc);
2598          if (result == -1 && errno != 0) {
2599             pthrd_printf("PTRACE to get segment base failed: %s\n", strerror(errno));
2600             return false;
2601          }
2602
2603          val = entryDesc.base_addr;
2604          pthrd_printf("Got segment base: 0x%lx\n", val);
2605          return true;
2606       }
2607       default:
2608          assert(!"This is not implemented on this architecture");
2609          return false;
2610    }
2611  }
2612
2613 linux_x86_thread::linux_x86_thread(int_process *p, Dyninst::THR_ID t, Dyninst::LWP l) :
2614    int_thread(p, t, l),
2615    thread_db_thread(p, t, l),
2616    linux_thread(p, t, l),
2617    x86_thread(p, t, l)
2618 {
2619 }
2620
2621 linux_x86_thread::~linux_x86_thread()
2622 {
2623 }
2624
2625 linux_ppc_thread::linux_ppc_thread(int_process *p, Dyninst::THR_ID t, Dyninst::LWP l) :
2626    int_thread(p, t, l),
2627    thread_db_thread(p, t, l),
2628    linux_thread(p, t, l),
2629    ppc_thread(p, t, l)
2630 {
2631 }
2632
2633 linux_ppc_thread::~linux_ppc_thread()
2634 {
2635 }
2636
2637 ArchEventLinux::ArchEventLinux(bool inter_) : 
2638    status(0),
2639    pid(NULL_PID),
2640    interrupted(inter_),
2641    error(0),
2642    child_pid(NULL_PID),
2643    event_ext(0)
2644 {
2645 }
2646
2647 ArchEventLinux::ArchEventLinux(pid_t p, int s) : 
2648    status(s),
2649    pid(p), 
2650    interrupted(false), 
2651    error(0),
2652    child_pid(NULL_PID),
2653    event_ext(0)
2654 {
2655 }
2656
2657 ArchEventLinux::ArchEventLinux(int e) : 
2658    status(0),
2659    pid(NULL_PID),
2660    interrupted(false),
2661    error(e),
2662    child_pid(NULL_PID),
2663    event_ext(0)
2664 {
2665 }
2666       
2667 ArchEventLinux::~ArchEventLinux()
2668 {
2669 }
2670
2671 std::vector<ArchEventLinux *> ArchEventLinux::pending_events;
2672
2673 bool ArchEventLinux::findPairedEvent(ArchEventLinux* &parent, ArchEventLinux* &child)
2674 {
2675    bool is_parent;
2676    if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGTRAP) {
2677       //'this' event is a parent, search list for a child
2678       is_parent = true;
2679    }
2680    else if (WIFSTOPPED(status) && WSTOPSIG(status) == SIGSTOP) {
2681       //'this' event  is a child, search list for a parent
2682       is_parent = false;
2683    }
2684    else 
2685    {
2686       assert(0);
2687       return false;
2688    }
2689    
2690    vector<ArchEventLinux *>::iterator i;
2691    for (i = pending_events.begin(); i != pending_events.end(); i++) {
2692       parent = is_parent ? this : *i;
2693       child = is_parent ? *i : this;
2694       if (parent->child_pid == child->pid) {
2695          pending_events.erase(i);
2696          return true;
2697       }
2698    }
2699    return false;
2700 }
2701
2702 void ArchEventLinux::postponePairedEvent()
2703 {
2704    pending_events.push_back(this);
2705 }
2706
2707 LinuxHandleNewThr::LinuxHandleNewThr() :
2708    Handler("Linux New Thread")
2709 {
2710 }
2711
2712 LinuxHandleNewThr::~LinuxHandleNewThr()
2713 {
2714 }
2715
2716 Handler::handler_ret_t LinuxHandleNewThr::handleEvent(Event::ptr ev)
2717 {
2718    linux_thread *thr = NULL;
2719    if (ev->getEventType().code() == EventType::Bootstrap) {
2720       thr = dynamic_cast<linux_thread *>(ev->getThread()->llthrd());
2721    }
2722    else if (ev->getEventType().code() == EventType::ThreadCreate) {
2723       Dyninst::LWP lwp = static_cast<EventNewThread *>(ev.get())->getLWP();
2724       ProcPool()->condvar()->lock();
2725       thr = dynamic_cast<linux_thread *>(ProcPool()->findThread(lwp));
2726       ProcPool()->condvar()->unlock();
2727    }
2728    assert(thr);
2729                                         
2730    pthrd_printf("Setting ptrace options for new thread %d\n", thr->getLWP());
2731    thr->setOptions();
2732    return ret_success;
2733 }
2734
2735 int LinuxHandleNewThr::getPriority() const
2736 {
2737    return PostPlatformPriority;
2738 }
2739
2740 void LinuxHandleNewThr::getEventTypesHandled(std::vector<EventType> &etypes)
2741 {
2742    etypes.push_back(EventType(EventType::None, EventType::ThreadCreate));
2743    etypes.push_back(EventType(EventType::None, EventType::Bootstrap));
2744 }
2745
2746 LinuxHandleLWPDestroy::LinuxHandleLWPDestroy()
2747     : Handler("Linux LWP Destroy")
2748 {
2749 }
2750
2751 LinuxHandleLWPDestroy::~LinuxHandleLWPDestroy()
2752 {
2753 }
2754
2755 Handler::handler_ret_t LinuxHandleLWPDestroy::handleEvent(Event::ptr ev) {
2756     int_thread *thrd = ev->getThread()->llthrd();
2757
2758     // This handler is necessary because SIGSTOPS cannot be sent to pre-destroyed
2759     // threads -- these stops will never be delivered to the debugger
2760     //
2761     // Setting the exiting state in the thread will avoid any waiting for pending stops
2762     // on this thread
2763
2764     thrd->setExiting(true);
2765
2766     // If there is a pending stop, need to handle it here because there is
2767     // no guarantee that the stop will ever be received
2768     if( thrd->hasPendingStop() ) {
2769        thrd->setPendingStop(false);
2770     }
2771
2772     return ret_success;
2773 }
2774
2775 int LinuxHandleLWPDestroy::getPriority() const
2776 {
2777     return PostPlatformPriority;
2778 }
2779
2780 void LinuxHandleLWPDestroy::getEventTypesHandled(std::vector<EventType> &etypes)
2781 {
2782     etypes.push_back(EventType(EventType::Pre, EventType::LWPDestroy));
2783 }
2784
2785 LinuxHandleForceTerminate::LinuxHandleForceTerminate() :
2786    Handler("Linux Force Termination") {};
2787
2788 LinuxHandleForceTerminate::~LinuxHandleForceTerminate() {}
2789
2790 Handler::handler_ret_t LinuxHandleForceTerminate::handleEvent(Event::ptr ev) {
2791    int_process *proc = ev->getProcess()->llproc();
2792
2793    for (int_threadPool::iterator iter = proc->threadPool()->begin(); 
2794         iter != proc->threadPool()->end(); ++iter) {
2795 #if defined(os_linux)
2796       do_ptrace((pt_req) PTRACE_DETACH, (*iter)->getLWP(), NULL, NULL);
2797 #endif
2798    }
2799    return ret_success;
2800 }
2801
2802 int LinuxHandleForceTerminate::getPriority() const
2803 {
2804    return PostPlatformPriority;
2805 }
2806
2807 void LinuxHandleForceTerminate::getEventTypesHandled(std::vector<EventType> &etypes)
2808 {
2809    etypes.push_back(EventType(EventType::Post, EventType::ForceTerminate));
2810 }
2811
2812 HandlerPool *linux_createDefaultHandlerPool(HandlerPool *hpool)
2813 {
2814    static bool initialized = false;
2815    static LinuxHandleNewThr *lbootstrap = NULL;
2816    static LinuxHandleForceTerminate *lterm = NULL;
2817    if (!initialized) {
2818       lbootstrap = new LinuxHandleNewThr();
2819       lterm = new LinuxHandleForceTerminate();
2820       initialized = true;
2821    }
2822    hpool->addHandler(lbootstrap);
2823    hpool->addHandler(lterm);
2824    thread_db_process::addThreadDBHandlers(hpool);
2825    sysv_process::addSysVHandlers(hpool);
2826    return hpool;
2827 }
2828
2829 HandlerPool *plat_createDefaultHandlerPool(HandlerPool *hpool)
2830 {
2831    return linux_createDefaultHandlerPool(hpool);
2832 }
2833
2834 bool ProcessPool::LWPIDsAreUnique()
2835 {
2836    return true;
2837 }
2838
2839 LinuxPtrace *LinuxPtrace::linuxptrace = NULL;
2840
2841 long do_ptrace(pt_req request, pid_t pid, void *addr, void *data)
2842 {
2843    return LinuxPtrace::getPtracer()->ptrace_int(request, pid, addr, data);
2844 }
2845
2846 LinuxPtrace *LinuxPtrace::getPtracer()
2847 {
2848    if (!linuxptrace) {
2849       linuxptrace = new LinuxPtrace();
2850       assert(linuxptrace);
2851       linuxptrace->start();
2852    }
2853    return linuxptrace;
2854 }
2855
2856
2857 LinuxPtrace::LinuxPtrace() :
2858    ptrace_request(unknown),
2859    request((pt_req) 0),
2860    pid(0),
2861    addr(NULL),
2862    data(NULL),
2863    proc(NULL),
2864    remote_addr(0),
2865    size(0),
2866    ret(0),
2867    bret(false),
2868    err(0)
2869 {
2870 }
2871
2872 LinuxPtrace::~LinuxPtrace()
2873 {
2874 }
2875
2876 static void start_ptrace(void *lp)
2877 {
2878    LinuxPtrace *linuxptrace = (LinuxPtrace *) (lp);
2879    linuxptrace->main();
2880 }
2881
2882 void LinuxPtrace::start()
2883 {
2884    init.lock();
2885    thrd.spawn(start_ptrace, this);
2886    init.wait();
2887    init.unlock();
2888 }
2889
2890 void LinuxPtrace::main()
2891 {
2892    init.lock();
2893    cond.lock();
2894    init.signal();
2895    init.unlock();
2896    for (;;) {
2897       cond.wait();
2898       ret_lock.lock();
2899       switch(ptrace_request) {
2900          case create_req:
2901             bret = proc->plat_create_int();
2902             break;
2903          case ptrace_req:
2904             ret = ptrace(request, pid, addr, data);
2905             break;
2906          case ptrace_bulkread:
2907             bret = PtraceBulkRead(remote_addr, size, data, pid);
2908             break;
2909          case ptrace_bulkwrite:
2910             bret = PtraceBulkWrite(remote_addr, size, data, pid);
2911             break;            
2912          case unknown:
2913             assert(0);
2914       }
2915       err = errno;
2916       ret_lock.signal();
2917       ret_lock.unlock();
2918    }
2919 }
2920
2921 void LinuxPtrace::start_request()
2922 {
2923    request_lock.lock();
2924    cond.lock();
2925    ret_lock.lock();
2926 }
2927
2928 void LinuxPtrace::waitfor_ret()
2929 {
2930    cond.signal();
2931    cond.unlock();
2932    ret_lock.wait();   
2933 }
2934
2935 void LinuxPtrace::end_request()
2936 {
2937    ret_lock.unlock();
2938    request_lock.unlock();
2939 }
2940
2941 long LinuxPtrace::ptrace_int(pt_req request_, pid_t pid_, void *addr_, void *data_)
2942 {
2943    start_request();
2944
2945    ptrace_request = ptrace_req;
2946    request = request_;
2947    pid = pid_;
2948    addr = addr_;
2949    data = data_;
2950
2951    waitfor_ret();
2952    
2953    long myret = ret;
2954    int my_errno = err;
2955
2956    end_request();
2957
2958    errno = my_errno;
2959    return myret;
2960 }
2961
2962 bool LinuxPtrace::plat_create(linux_process *p)
2963 {
2964    start_request();
2965    ptrace_request = create_req;
2966    proc = p;
2967    waitfor_ret();
2968    bool result = bret;
2969    end_request();
2970    return result;
2971 }
2972
2973 bool LinuxPtrace::ptrace_read(Dyninst::Address inTrace, unsigned size_, 
2974                               void *inSelf, int pid_)
2975 {
2976    start_request();
2977    ptrace_request = ptrace_bulkread;
2978    remote_addr = inTrace;
2979    data = inSelf;
2980    pid = pid_;
2981    size = size_;
2982    waitfor_ret();
2983    bool result = bret;
2984    end_request();
2985    return result;
2986 }
2987
2988 bool LinuxPtrace::ptrace_write(Dyninst::Address inTrace, unsigned size_, 
2989                                const void *inSelf, int pid_)
2990 {
2991    start_request();
2992    ptrace_request = ptrace_bulkwrite;
2993    remote_addr = inTrace;
2994    data = const_cast<void *>(inSelf);
2995    pid = pid_;
2996    size = size_;
2997    waitfor_ret();
2998    bool result = bret;
2999    end_request();
3000    return result;
3001 }
3002
3003
3004 void linux_process::plat_adjustSyncType(Event::ptr ev, bool gen)
3005 {
3006    if (gen) return;
3007
3008    if (ev->getEventType().code() != EventType::LWPDestroy ||
3009        ev->getEventType().time() != EventType::Pre) 
3010       return;
3011
3012    int_thread *thrd = ev->getThread()->llthrd();
3013    if (thrd->getGeneratorState().getState() != int_thread::running)
3014       return;
3015
3016    // So we have a pre-LWP destroy and a running generator; this means
3017    // that someone continued the thread during decode and it is now
3018    // gone. So set the event to async and set the generator state to
3019    // exited.
3020
3021    pthrd_printf("plat_adjustSyncType: thread %d raced with exit, setting event to async\n",
3022                 thrd->getLWP());
3023
3024    //thrd->getGeneratorState().setState(int_thread::exited);
3025    ev->setSyncType(Event::async);
3026    //thrd->getHandlerState().setState(int_thread::exited);
3027 }
3028
3029