summaryrefslogtreecommitdiff
path: root/src/common/page_table.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'src/common/page_table.cpp')
-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