diff options
Diffstat (limited to 'src/core/memory.h')
| -rw-r--r-- | src/core/memory.h | 63 |
1 files changed, 22 insertions, 41 deletions
diff --git a/src/core/memory.h b/src/core/memory.h index 2a27c0251..1acf5ce8c 100644 --- a/src/core/memory.h +++ b/src/core/memory.h | |||
| @@ -4,10 +4,10 @@ | |||
| 4 | 4 | ||
| 5 | #pragma once | 5 | #pragma once |
| 6 | 6 | ||
| 7 | #include <array> | ||
| 8 | #include <cstddef> | 7 | #include <cstddef> |
| 9 | #include <string> | 8 | #include <string> |
| 10 | #include <tuple> | 9 | #include <tuple> |
| 10 | #include <vector> | ||
| 11 | #include <boost/icl/interval_map.hpp> | 11 | #include <boost/icl/interval_map.hpp> |
| 12 | #include "common/common_types.h" | 12 | #include "common/common_types.h" |
| 13 | #include "core/memory_hook.h" | 13 | #include "core/memory_hook.h" |
| @@ -23,10 +23,8 @@ namespace Memory { | |||
| 23 | * be mapped. | 23 | * be mapped. |
| 24 | */ | 24 | */ |
| 25 | constexpr std::size_t PAGE_BITS = 12; | 25 | constexpr std::size_t PAGE_BITS = 12; |
| 26 | constexpr u64 PAGE_SIZE = 1 << PAGE_BITS; | 26 | constexpr u64 PAGE_SIZE = 1ULL << PAGE_BITS; |
| 27 | constexpr u64 PAGE_MASK = PAGE_SIZE - 1; | 27 | constexpr u64 PAGE_MASK = PAGE_SIZE - 1; |
| 28 | constexpr std::size_t ADDRESS_SPACE_BITS = 36; | ||
| 29 | constexpr std::size_t PAGE_TABLE_NUM_ENTRIES = 1ULL << (ADDRESS_SPACE_BITS - PAGE_BITS); | ||
| 30 | 28 | ||
| 31 | enum class PageType : u8 { | 29 | enum class PageType : u8 { |
| 32 | /// Page is unmapped and should cause an access error. | 30 | /// Page is unmapped and should cause an access error. |
| @@ -62,32 +60,39 @@ struct SpecialRegion { | |||
| 62 | * mimics the way a real CPU page table works. | 60 | * mimics the way a real CPU page table works. |
| 63 | */ | 61 | */ |
| 64 | struct PageTable { | 62 | struct PageTable { |
| 63 | explicit PageTable(); | ||
| 64 | explicit PageTable(std::size_t address_space_width_in_bits); | ||
| 65 | ~PageTable(); | ||
| 66 | |||
| 67 | /** | ||
| 68 | * Resizes the page table to be able to accomodate enough pages within | ||
| 69 | * a given address space. | ||
| 70 | * | ||
| 71 | * @param address_space_width_in_bits The address size width in bits. | ||
| 72 | */ | ||
| 73 | void Resize(std::size_t address_space_width_in_bits); | ||
| 74 | |||
| 65 | /** | 75 | /** |
| 66 | * Array of memory pointers backing each page. An entry can only be non-null if the | 76 | * Vector of memory pointers backing each page. An entry can only be non-null if the |
| 67 | * corresponding entry in the `attributes` array is of type `Memory`. | 77 | * corresponding entry in the `attributes` vector is of type `Memory`. |
| 68 | */ | 78 | */ |
| 69 | std::array<u8*, PAGE_TABLE_NUM_ENTRIES> pointers; | 79 | std::vector<u8*> pointers; |
| 70 | 80 | ||
| 71 | /** | 81 | /** |
| 72 | * Contains MMIO handlers that back memory regions whose entries in the `attribute` array is of | 82 | * Contains MMIO handlers that back memory regions whose entries in the `attribute` vector is |
| 73 | * type `Special`. | 83 | * of type `Special`. |
| 74 | */ | 84 | */ |
| 75 | boost::icl::interval_map<VAddr, std::set<SpecialRegion>> special_regions; | 85 | boost::icl::interval_map<VAddr, std::set<SpecialRegion>> special_regions; |
| 76 | 86 | ||
| 77 | /** | 87 | /** |
| 78 | * Array of fine grained page attributes. If it is set to any value other than `Memory`, then | 88 | * Vector of fine grained page attributes. If it is set to any value other than `Memory`, then |
| 79 | * the corresponding entry in `pointers` MUST be set to null. | 89 | * the corresponding entry in `pointers` MUST be set to null. |
| 80 | */ | 90 | */ |
| 81 | std::array<PageType, PAGE_TABLE_NUM_ENTRIES> attributes; | 91 | std::vector<PageType> attributes; |
| 82 | }; | 92 | }; |
| 83 | 93 | ||
| 84 | /// Virtual user-space memory regions | 94 | /// Virtual user-space memory regions |
| 85 | enum : VAddr { | 95 | enum : VAddr { |
| 86 | /// Where the application text, data and bss reside. | ||
| 87 | PROCESS_IMAGE_VADDR = 0x08000000, | ||
| 88 | PROCESS_IMAGE_MAX_SIZE = 0x08000000, | ||
| 89 | PROCESS_IMAGE_VADDR_END = PROCESS_IMAGE_VADDR + PROCESS_IMAGE_MAX_SIZE, | ||
| 90 | |||
| 91 | /// Read-only page containing kernel and system configuration values. | 96 | /// Read-only page containing kernel and system configuration values. |
| 92 | CONFIG_MEMORY_VADDR = 0x1FF80000, | 97 | CONFIG_MEMORY_VADDR = 0x1FF80000, |
| 93 | CONFIG_MEMORY_SIZE = 0x00001000, | 98 | CONFIG_MEMORY_SIZE = 0x00001000, |
| @@ -98,36 +103,12 @@ enum : VAddr { | |||
| 98 | SHARED_PAGE_SIZE = 0x00001000, | 103 | SHARED_PAGE_SIZE = 0x00001000, |
| 99 | SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE, | 104 | SHARED_PAGE_VADDR_END = SHARED_PAGE_VADDR + SHARED_PAGE_SIZE, |
| 100 | 105 | ||
| 101 | /// Area where TLS (Thread-Local Storage) buffers are allocated. | 106 | /// TLS (Thread-Local Storage) related. |
| 102 | TLS_AREA_VADDR = 0x40000000, | ||
| 103 | TLS_ENTRY_SIZE = 0x200, | 107 | TLS_ENTRY_SIZE = 0x200, |
| 104 | TLS_AREA_SIZE = 0x10000000, | ||
| 105 | TLS_AREA_VADDR_END = TLS_AREA_VADDR + TLS_AREA_SIZE, | ||
| 106 | 108 | ||
| 107 | /// Application stack | 109 | /// Application stack |
| 108 | STACK_AREA_VADDR = TLS_AREA_VADDR_END, | ||
| 109 | STACK_AREA_SIZE = 0x10000000, | ||
| 110 | STACK_AREA_VADDR_END = STACK_AREA_VADDR + STACK_AREA_SIZE, | ||
| 111 | DEFAULT_STACK_SIZE = 0x100000, | 110 | DEFAULT_STACK_SIZE = 0x100000, |
| 112 | 111 | ||
| 113 | /// Application heap | ||
| 114 | /// Size is confirmed to be a static value on fw 3.0.0 | ||
| 115 | HEAP_VADDR = 0x108000000, | ||
| 116 | HEAP_SIZE = 0x180000000, | ||
| 117 | HEAP_VADDR_END = HEAP_VADDR + HEAP_SIZE, | ||
| 118 | |||
| 119 | /// New map region | ||
| 120 | /// Size is confirmed to be a static value on fw 3.0.0 | ||
| 121 | NEW_MAP_REGION_VADDR = HEAP_VADDR_END, | ||
| 122 | NEW_MAP_REGION_SIZE = 0x80000000, | ||
| 123 | NEW_MAP_REGION_VADDR_END = NEW_MAP_REGION_VADDR + NEW_MAP_REGION_SIZE, | ||
| 124 | |||
| 125 | /// Map region | ||
| 126 | /// Size is confirmed to be a static value on fw 3.0.0 | ||
| 127 | MAP_REGION_VADDR = NEW_MAP_REGION_VADDR_END, | ||
| 128 | MAP_REGION_SIZE = 0x1000000000, | ||
| 129 | MAP_REGION_VADDR_END = MAP_REGION_VADDR + MAP_REGION_SIZE, | ||
| 130 | |||
| 131 | /// Kernel Virtual Address Range | 112 | /// Kernel Virtual Address Range |
| 132 | KERNEL_REGION_VADDR = 0xFFFFFF8000000000, | 113 | KERNEL_REGION_VADDR = 0xFFFFFF8000000000, |
| 133 | KERNEL_REGION_SIZE = 0x7FFFE00000, | 114 | KERNEL_REGION_SIZE = 0x7FFFE00000, |