summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
authorGravatar Fernando Sahmkow2021-11-11 21:24:40 +0100
committerGravatar Fernando Sahmkow2022-10-06 21:00:51 +0200
commitcbaf3fb433a351f7d9509f17f88d4896ba66afd1 (patch)
tree08790ccd701bc894e49d4f13f64703caeb8129db /src/common
parentCommon: implement MultiLevelPageTable. (diff)
downloadyuzu-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.cpp1
-rw-r--r--src/common/multi_level_page_table.inc7
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 {
4template class Common::MultiLevelPageTable<GPUVAddr>; 4template class Common::MultiLevelPageTable<GPUVAddr>;
5template class Common::MultiLevelPageTable<VAddr>; 5template class Common::MultiLevelPageTable<VAddr>;
6template class Common::MultiLevelPageTable<PAddr>; 6template class Common::MultiLevelPageTable<PAddr>;
7template 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 {
53template <typename BaseAddr> 53template <typename BaseAddr>
54void MultiLevelPageTable<BaseAddr>::ReserveRange(u64 start, std::size_t size) { 54void 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
65template <typename BaseAddr> 64template <typename BaseAddr>
66void MultiLevelPageTable<BaseAddr>::AllocateLevel(u64 level) { 65void 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