Reland "[lldb] Remove non address bits when looking up memory regions"

This reverts commit 5fbcf67734.

ProcessDebugger is used in ProcessWindows and NativeProcessWindows.
I thought I was simplifying things by renaming to DoGetMemoryRegionInfo
in ProcessDebugger but the Native process side expects "GetMemoryRegionInfo".

Follow the pattern that WriteMemory uses. So:
* ProcessWindows::DoGetMemoryRegioninfo calls ProcessDebugger::GetMemoryRegionInfo
* NativeProcessWindows::GetMemoryRegionInfo does the same
This commit is contained in:
David Spickett 2021-11-03 13:32:34 +00:00
parent 7a34145f40
commit fac3f20de5
17 changed files with 130 additions and 41 deletions

View File

@ -1792,7 +1792,7 @@ public:
///
/// If load_addr is within the address space the process has mapped
/// range_info will be filled in with the start and end of that range as
/// well as the permissions for that range and range_info.GetMapped will
/// well as the permissions for that range and range_info. GetMapped will
/// return true.
///
/// If load_addr is outside any mapped region then range_info will have its
@ -1801,23 +1801,21 @@ public:
/// there are no valid mapped ranges between load_addr and the end of the
/// process address space.
///
/// GetMemoryRegionInfo will only return an error if it is unimplemented for
/// the current process.
/// GetMemoryRegionInfo calls DoGetMemoryRegionInfo. Override that function in
/// process subclasses.
///
/// \param[in] load_addr
/// The load address to query the range_info for.
/// The load address to query the range_info for. May include non
/// address bits, these will be removed by the the ABI plugin if there is
/// one.
///
/// \param[out] range_info
/// An range_info value containing the details of the range.
///
/// \return
/// An error value.
virtual Status GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) {
Status error;
error.SetErrorString("Process::GetMemoryRegionInfo() not supported");
return error;
}
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info);
/// Obtain all the mapped memory regions within this process.
///
@ -2637,6 +2635,26 @@ protected:
virtual size_t DoReadMemory(lldb::addr_t vm_addr, void *buf, size_t size,
Status &error) = 0;
/// DoGetMemoryRegionInfo is called by GetMemoryRegionInfo after it has
/// removed non address bits from load_addr. Override this method in
/// subclasses of Process.
///
/// See GetMemoryRegionInfo for details of the logic.
///
/// \param[in] load_addr
/// The load address to query the range_info for. (non address bits
/// removed)
///
/// \param[out] range_info
/// An range_info value containing the details of the range.
///
/// \return
/// An error value.
virtual Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) {
return Status("Process::DoGetMemoryRegionInfo() not supported");
}
lldb::StateType GetPrivateState();
/// The "private" side of resuming a process. This doesn't alter the state

View File

