summaryrefslogtreecommitdiffstats
path: root/lldb/tools/debugserver/source/MacOSX/MachTask.h
blob: 3bf40e1345713c9ce33892c6db6956c23a3873d7 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
//===-- MachTask.h ----------------------------------------------*- C++ -*-===//
//
//                     The LLVM Compiler Infrastructure
//
// This file is distributed under the University of Illinois Open Source
// License. See LICENSE.TXT for details.
//
//===----------------------------------------------------------------------===//
//----------------------------------------------------------------------
//
//  MachTask.h
//  debugserver
//
//  Created by Greg Clayton on 12/5/08.
//
//===----------------------------------------------------------------------===//

#ifndef __MachTask_h__
#define __MachTask_h__

// C Includes
#include <mach/mach.h>
#include <sys/socket.h>
// C++ Includes
#include <map>
// Other libraries and framework includes
// Project includes
#include "MachException.h"
#include "MachVMMemory.h"
#include "PThreadMutex.h"

class MachProcess;

class MachTask
{
public:
    //------------------------------------------------------------------
    // Constructors and Destructors
    //------------------------------------------------------------------
                            MachTask (MachProcess *process);
    virtual                 ~MachTask ();

            void            Clear ();

            kern_return_t   Suspend ();
            kern_return_t   Resume ();

            nub_size_t      ReadMemory (nub_addr_t addr, nub_size_t size, void *buf);
            nub_size_t      WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf);

            nub_addr_t      AllocateMemory (nub_size_t size, uint32_t permissions);
            nub_bool_t      DeallocateMemory (nub_addr_t addr);

            mach_port_t     ExceptionPort () const;
            bool            ExceptionPortIsValid () const;
            kern_return_t   SaveExceptionPortInfo ();
            kern_return_t   RestoreExceptionPortInfo ();
            kern_return_t   ShutDownExcecptionThread ();

            bool            StartExceptionThread (DNBError &err);
            nub_addr_t      GetDYLDAllImageInfosAddress (DNBError& err);
            kern_return_t   BasicInfo (struct task_basic_info *info);
    static  kern_return_t   BasicInfo (task_t task, struct task_basic_info *info);
            bool            IsValid () const;
    static  bool            IsValid (task_t task);
    static  void *          ExceptionThread (void *arg);
            task_t          TaskPort () const { return m_task; }
            task_t          TaskPortForProcessID (DNBError &err);
    static  task_t          TaskPortForProcessID (pid_t pid, DNBError &err);

            MachProcess *   Process () { return m_process; }
    const   MachProcess *   Process () const { return m_process; }

protected:
            MachProcess *   m_process;                  // The mach process that owns this MachTask
            task_t          m_task;
            MachVMMemory    m_vm_memory;                // Special mach memory reading class that will take care of watching for page and region boundaries
            MachException::PortInfo
                            m_exc_port_info;            // Saved settings for all exception ports
            pthread_t       m_exception_thread;         // Thread ID for the exception thread in case we need it
            mach_port_t     m_exception_port;           // Exception port on which we will receive child exceptions

            typedef std::map <mach_vm_address_t, size_t> allocation_collection;
            allocation_collection m_allocations;

private:
    MachTask(const MachTask&); // Outlaw
    MachTask& operator=(const MachTask& rhs);// Outlaw
};

#endif  // __MachTask_h__
OpenPOWER on IntegriCloud