diff options
| author | 2021-11-11 21:24:40 +0100 | |
|---|---|---|
| committer | 2022-10-06 21:00:51 +0200 | |
| commit | cbaf3fb433a351f7d9509f17f88d4896ba66afd1 (patch) | |
| tree | 08790ccd701bc894e49d4f13f64703caeb8129db /src/common | |
| parent | Common: implement MultiLevelPageTable. (diff) | |
| download | yuzu-cbaf3fb433a351f7d9509f17f88d4896ba66afd1.tar.gz yuzu-cbaf3fb433a351f7d9509f17f88d4896ba66afd1.tar.xz yuzu-cbaf3fb433a351f7d9509f17f88d4896ba66afd1.zip | |
VideoCore: Update MemoryManager
Diffstat (limited to '')
| -rw-r--r-- | src/common/multi_level_page_table.cpp | 1 | ||||
| -rw-r--r-- | src/common/multi_level_page_table.inc | 7 |
2 files changed, 4 insertions, 4 deletions
diff --git a/src/common/multi_level_page_table.cpp b/src/common/multi_level_page_table.cpp index 561785ca7..aed04d0b5 100644 --- a/src/common/multi_level_page_table.cpp +++ b/src/common/multi_level_page_table.cpp | |||
| @@ -4,4 +4,5 @@ namespace Common { | |||
| 4 | template class Common::MultiLevelPageTable<GPUVAddr>; | 4 | template class Common::MultiLevelPageTable<GPUVAddr>; |
| 5 | template class Common::MultiLevelPageTable<VAddr>; | 5 | template class Common::MultiLevelPageTable<VAddr>; |
| 6 | template class Common::MultiLevelPageTable<PAddr>; | 6 | template class Common::MultiLevelPageTable<PAddr>; |
| 7 | template class Common::MultiLevelPageTable<u32>; | ||
| 7 | } // namespace Common | 8 | } // namespace Common |
diff --git a/src/common/multi_level_page_table.inc b/src/common/multi_level_page_table.inc index a75e61f9d..7fbcb908a 100644 --- a/src/common/multi_level_page_table.inc +++ b/src/common/multi_level_page_table.inc | |||
| @@ -20,7 +20,7 @@ MultiLevelPageTable<BaseAddr>::MultiLevelPageTable(std::size_t address_space_bit | |||
| 20 | : address_space_bits{address_space_bits_}, | 20 | : address_space_bits{address_space_bits_}, |
| 21 | first_level_bits{first_level_bits_}, page_bits{page_bits_} { | 21 | first_level_bits{first_level_bits_}, page_bits{page_bits_} { |
| 22 | first_level_shift = address_space_bits - first_level_bits; | 22 | first_level_shift = address_space_bits - first_level_bits; |
| 23 | first_level_chunk_size = 1ULL << (first_level_shift - page_bits); | 23 | first_level_chunk_size = (1ULL << (first_level_shift - page_bits)) * sizeof(BaseAddr); |
| 24 | alloc_size = (1ULL << (address_space_bits - page_bits)) * sizeof(BaseAddr); | 24 | alloc_size = (1ULL << (address_space_bits - page_bits)) * sizeof(BaseAddr); |
| 25 | std::size_t first_level_size = 1ULL << first_level_bits; | 25 | std::size_t first_level_size = 1ULL << first_level_bits; |
| 26 | first_level_map.resize(first_level_size, nullptr); | 26 | first_level_map.resize(first_level_size, nullptr); |
| @@ -53,8 +53,7 @@ MultiLevelPageTable<BaseAddr>::~MultiLevelPageTable() noexcept { | |||
| 53 | template <typename BaseAddr> | 53 | template <typename BaseAddr> |
| 54 | void MultiLevelPageTable<BaseAddr>::ReserveRange(u64 start, std::size_t size) { | 54 | void MultiLevelPageTable<BaseAddr>::ReserveRange(u64 start, std::size_t size) { |
| 55 | const u64 new_start = start >> first_level_shift; | 55 | const u64 new_start = start >> first_level_shift; |
| 56 | const u64 new_end = | 56 | const u64 new_end = (start + size) >> first_level_shift; |
| 57 | (start + size + (first_level_chunk_size << page_bits) - 1) >> first_level_shift; | ||
| 58 | for (u64 i = new_start; i <= new_end; i++) { | 57 | for (u64 i = new_start; i <= new_end; i++) { |
| 59 | if (!first_level_map[i]) { | 58 | if (!first_level_map[i]) { |
| 60 | AllocateLevel(i); | 59 | AllocateLevel(i); |
| @@ -64,7 +63,7 @@ void MultiLevelPageTable<BaseAddr>::ReserveRange(u64 start, std::size_t size) { | |||
| 64 | 63 | ||
| 65 | template <typename BaseAddr> | 64 | template <typename BaseAddr> |
| 66 | void MultiLevelPageTable<BaseAddr>::AllocateLevel(u64 level) { | 65 | void MultiLevelPageTable<BaseAddr>::AllocateLevel(u64 level) { |
| 67 | void* ptr = reinterpret_cast<char*>(base_ptr) + level * first_level_chunk_size; | 66 | void* ptr = reinterpret_cast<char *>(base_ptr) + level * first_level_chunk_size; |
| 68 | #ifdef _WIN32 | 67 | #ifdef _WIN32 |
| 69 | void* base{VirtualAlloc(ptr, first_level_chunk_size, MEM_COMMIT, PAGE_READWRITE)}; | 68 | void* base{VirtualAlloc(ptr, first_level_chunk_size, MEM_COMMIT, PAGE_READWRITE)}; |
| 70 | #else | 69 | #else |