@ -601,8 +601,8 @@ Status ProcessWindows::DoDeallocateMemory(lldb::addr_t ptr) {
return ProcessDebugger::DeallocateMemory(ptr);
}
Status ProcessWindows::GetMemoryRegionInfo(lldb::addr_t vm_addr,
MemoryRegionInfo &info) {
Status ProcessWindows::DoGetMemoryRegionInfo(lldb::addr_t vm_addr,
MemoryRegionInfo &info) {
return ProcessDebugger::GetMemoryRegionInfo(vm_addr, info);
}

View File

@ -78,8 +78,6 @@ public:
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
Status &error) override;
Status DoDeallocateMemory(lldb::addr_t ptr) override;
Status GetMemoryRegionInfo(lldb::addr_t vm_addr,
MemoryRegionInfo &info) override;
lldb::addr_t GetImageInfoAddress() override;
@ -103,6 +101,10 @@ public:
Status EnableWatchpoint(Watchpoint *wp, bool notify = true) override;
Status DisableWatchpoint(Watchpoint *wp, bool notify = true) override;
protected:
Status DoGetMemoryRegionInfo(lldb::addr_t vm_addr,
MemoryRegionInfo &info) override;
private:
struct WatchpointInfo {
uint32_t slot_id;

View File

@ -281,8 +281,8 @@ size_t ProcessElfCore::ReadMemory(lldb::addr_t addr, void *buf, size_t size,
return DoReadMemory(addr, buf, size, error);
}
Status ProcessElfCore::GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region_info) {
Status ProcessElfCore::DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region_info) {
region_info.Clear();
const VMRangeToPermissions::Entry *permission_entry =
m_core_range_infos.FindEntryThatContainsOrFollows(load_addr);

View File

@ -86,10 +86,6 @@ public:
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
lldb_private::Status &error) override;
lldb_private::Status
GetMemoryRegionInfo(lldb::addr_t load_addr,
lldb_private::MemoryRegionInfo &region_info) override;
lldb::addr_t GetImageInfoAddress() override;
lldb_private::ArchSpec GetArchitecture();
@ -105,6 +101,10 @@ protected:
bool DoUpdateThreadList(lldb_private::ThreadList &old_thread_list,
lldb_private::ThreadList &new_thread_list) override;
lldb_private::Status
DoGetMemoryRegionInfo(lldb::addr_t load_addr,
lldb_private::MemoryRegionInfo &region_info) override;
private:
struct NT_FILE_Entry {
lldb::addr_t start;

View File

@ -2903,8 +2903,8 @@ lldb::addr_t ProcessGDBRemote::DoAllocateMemory(size_t size,
return allocated_addr;
}
Status ProcessGDBRemote::GetMemoryRegionInfo(addr_t load_addr,
MemoryRegionInfo &region_info) {
Status ProcessGDBRemote::DoGetMemoryRegionInfo(addr_t load_addr,
MemoryRegionInfo &region_info) {
Status error(m_gdb_comm.GetMemoryRegionInfo(load_addr, region_info));
return error;

View File

@ -144,9 +144,6 @@ public:
lldb::addr_t DoAllocateMemory(size_t size, uint32_t permissions,
Status &error) override;
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region_info) override;
Status DoDeallocateMemory(lldb::addr_t ptr) override;
// Process STDIO
@ -424,6 +421,9 @@ protected:
Status DoWriteMemoryTags(lldb::addr_t addr, size_t len, int32_t type,
const std::vector<uint8_t> &tags) override;
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region_info) override;
private:
// For ProcessGDBRemote only
std::string m_partial_profile_data;

View File

@ -633,8 +633,8 @@ size_t ProcessMachCore::DoReadMemory(addr_t addr, void *buf, size_t size,
return bytes_read;
}
Status ProcessMachCore::GetMemoryRegionInfo(addr_t load_addr,
MemoryRegionInfo &region_info) {
Status ProcessMachCore::DoGetMemoryRegionInfo(addr_t load_addr,
MemoryRegionInfo &region_info) {
region_info.Clear();
const VMRangeToPermissions::Entry *permission_entry =
m_core_range_infos.FindEntryThatContainsOrFollows(load_addr);

View File

@ -68,10 +68,6 @@ public:
size_t DoReadMemory(lldb::addr_t addr, void *buf, size_t size,
lldb_private::Status &error) override;
lldb_private::Status
GetMemoryRegionInfo(lldb::addr_t load_addr,
lldb_private::MemoryRegionInfo &region_info) override;
lldb::addr_t GetImageInfoAddress() override;
protected:
@ -84,6 +80,10 @@ protected:
lldb_private::ObjectFile *GetCoreObjectFile();
lldb_private::Status
DoGetMemoryRegionInfo(lldb::addr_t load_addr,
lldb_private::MemoryRegionInfo &region_info) override;
private:
bool GetDynamicLoaderAddress(lldb::addr_t addr);

View File

@ -439,8 +439,8 @@ void ProcessMinidump::BuildMemoryRegions() {
llvm::sort(*m_memory_regions);
}
Status ProcessMinidump::GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region) {
Status ProcessMinidump::DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region) {
BuildMemoryRegions();
region = MinidumpParser::GetMemoryRegionInfo(*m_memory_regions, load_addr);
return Status();

View File

@ -75,9 +75,6 @@ public:
ArchSpec GetArchitecture();
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) override;
Status GetMemoryRegions(
lldb_private::MemoryRegionInfos &region_list) override;
@ -98,6 +95,9 @@ protected:
bool DoUpdateThreadList(ThreadList &old_thread_list,
ThreadList &new_thread_list) override;
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) override;
void ReadModuleList();
lldb::ModuleSP GetOrCreateModule(lldb_private::UUID minidump_uuid,

View File

@ -249,8 +249,8 @@ ArchSpec ScriptedProcess::GetArchitecture() {
return GetTarget().GetArchitecture();
}
Status ScriptedProcess::GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region) {
Status ScriptedProcess::DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &region) {
CheckInterpreterAndScriptObject();
Status error;

View File

@ -86,9 +86,6 @@ public:
ArchSpec GetArchitecture();
Status GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) override;
Status
GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list) override;
@ -102,6 +99,9 @@ protected:
bool DoUpdateThreadList(ThreadList &old_thread_list,
ThreadList &new_thread_list) override;
Status DoGetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) override;
private:
friend class ScriptedThread;

