MachVMRegion.h revision dc8ff30b6dbe28c851e99712e20c1358eca4709d
1//===-- MachVMRegion.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//  Created by Greg Clayton on 6/26/07.
11//
12//===----------------------------------------------------------------------===//
13
14#ifndef __MachVMRegion_h__
15#define __MachVMRegion_h__
16
17#include "DNBDefs.h"
18#include "DNBError.h"
19#include <mach/mach.h>
20
21class MachVMRegion
22{
23public:
24    MachVMRegion(task_t task);
25    ~MachVMRegion();
26
27    void Clear();
28    mach_vm_address_t StartAddress() const { return m_start; }
29    mach_vm_address_t EndAddress() const { return m_start + m_size; }
30    mach_vm_address_t BytesRemaining(mach_vm_address_t addr) const
31    {
32        if (ContainsAddress(addr))
33            return m_size - (addr - m_start);
34        else
35            return 0;
36    }
37    bool ContainsAddress(mach_vm_address_t addr) const
38    {
39        return addr >= StartAddress() && addr < EndAddress();
40    }
41
42    bool SetProtections(mach_vm_address_t addr, mach_vm_size_t size, vm_prot_t prot);
43    bool RestoreProtections();
44    bool GetRegionForAddress(nub_addr_t addr);
45
46    bool IsExecutable() const { return (m_data.protection & VM_PROT_EXECUTE) == VM_PROT_EXECUTE; }
47
48protected:
49#if defined (VM_REGION_SUBMAP_SHORT_INFO_COUNT_64)
50    typedef vm_region_submap_short_info_data_64_t RegionInfo;
51    enum { kRegionInfoSize = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64 };
52#else
53    typedef vm_region_submap_info_data_64_t RegionInfo;
54    enum { kRegionInfoSize = VM_REGION_SUBMAP_INFO_COUNT_64 };
55#endif
56
57    task_t              m_task;
58    mach_vm_address_t   m_addr;
59    DNBError            m_err;
60    mach_vm_address_t   m_start;
61    mach_vm_size_t      m_size;
62    natural_t           m_depth;
63    RegionInfo          m_data;
64    vm_prot_t           m_curr_protection;    // The current, possibly modified protections. Original value is saved in m_data.protections.
65    mach_vm_address_t   m_protection_addr;    // The start address at which protections were changed
66    mach_vm_size_t      m_protection_size;    // The size of memory that had its protections changed
67
68};
69
70#endif    // #ifndef __MachVMRegion_h__
71