From 728d947601ba8872dde6eafbf2a88520006b5001 Mon Sep 17 00:00:00 2001 From: Andreas Kling Date: Tue, 9 Mar 2021 11:23:08 +0100 Subject: [PATCH] UserspaceEmulator: Remember VM region names for MAP_ANONYMOUS For some reason we only remembered the names of MAP_FILE mmap regions. --- .../DevTools/UserspaceEmulator/Emulator.cpp | 23 ++++++++++--------- .../DevTools/UserspaceEmulator/MmapRegion.cpp | 8 +++---- .../DevTools/UserspaceEmulator/MmapRegion.h | 4 ++-- 3 files changed, 17 insertions(+), 18 deletions(-) diff --git a/Userland/DevTools/UserspaceEmulator/Emulator.cpp b/Userland/DevTools/UserspaceEmulator/Emulator.cpp index c6ff950d4c..3d4ab7e49a 100644 --- a/Userland/DevTools/UserspaceEmulator/Emulator.cpp +++ b/Userland/DevTools/UserspaceEmulator/Emulator.cpp @@ -1042,17 +1042,18 @@ u32 Emulator::virt$mmap(u32 params_addr) final_address = result.value().base().get(); auto final_size = result.value().size(); - if (params.flags & MAP_ANONYMOUS) - mmu().add_region(MmapRegion::create_anonymous(final_address, final_size, params.prot)); - else { - String name_str; - if (params.name.characters) { - auto name = ByteBuffer::create_uninitialized(params.name.length); - mmu().copy_from_vm(name.data(), (FlatPtr)params.name.characters, params.name.length); - name_str = { name.data(), name.size() }; - } - auto region = MmapRegion::create_file_backed(final_address, final_size, params.prot, params.flags, params.fd, params.offset, name_str); - if (region->name() == "libc.so: .text (Emulated)") { + String name_str; + if (params.name.characters) { + auto name = ByteBuffer::create_uninitialized(params.name.length); + mmu().copy_from_vm(name.data(), (FlatPtr)params.name.characters, params.name.length); + name_str = { name.data(), name.size() }; + } + + if (params.flags & MAP_ANONYMOUS) { + mmu().add_region(MmapRegion::create_anonymous(final_address, final_size, params.prot, move(name_str))); + } else { + auto region = MmapRegion::create_file_backed(final_address, final_size, params.prot, params.flags, params.fd, params.offset, move(name_str)); + if (region->name() == "libc.so: .text") { bool rc = find_malloc_symbols(*region); VERIFY(rc); } diff --git a/Userland/DevTools/UserspaceEmulator/MmapRegion.cpp b/Userland/DevTools/UserspaceEmulator/MmapRegion.cpp index 43655962e0..62502d8c66 100644 --- a/Userland/DevTools/UserspaceEmulator/MmapRegion.cpp +++ b/Userland/DevTools/UserspaceEmulator/MmapRegion.cpp @@ -45,11 +45,12 @@ static void free_pages(void* ptr, size_t bytes) VERIFY(rc == 0); } -NonnullOwnPtr MmapRegion::create_anonymous(u32 base, u32 size, u32 prot) +NonnullOwnPtr MmapRegion::create_anonymous(u32 base, u32 size, u32 prot, String name) { auto data = (u8*)mmap_initialized(size, 0, nullptr); auto shadow_data = (u8*)mmap_initialized(size, 1, "MmapRegion ShadowData"); auto region = adopt_own(*new MmapRegion(base, size, prot, data, shadow_data)); + region->m_name = move(name); return region; } @@ -60,10 +61,7 @@ NonnullOwnPtr MmapRegion::create_file_backed(u32 base, u32 size, u32 auto shadow_data = (u8*)mmap_initialized(size, 1, "MmapRegion ShadowData"); auto region = adopt_own(*new MmapRegion(base, size, prot, data, shadow_data)); region->m_file_backed = true; - if (!name.is_empty()) { - name = String::formatted("{} (Emulated)", name); - region->m_name = name; - } + region->m_name = move(name); return region; } diff --git a/Userland/DevTools/UserspaceEmulator/MmapRegion.h b/Userland/DevTools/UserspaceEmulator/MmapRegion.h index c61069eaec..d11e3914f9 100644 --- a/Userland/DevTools/UserspaceEmulator/MmapRegion.h +++ b/Userland/DevTools/UserspaceEmulator/MmapRegion.h @@ -36,8 +36,8 @@ class MallocTracer; class MmapRegion final : public Region { public: - static NonnullOwnPtr create_anonymous(u32 base, u32 size, u32 prot); - static NonnullOwnPtr create_file_backed(u32 base, u32 size, u32 prot, int flags, int fd, off_t offset, String name = {}); + static NonnullOwnPtr create_anonymous(u32 base, u32 size, u32 prot, String name); + static NonnullOwnPtr create_file_backed(u32 base, u32 size, u32 prot, int flags, int fd, off_t offset, String name); virtual ~MmapRegion() override; virtual ValueWithShadow read8(u32 offset) override;