|
|
|
@ -5,9 +5,12 @@ |
|
|
|
#pragma once |
|
|
|
|
|
|
|
#include <vector> |
|
|
|
|
|
|
|
#include <boost/icl/interval_map.hpp> |
|
|
|
|
|
|
|
#include "common/common_types.h" |
|
|
|
#include "common/memory_hook.h" |
|
|
|
#include "common/virtual_buffer.h" |
|
|
|
|
|
|
|
namespace Common { |
|
|
|
|
|
|
|
@ -47,7 +50,7 @@ struct SpecialRegion { |
|
|
|
* mimics the way a real CPU page table works. |
|
|
|
*/ |
|
|
|
struct PageTable { |
|
|
|
explicit PageTable(std::size_t page_size_in_bits); |
|
|
|
PageTable(); |
|
|
|
~PageTable(); |
|
|
|
|
|
|
|
/** |
|
|
|
@ -56,40 +59,18 @@ struct PageTable { |
|
|
|
* |
|
|
|
* @param address_space_width_in_bits The address size width in bits. |
|
|
|
*/ |
|
|
|
void Resize(std::size_t address_space_width_in_bits); |
|
|
|
void Resize(std::size_t address_space_width_in_bits, std::size_t page_size_in_bits, |
|
|
|
bool has_attribute); |
|
|
|
|
|
|
|
/** |
|
|
|
* Vector of memory pointers backing each page. An entry can only be non-null if the |
|
|
|
* corresponding entry in the `attributes` vector is of type `Memory`. |
|
|
|
*/ |
|
|
|
std::vector<u8*> pointers; |
|
|
|
|
|
|
|
/** |
|
|
|
* Contains MMIO handlers that back memory regions whose entries in the `attribute` vector is |
|
|
|
* of type `Special`. |
|
|
|
*/ |
|
|
|
boost::icl::interval_map<u64, std::set<SpecialRegion>> special_regions; |
|
|
|
|
|
|
|
/** |
|
|
|
* Vector of fine grained page attributes. If it is set to any value other than `Memory`, then |
|
|
|
* the corresponding entry in `pointers` MUST be set to null. |
|
|
|
*/ |
|
|
|
std::vector<PageType> attributes; |
|
|
|
|
|
|
|
const std::size_t page_size_in_bits{}; |
|
|
|
}; |
|
|
|
|
|
|
|
/** |
|
|
|
* A more advanced Page Table with the ability to save a backing address when using it |
|
|
|
* depends on another MMU. |
|
|
|
*/ |
|
|
|
struct BackingPageTable : PageTable { |
|
|
|
explicit BackingPageTable(std::size_t page_size_in_bits); |
|
|
|
~BackingPageTable(); |
|
|
|
VirtualBuffer<u8*> pointers; |
|
|
|
|
|
|
|
void Resize(std::size_t address_space_width_in_bits); |
|
|
|
VirtualBuffer<u64> backing_addr; |
|
|
|
|
|
|
|
std::vector<u64> backing_addr; |
|
|
|
VirtualBuffer<PageType> attributes; |
|
|
|
}; |
|
|
|
|
|
|
|
} // namespace Common |