diff --git a/DevTools/UserspaceEmulator/MmapRegion.h b/DevTools/UserspaceEmulator/MmapRegion.h index 9240fe3d65..1e91fcbaac 100644 --- a/DevTools/UserspaceEmulator/MmapRegion.h +++ b/DevTools/UserspaceEmulator/MmapRegion.h @@ -34,7 +34,7 @@ namespace UserspaceEmulator { class MallocRegionMetadata; class MallocTracer; -class MmapRegion final : public SoftMMU::Region { +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); diff --git a/DevTools/UserspaceEmulator/Region.h b/DevTools/UserspaceEmulator/Region.h new file mode 100644 index 0000000000..0c37c5235c --- /dev/null +++ b/DevTools/UserspaceEmulator/Region.h @@ -0,0 +1,93 @@ +/* + * Copyright (c) 2020, Andreas Kling + * All rights reserved. + * + * Redistribution and use in source and binary forms, with or without + * modification, are permitted provided that the following conditions are met: + * + * 1. Redistributions of source code must retain the above copyright notice, this + * list of conditions and the following disclaimer. + * + * 2. Redistributions in binary form must reproduce the above copyright notice, + * this list of conditions and the following disclaimer in the documentation + * and/or other materials provided with the distribution. + * + * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" + * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE + * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE + * DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE + * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL + * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR + * SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER + * CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, + * OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE + * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. + */ + +#pragma once + +#include "ValueWithShadow.h" +#include + +namespace UserspaceEmulator { + +class Region { +public: + virtual ~Region() { } + + u32 base() const { return m_base; } + u32 size() const { return m_size; } + u32 end() const { return m_base + m_size; } + + bool contains(u32 address) const { return address >= base() && address < end(); } + + virtual void write8(u32 offset, ValueWithShadow) = 0; + virtual void write16(u32 offset, ValueWithShadow) = 0; + virtual void write32(u32 offset, ValueWithShadow) = 0; + virtual void write64(u32 offset, ValueWithShadow) = 0; + + virtual ValueWithShadow read8(u32 offset) = 0; + virtual ValueWithShadow read16(u32 offset) = 0; + virtual ValueWithShadow read32(u32 offset) = 0; + virtual ValueWithShadow read64(u32 offset) = 0; + + virtual u8* cacheable_ptr([[maybe_unused]] u32 offset) { return nullptr; } + virtual bool is_shared_buffer() const { return false; } + virtual bool is_mmap() const { return false; } + + bool is_stack() const { return m_stack; } + void set_stack(bool b) { m_stack = b; } + + bool is_text() const { return m_text; } + void set_text(bool b) { m_text = b; } + + bool is_readable() const { return m_readable; } + bool is_writable() const { return m_writable; } + bool is_executable() const { return m_executable; } + + void set_readable(bool b) { m_readable = b; } + void set_writable(bool b) { m_writable = b; } + void set_executable(bool b) { m_executable = b; } + + virtual u8* data() = 0; + virtual u8* shadow_data() = 0; + +protected: + Region(u32 base, u32 size) + : m_base(base) + , m_size(size) + { + } + +private: + u32 m_base { 0 }; + u32 m_size { 0 }; + + bool m_stack { false }; + bool m_text { false }; + bool m_readable { true }; + bool m_writable { true }; + bool m_executable { true }; +}; + +} diff --git a/DevTools/UserspaceEmulator/SharedBufferRegion.h b/DevTools/UserspaceEmulator/SharedBufferRegion.h index e2a6c1ecad..1d56b81ca2 100644 --- a/DevTools/UserspaceEmulator/SharedBufferRegion.h +++ b/DevTools/UserspaceEmulator/SharedBufferRegion.h @@ -31,7 +31,7 @@ namespace UserspaceEmulator { -class SharedBufferRegion final : public SoftMMU::Region { +class SharedBufferRegion final : public Region { public: static NonnullOwnPtr create_with_shbuf_id(u32 base, u32 size, int shbuf_id, u8* shbuf_data); virtual ~SharedBufferRegion() override; diff --git a/DevTools/UserspaceEmulator/SimpleRegion.h b/DevTools/UserspaceEmulator/SimpleRegion.h index 1110299b85..202f283741 100644 --- a/DevTools/UserspaceEmulator/SimpleRegion.h +++ b/DevTools/UserspaceEmulator/SimpleRegion.h @@ -30,7 +30,7 @@ namespace UserspaceEmulator { -class SimpleRegion final : public SoftMMU::Region { +class SimpleRegion final : public Region { public: SimpleRegion(u32 base, u32 size); virtual ~SimpleRegion() override; diff --git a/DevTools/UserspaceEmulator/SoftMMU.cpp b/DevTools/UserspaceEmulator/SoftMMU.cpp index 21061ac7fb..4c4e1fad6e 100644 --- a/DevTools/UserspaceEmulator/SoftMMU.cpp +++ b/DevTools/UserspaceEmulator/SoftMMU.cpp @@ -34,7 +34,7 @@ namespace UserspaceEmulator { -SoftMMU::Region* SoftMMU::find_region(X86::LogicalAddress address) +Region* SoftMMU::find_region(X86::LogicalAddress address) { if (address.selector() == 0x28) return m_tls_region.ptr(); diff --git a/DevTools/UserspaceEmulator/SoftMMU.h b/DevTools/UserspaceEmulator/SoftMMU.h index dda7582f15..398e09eeb9 100644 --- a/DevTools/UserspaceEmulator/SoftMMU.h +++ b/DevTools/UserspaceEmulator/SoftMMU.h @@ -26,6 +26,7 @@ #pragma once +#include "Region.h" #include "ValueWithShadow.h" #include #include @@ -39,65 +40,6 @@ class SharedBufferRegion; class SoftMMU { public: - class Region { - public: - virtual ~Region() { } - - u32 base() const { return m_base; } - u32 size() const { return m_size; } - u32 end() const { return m_base + m_size; } - - bool contains(u32 address) const { return address >= base() && address < end(); } - - virtual void write8(u32 offset, ValueWithShadow) = 0; - virtual void write16(u32 offset, ValueWithShadow) = 0; - virtual void write32(u32 offset, ValueWithShadow) = 0; - virtual void write64(u32 offset, ValueWithShadow) = 0; - - virtual ValueWithShadow read8(u32 offset) = 0; - virtual ValueWithShadow read16(u32 offset) = 0; - virtual ValueWithShadow read32(u32 offset) = 0; - virtual ValueWithShadow read64(u32 offset) = 0; - - virtual u8* cacheable_ptr([[maybe_unused]] u32 offset) { return nullptr; } - virtual bool is_shared_buffer() const { return false; } - virtual bool is_mmap() const { return false; } - - bool is_stack() const { return m_stack; } - void set_stack(bool b) { m_stack = b; } - - bool is_text() const { return m_text; } - void set_text(bool b) { m_text = b; } - - bool is_readable() const { return m_readable; } - bool is_writable() const { return m_writable; } - bool is_executable() const { return m_executable; } - - void set_readable(bool b) { m_readable = b; } - void set_writable(bool b) { m_writable = b; } - void set_executable(bool b) { m_executable = b; } - - virtual u8* data() = 0; - virtual u8* shadow_data() = 0; - - protected: - Region(u32 base, u32 size) - : m_base(base) - , m_size(size) - { - } - - private: - u32 m_base { 0 }; - u32 m_size { 0 }; - - bool m_stack { false }; - bool m_text { false }; - bool m_readable { true }; - bool m_writable { true }; - bool m_executable { true }; - }; - ValueWithShadow read8(X86::LogicalAddress); ValueWithShadow read16(X86::LogicalAddress); ValueWithShadow read32(X86::LogicalAddress);