124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- MachTask.h ----------------------------------------------*- C++ -*-===//
224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//                     The LLVM Compiler Infrastructure
424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// This file is distributed under the University of Illinois Open Source
624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// License. See LICENSE.TXT for details.
724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//----------------------------------------------------------------------
1024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  MachTask.h
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  debugserver
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//  Created by Greg Clayton on 12/5/08.
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __MachTask_h__
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __MachTask_h__
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C Includes
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <mach/mach.h>
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <sys/socket.h>
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// C++ Includes
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <map>
26fb9cee64303d36d6fe5d87e63dd8701d1ddb70a9Han Ming Ong#include <string>
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Other libraries and framework includes
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner// Project includes
29cec43ab7f30085ac7f65a26a58b956a69e363a3bHan Ming Ong#include "DNBDefs.h"
3024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "MachException.h"
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "MachVMMemory.h"
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "PThreadMutex.h"
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachProcess;
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
36520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granatatypedef uint64_t MachMallocEventId;
37520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
38520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granataenum MachMallocEventType
39520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata{
40520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    eMachMallocEventTypeAlloc = 2,
41520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    eMachMallocEventTypeDealloc = 4,
42520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    eMachMallocEventTypeOther = 1
43520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata};
44520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
45520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granatastruct MachMallocEvent
46520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata{
47520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    mach_vm_address_t m_base_address;
48520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    uint64_t m_size;
49520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    MachMallocEventType m_event_type;
50520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata    MachMallocEventId m_event_id;
51520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata};
52520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
5324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachTask
5424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    // Constructors and Destructors
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    //------------------------------------------------------------------
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            MachTask (MachProcess *process);
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    virtual                 ~MachTask ();
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            void            Clear ();
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            kern_return_t   Suspend ();
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            kern_return_t   Resume ();
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            nub_size_t      ReadMemory (nub_addr_t addr, nub_size_t size, void *buf);
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            nub_size_t      WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf);
69a9385537809ef342c843c5ab972e513742652047Greg Clayton            int             GetMemoryRegionInfo (nub_addr_t addr, DNBRegionInfo *region_info);
70cec43ab7f30085ac7f65a26a58b956a69e363a3bHan Ming Ong            std::string     GetProfileData (DNBProfileDataScanType scanType);
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            nub_addr_t      AllocateMemory (nub_size_t size, uint32_t permissions);
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            nub_bool_t      DeallocateMemory (nub_addr_t addr);
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            mach_port_t     ExceptionPort () const;
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool            ExceptionPortIsValid () const;
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            kern_return_t   SaveExceptionPortInfo ();
7824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            kern_return_t   RestoreExceptionPortInfo ();
7924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            kern_return_t   ShutDownExcecptionThread ();
8024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
8124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool            StartExceptionThread (DNBError &err);
8224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            nub_addr_t      GetDYLDAllImageInfosAddress (DNBError& err);
8324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            kern_return_t   BasicInfo (struct task_basic_info *info);
8424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static  kern_return_t   BasicInfo (task_t task, struct task_basic_info *info);
8524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            bool            IsValid () const;
8624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static  bool            IsValid (task_t task);
8724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    static  void *          ExceptionThread (void *arg);
8824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            task_t          TaskPort () const { return m_task; }
8924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            task_t          TaskPortForProcessID (DNBError &err);
908016967553a0e818d57ce5f86230c8cee7be7ecfGreg Clayton    static  task_t          TaskPortForProcessID (pid_t pid, DNBError &err, uint32_t num_retries = 10, uint32_t usec_interval = 10000);
9124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
9224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            MachProcess *   Process () { return m_process; }
9324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    const   MachProcess *   Process () const { return m_process; }
94520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
95fb190f3e1ddbaf9fb72e15a96e103de2b9c0dc44Jason Molenda            nub_size_t      PageSize ();
96520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
97520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            bool            HasMallocLoggingEnabled ();
98520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
99520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            // enumerate the malloc records for a given address (starting with Mac OS X 10.6 Snow Leopard it should include
100520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            // all allocations that *include* address, rather than just those *starting* at address)
101520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            bool            EnumerateMallocRecords (mach_vm_address_t address,
102520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                    MachMallocEvent *event_buffer,
103520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                    uint32_t buffer_size,
104520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                    uint32_t *count);
105520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
106520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            // enumerate every malloc record generated by this task, no matter what the address
107520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            bool            EnumerateMallocRecords (MachMallocEvent *event_buffer,
108520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                    uint32_t buffer_size,
109520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                    uint32_t *count);
110520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata
111520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            // given a malloc event, report every stack frame that led to this event
112520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata            bool            EnumerateMallocFrames (MachMallocEventId event_id,
113520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                   mach_vm_address_t *function_addresses_buffer,
114520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                   uint32_t buffer_size,
115520e7fe1c4d112d67d56fabf1dc2b1ad484e30efEnrico Granata                                                   uint32_t *count);
11624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
11724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
11824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            MachProcess *   m_process;                  // The mach process that owns this MachTask
11924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            task_t          m_task;
12024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            MachVMMemory    m_vm_memory;                // Special mach memory reading class that will take care of watching for page and region boundaries
12124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            MachException::PortInfo
12224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner                            m_exc_port_info;            // Saved settings for all exception ports
12324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            pthread_t       m_exception_thread;         // Thread ID for the exception thread in case we need it
12424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            mach_port_t     m_exception_port;           // Exception port on which we will receive child exceptions
12524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            typedef std::map <mach_vm_address_t, size_t> allocation_collection;
12724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            allocation_collection m_allocations;
12824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
12924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprivate:
13024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachTask(const MachTask&); // Outlaw
13124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachTask& operator=(const MachTask& rhs);// Outlaw
13224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
13324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
13424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif  // __MachTask_h__
135