summaryrefslogtreecommitdiff
path: root/src/common/page_table.cpp
diff options
context:
space:
mode:
authorGravatar bunnei2020-04-08 22:49:51 -0400
committerGravatar bunnei2020-04-17 00:59:34 -0400
commit4c1812ae37bef16ff9031e603bec66b31ac60692 (patch)
treec6646daef3137393e0ef27f4c7fe3ac2e33dded2 /src/common/page_table.cpp
parentcore: gdbstub: Updates for new VMM. (diff)
downloadyuzu-4c1812ae37bef16ff9031e603bec66b31ac60692.tar.gz
yuzu-4c1812ae37bef16ff9031e603bec66b31ac60692.tar.xz
yuzu-4c1812ae37bef16ff9031e603bec66b31ac60692.zip
common: page_table: Update to use VirtualBuffer and simplify.
Diffstat (limited to '')
-rw-r--r--src/common/page_table.cpp34
1 files changed, 9 insertions, 25 deletions
diff --git a/src/common/page_table.cpp b/src/common/page_table.cpp
index 566b57b62..e5d3090d5 100644
--- a/src/common/page_table.cpp
+++ b/src/common/page_table.cpp
@@ -6,36 +6,20 @@
6 6
7namespace Common { 7namespace Common {
8 8
9PageTable::PageTable(std::size_t page_size_in_bits) : page_size_in_bits{page_size_in_bits} {} 9PageTable::PageTable() = default;
10 10
11PageTable::~PageTable() = default; 11PageTable::~PageTable() = default;
12 12
13void PageTable::Resize(std::size_t address_space_width_in_bits) { 13void PageTable::Resize(std::size_t address_space_width_in_bits, std::size_t page_size_in_bits,
14 const std::size_t num_page_table_entries = 1ULL 14 bool has_attribute) {
15 << (address_space_width_in_bits - page_size_in_bits); 15 const std::size_t num_page_table_entries{1ULL
16 16 << (address_space_width_in_bits - page_size_in_bits)};
17 pointers.resize(num_page_table_entries); 17 pointers.resize(num_page_table_entries);
18 attributes.resize(num_page_table_entries);
19
20 // The default is a 39-bit address space, which causes an initial 1GB allocation size. If the
21 // vector size is subsequently decreased (via resize), the vector might not automatically
22 // actually reallocate/resize its underlying allocation, which wastes up to ~800 MB for
23 // 36-bit titles. Call shrink_to_fit to reduce capacity to what's actually in use.
24
25 pointers.shrink_to_fit();
26 attributes.shrink_to_fit();
27}
28
29BackingPageTable::BackingPageTable(std::size_t page_size_in_bits) : PageTable{page_size_in_bits} {}
30
31BackingPageTable::~BackingPageTable() = default;
32
33void BackingPageTable::Resize(std::size_t address_space_width_in_bits) {
34 PageTable::Resize(address_space_width_in_bits);
35 const std::size_t num_page_table_entries = 1ULL
36 << (address_space_width_in_bits - page_size_in_bits);
37 backing_addr.resize(num_page_table_entries); 18 backing_addr.resize(num_page_table_entries);
38 backing_addr.shrink_to_fit(); 19
20 if (has_attribute) {
21 attributes.resize(num_page_table_entries);
22 }
39} 23}
40 24
41} // namespace Common 25} // namespace Common