124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===-- MachVMRegion.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//  Created by Greg Clayton on 6/26/07.
1124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//
1224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner//===----------------------------------------------------------------------===//
1324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#ifndef __MachVMRegion_h__
1524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#define __MachVMRegion_h__
1624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
1724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBDefs.h"
1824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include "DNBError.h"
1924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#include <mach/mach.h>
2024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerclass MachVMRegion
2224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner{
2324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerpublic:
2424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    MachVMRegion(task_t task);
2524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    ~MachVMRegion();
2624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
2724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    void Clear();
2824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_address_t StartAddress() const { return m_start; }
2924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_address_t EndAddress() const { return m_start + m_size; }
30a9385537809ef342c843c5ab972e513742652047Greg Clayton    mach_vm_size_t GetByteSize () const { return m_size; }
3124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_address_t BytesRemaining(mach_vm_address_t addr) const
3224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
3324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        if (ContainsAddress(addr))
3424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return m_size - (addr - m_start);
3524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        else
3624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner            return 0;
3724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
3824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool ContainsAddress(mach_vm_address_t addr) const
3924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    {
4024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner        return addr >= StartAddress() && addr < EndAddress();
4124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    }
4224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
4324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool SetProtections(mach_vm_address_t addr, mach_vm_size_t size, vm_prot_t prot);
4424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool RestoreProtections();
4524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    bool GetRegionForAddress(nub_addr_t addr);
46dc8ff30b6dbe28c851e99712e20c1358eca4709dJason Molenda
47a9385537809ef342c843c5ab972e513742652047Greg Clayton    uint32_t
48a9385537809ef342c843c5ab972e513742652047Greg Clayton    GetDNBPermissions () const;
49dc8ff30b6dbe28c851e99712e20c1358eca4709dJason Molenda
501308a9555ad586ff03c8f97bcfe7f3212d06bc86Greg Clayton    const DNBError &
511308a9555ad586ff03c8f97bcfe7f3212d06bc86Greg Clayton    GetError ()
521308a9555ad586ff03c8f97bcfe7f3212d06bc86Greg Clayton    {
531308a9555ad586ff03c8f97bcfe7f3212d06bc86Greg Clayton        return m_err;
541308a9555ad586ff03c8f97bcfe7f3212d06bc86Greg Clayton    }
5524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattnerprotected:
5624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#if defined (VM_REGION_SUBMAP_SHORT_INFO_COUNT_64)
5724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef vm_region_submap_short_info_data_64_t RegionInfo;
5824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum { kRegionInfoSize = VM_REGION_SUBMAP_SHORT_INFO_COUNT_64 };
5924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#else
6024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    typedef vm_region_submap_info_data_64_t RegionInfo;
6124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    enum { kRegionInfoSize = VM_REGION_SUBMAP_INFO_COUNT_64 };
6224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif
6324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
6424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    task_t              m_task;
6524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_address_t   m_addr;
6624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    DNBError            m_err;
6724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_address_t   m_start;
6824943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_size_t      m_size;
6924943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    natural_t           m_depth;
7024943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    RegionInfo          m_data;
7124943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    vm_prot_t           m_curr_protection;    // The current, possibly modified protections. Original value is saved in m_data.protections.
7224943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_address_t   m_protection_addr;    // The start address at which protections were changed
7324943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner    mach_vm_size_t      m_protection_size;    // The size of memory that had its protections changed
7424943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7524943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner};
7624943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner
7724943d2ee8bfaa7cf5893e4709143924157a5c1eChris Lattner#endif    // #ifndef __MachVMRegion_h__
78