View File

@ -5896,6 +5896,13 @@ Process::AdvanceAddressToNextBranchInstruction(Address default_stop_addr,
return retval;
}
Status Process::GetMemoryRegionInfo(lldb::addr_t load_addr,
MemoryRegionInfo &range_info) {
if (auto abi = GetABI())
load_addr = abi->FixDataAddress(load_addr);
return DoGetMemoryRegionInfo(load_addr, range_info);
}
Status
Process::GetMemoryRegions(lldb_private::MemoryRegionInfos &region_list) {

View File

@ -0,0 +1,3 @@
C_SOURCES := main.c
include Makefile.rules

View File

@ -0,0 +1,42 @@
"""
Test that "memory region" lookup uses the ABI plugin to remove
non address bits from addresses before lookup.
"""
import lldb
from lldbsuite.test.decorators import *
from lldbsuite.test.lldbtest import *
from lldbsuite.test import lldbutil
class AArch64LinuxTaggedMemoryRegionTestCase(TestBase):
mydir = TestBase.compute_mydir(__file__)
NO_DEBUG_INFO_TESTCASE = True
# AArch64 Linux always enables the top byte ignore feature
@skipUnlessArch("aarch64")
@skipUnlessPlatform(["linux"])
def test_mte_regions(self):
self.build()
self.runCmd("file " + self.getBuildArtifact("a.out"), CURRENT_EXECUTABLE_SET)
lldbutil.run_break_set_by_file_and_line(self, "main.c",
line_number('main.c', '// Set break point at this line.'),
num_expected_locations=1)
self.runCmd("run", RUN_SUCCEEDED)
if self.process().GetState() == lldb.eStateExited:
self.fail("Test program failed to run.")
self.expect("thread list", STOPPED_DUE_TO_BREAKPOINT,
substrs=['stopped',
'stop reason = breakpoint'])
# Despite the non address bits we should find a region
self.expect("memory region the_page", patterns=[
"\[0x[0-9A-Fa-f]+-0x[0-9A-Fa-f]+\) r-x"])

View File

@ -0,0 +1,17 @@
#include <asm/hwcap.h>
#include <sys/auxv.h>
#include <sys/mman.h>
#include <unistd.h>
int main(int argc, char const *argv[]) {
void *the_page = mmap(0, sysconf(_SC_PAGESIZE), PROT_READ | PROT_EXEC,
MAP_PRIVATE | MAP_ANONYMOUS, -1, 0);
if (the_page == MAP_FAILED)
return 1;
// Put something in the top byte (AArch64 Linux always enables top byte
// ignore)
the_page = (void *)((size_t)the_page | ((size_t)0x34 << 56));
return 0; // Set break point at this line.
}