Bläddra i källkod

UserspaceEmulator: Mark mmap regions as malloc blocks when mallocing

We don't have to be clever at all to figure out which MmapRegions are
malloc blocks, we can just mark the containing region as such when
the emulated process performs a malloc! :^)
Andreas Kling 5 år sedan
förälder
incheckning
030edbd513

+ 4 - 0
DevTools/UserspaceEmulator/MallocTracer.cpp

@@ -44,6 +44,10 @@ void MallocTracer::target_did_malloc(Badge<SoftCPU>, FlatPtr address, size_t siz
     ASSERT(region);
     ASSERT(region->is_mmap());
     auto& mmap_region = static_cast<MmapRegion&>(*region);
+
+    // Mark the containing mmap region as a malloc block!
+    mmap_region.set_malloc(true);
+
     auto* shadow_bits = mmap_region.shadow_data() + address - mmap_region.base();
     memset(shadow_bits, 0, size);
 

+ 0 - 7
DevTools/UserspaceEmulator/MmapRegion.cpp

@@ -65,13 +65,6 @@ MmapRegion::~MmapRegion()
         free(m_data);
 }
 
-bool MmapRegion::is_malloc_block() const
-{
-    // FIXME: This is obviously incomplete!
-    //        We should somehow know which mmap regions are malloc blocks.
-    return !m_file_backed;
-}
-
 ValueWithShadow<u8> MmapRegion::read8(FlatPtr offset)
 {
     if (!is_readable()) {

+ 3 - 1
DevTools/UserspaceEmulator/MmapRegion.h

@@ -52,7 +52,8 @@ public:
     bool is_writable() const { return m_prot & PROT_WRITE; }
     bool is_executable() const { return m_prot & PROT_EXEC; }
 
-    bool is_malloc_block() const;
+    bool is_malloc_block() const { return m_malloc; }
+    void set_malloc(bool b) { m_malloc = b; }
 
 private:
     MmapRegion(u32 base, u32 size, int prot);
@@ -62,6 +63,7 @@ private:
     u8* m_shadow_data { nullptr };
     int m_prot { 0 };
     bool m_file_backed { false };
+    bool m_malloc { false };
 };
 
 }