Home | History | Annotate | Download | only in elf-core
      1 //===-- ThreadElfCore.h ----------------------------------------*- C++ -*-===//
      2 //
      3 //                     The LLVM Compiler Infrastructure
      4 //
      5 // This file is distributed under the University of Illinois Open Source
      6 // License. See LICENSE.TXT for details.
      7 //
      8 //===----------------------------------------------------------------------===//
      9 
     10 #ifndef liblldb_ThreadElfCore_h_
     11 #define liblldb_ThreadElfCore_h_
     12 
     13 #include <string>
     14 
     15 #include "lldb/Target/Thread.h"
     16 #include "lldb/Core/DataExtractor.h"
     17 
     18 struct compat_timeval
     19 {
     20     int64_t tv_sec;
     21     int32_t tv_usec;
     22 };
     23 
     24 // PRSTATUS structure's size differs based on architecture.
     25 // Currently parsing done only for x86-64 architecture by
     26 // simply reading data from the buffer.
     27 // The following macros are used to specify the size.
     28 // Calculating size using sizeof() wont work because of padding.
     29 #define ELFLINUXPRSTATUS64_SIZE (112)
     30 #define ELFLINUXPRPSINFO64_SIZE (132)
     31 
     32 struct ELFLinuxPrStatus
     33 {
     34     int32_t         si_signo;
     35     int32_t         si_code;
     36     int32_t         si_errno;
     37 
     38     int16_t         pr_cursig;
     39 
     40     uint64_t        pr_sigpend;
     41     uint64_t        pr_sighold;
     42 
     43     uint32_t        pr_pid;
     44     uint32_t        pr_ppid;
     45     uint32_t        pr_pgrp;
     46     uint32_t        pr_sid;
     47 
     48     compat_timeval  pr_utime;
     49     compat_timeval  pr_stime;
     50     compat_timeval  pr_cutime;
     51     compat_timeval  pr_cstime;
     52 
     53     ELFLinuxPrStatus();
     54 
     55     bool
     56     Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch);
     57 
     58     static size_t
     59     GetSize(lldb_private::ArchSpec &arch)
     60     {
     61         switch(arch.GetCore())
     62         {
     63             case lldb_private::ArchSpec::eCore_x86_64_x86_64:
     64                 return ELFLINUXPRSTATUS64_SIZE;
     65             default:
     66                 return 0;
     67         }
     68     }
     69 };
     70 
     71 struct ELFLinuxPrPsInfo
     72 {
     73     char        pr_state;
     74     char        pr_sname;
     75     char        pr_zomb;
     76     char        pr_nice;
     77     uint64_t    pr_flag;
     78     uint32_t    pr_uid;
     79     uint32_t    pr_gid;
     80     int32_t     pr_pid;
     81     int32_t     pr_ppid;
     82     int32_t     pr_pgrp;
     83     int32_t     pr_sid;
     84     char        pr_fname[16];
     85     char        pr_psargs[80];
     86 
     87     ELFLinuxPrPsInfo();
     88 
     89     bool
     90     Parse(lldb_private::DataExtractor &data, lldb_private::ArchSpec &arch);
     91 
     92     static size_t
     93     GetSize(lldb_private::ArchSpec &arch)
     94     {
     95         switch(arch.GetCore())
     96         {
     97             case lldb_private::ArchSpec::eCore_x86_64_x86_64:
     98                 return ELFLINUXPRPSINFO64_SIZE;
     99             default:
    100                 return 0;
    101         }
    102     }
    103 
    104 };
    105 
    106 struct ThreadData
    107 {
    108     lldb_private::DataExtractor gpregset;
    109     lldb_private::DataExtractor fpregset;
    110     int signo;
    111     std::string name;
    112 };
    113 
    114 class ThreadElfCore : public lldb_private::Thread
    115 {
    116 public:
    117     ThreadElfCore (lldb_private::Process &process, lldb::tid_t tid,
    118                    const ThreadData &td);
    119 
    120     virtual
    121     ~ThreadElfCore ();
    122 
    123     virtual void
    124     RefreshStateAfterStop();
    125 
    126     virtual lldb::RegisterContextSP
    127     GetRegisterContext ();
    128 
    129     virtual lldb::RegisterContextSP
    130     CreateRegisterContextForFrame (lldb_private::StackFrame *frame);
    131 
    132     virtual void
    133     ClearStackFrames ();
    134 
    135     static bool
    136     ThreadIDIsValid (lldb::tid_t thread)
    137     {
    138         return thread != 0;
    139     }
    140 
    141     virtual const char *
    142     GetName ()
    143     {
    144         if (m_thread_name.empty())
    145             return NULL;
    146         return m_thread_name.c_str();
    147     }
    148 
    149     void
    150     SetName (const char *name)
    151     {
    152         if (name && name[0])
    153             m_thread_name.assign (name);
    154         else
    155             m_thread_name.clear();
    156     }
    157 
    158 protected:
    159     //------------------------------------------------------------------
    160     // Member variables.
    161     //------------------------------------------------------------------
    162     std::string m_thread_name;
    163     lldb::RegisterContextSP m_thread_reg_ctx_sp;
    164 
    165     int m_signo;
    166 
    167     lldb_private::DataExtractor m_gpregset_data;
    168     lldb_private::DataExtractor m_fpregset_data;
    169 
    170     virtual bool CalculateStopInfo();
    171 
    172 };
    173 
    174 #endif  // liblldb_ThreadElfCore_h_
    175