diff options
Diffstat (limited to 'lldb/tools/debugserver/source/MacOSX')
7 files changed, 39 insertions, 1 deletions
diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp index a256acec8d3..133f41e2df1 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.cpp @@ -478,7 +478,6 @@ MachProcess::Detach() return true; } - nub_size_t MachProcess::RemoveTrapsFromBuffer (nub_addr_t addr, nub_size_t size, uint8_t *buf) const { @@ -604,6 +603,11 @@ MachProcess::WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf) return bytes_written; } +bool +MachProcess::IsAddressExecutable(nub_addr_t address) +{ + return m_task.IsAddressExecutable (address); +} void MachProcess::ReplyToAllExceptions () diff --git a/lldb/tools/debugserver/source/MacOSX/MachProcess.h b/lldb/tools/debugserver/source/MacOSX/MachProcess.h index d52735adba7..b68fa7f49e2 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachProcess.h +++ b/lldb/tools/debugserver/source/MacOSX/MachProcess.h @@ -99,6 +99,7 @@ public: bool Detach (); 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); + bool IsAddressExecutable(nub_addr_t address); //---------------------------------------------------------------------- // Path and arg accessors diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp index 862a96b9367..035198e4864 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachTask.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachTask.cpp @@ -205,6 +205,23 @@ MachTask::WriteMemory (nub_addr_t addr, nub_size_t size, const void *buf) } //---------------------------------------------------------------------- +// MachTask::IsAddressExecutable +//---------------------------------------------------------------------- +bool +MachTask::IsAddressExecutable (nub_addr_t addr) +{ + task_t task = TaskPort(); + bool ret = false; + if (task != TASK_NULL) + { + ret = m_vm_memory.IsExecutable(task, addr); + DNBLogThreadedIf(LOG_MEMORY, "MachTask::IsAddressExecutable ( addr = 0x%8.8llx ) => %s", (uint64_t)addr, (ret ? "true" : "false")); + } + return ret; +} + + +//---------------------------------------------------------------------- // MachTask::TaskPortForProcessID //---------------------------------------------------------------------- task_t diff --git a/lldb/tools/debugserver/source/MacOSX/MachTask.h b/lldb/tools/debugserver/source/MacOSX/MachTask.h index 0e74086a727..da64ba6c997 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachTask.h +++ b/lldb/tools/debugserver/source/MacOSX/MachTask.h @@ -64,6 +64,7 @@ public: 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); + bool IsAddressExecutable (nub_addr_t addr) ; nub_addr_t AllocateMemory (nub_size_t size, uint32_t permissions); nub_bool_t DeallocateMemory (nub_addr_t addr); diff --git a/lldb/tools/debugserver/source/MacOSX/MachVMMemory.cpp b/lldb/tools/debugserver/source/MacOSX/MachVMMemory.cpp index eb7e10746e2..58789ed191a 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachVMMemory.cpp +++ b/lldb/tools/debugserver/source/MacOSX/MachVMMemory.cpp @@ -52,6 +52,17 @@ MachVMMemory::MaxBytesLeftInPage(nub_addr_t addr, nub_size_t count) return count; } +bool +MachVMMemory::IsExecutable(task_t task, nub_addr_t address) +{ + MachVMRegion vmRegion(task); + + if (vmRegion.GetRegionForAddress(address) && vmRegion.IsExecutable()) + return true; + else + return false; +} + nub_size_t MachVMMemory::Read(task_t task, nub_addr_t address, void *data, nub_size_t data_count) { diff --git a/lldb/tools/debugserver/source/MacOSX/MachVMMemory.h b/lldb/tools/debugserver/source/MacOSX/MachVMMemory.h index 5635186854a..421e4b4999c 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachVMMemory.h +++ b/lldb/tools/debugserver/source/MacOSX/MachVMMemory.h @@ -27,6 +27,7 @@ public: nub_size_t Read(task_t task, nub_addr_t address, void *data, nub_size_t data_count); nub_size_t Write(task_t task, nub_addr_t address, const void *data, nub_size_t data_count); nub_size_t PageSize(); + bool IsExecutable(task_t task, nub_addr_t address); protected: nub_size_t MaxBytesLeftInPage(nub_addr_t addr, nub_size_t count); diff --git a/lldb/tools/debugserver/source/MacOSX/MachVMRegion.h b/lldb/tools/debugserver/source/MacOSX/MachVMRegion.h index 617e221a57e..bd1aaa0e2a2 100644 --- a/lldb/tools/debugserver/source/MacOSX/MachVMRegion.h +++ b/lldb/tools/debugserver/source/MacOSX/MachVMRegion.h @@ -42,6 +42,9 @@ public: bool SetProtections(mach_vm_address_t addr, mach_vm_size_t size, vm_prot_t prot); bool RestoreProtections(); bool GetRegionForAddress(nub_addr_t addr); + + bool IsExecutable() const { return (m_data.protection & VM_PROT_EXECUTE) == VM_PROT_EXECUTE; } + protected: #if defined (VM_REGION_SUBMAP_SHORT_INFO_COUNT_64) typedef vm_region_submap_short_info_data_64_t RegionInfo; |