summaryrefslogtreecommitdiff
path: root/src/common
diff options
context:
space:
mode:
Diffstat (limited to 'src/common')
-rw-r--r--src/common/address_space.h10
-rw-r--r--src/common/algorithm.h2
-rw-r--r--src/common/bit_field.h13
-rw-r--r--src/common/multi_level_page_table.cpp4
-rw-r--r--src/common/multi_level_page_table.inc2
5 files changed, 14 insertions, 17 deletions
diff --git a/src/common/address_space.h b/src/common/address_space.h
index fd2f32b7d..8e13935af 100644
--- a/src/common/address_space.h
+++ b/src/common/address_space.h
@@ -22,7 +22,8 @@ struct EmptyStruct {};
22 */ 22 */
23template <typename VaType, VaType UnmappedVa, typename PaType, PaType UnmappedPa, 23template <typename VaType, VaType UnmappedVa, typename PaType, PaType UnmappedPa,
24 bool PaContigSplit, size_t AddressSpaceBits, typename ExtraBlockInfo = EmptyStruct> 24 bool PaContigSplit, size_t AddressSpaceBits, typename ExtraBlockInfo = EmptyStruct>
25requires AddressSpaceValid<VaType, AddressSpaceBits> class FlatAddressSpaceMap { 25requires AddressSpaceValid<VaType, AddressSpaceBits>
26class FlatAddressSpaceMap {
26private: 27private:
27 std::function<void(VaType, VaType)> 28 std::function<void(VaType, VaType)>
28 unmapCallback{}; //!< Callback called when the mappings in an region have changed 29 unmapCallback{}; //!< Callback called when the mappings in an region have changed
@@ -40,8 +41,8 @@ protected:
40 41
41 Block() = default; 42 Block() = default;
42 43
43 Block(VaType virt, PaType phys, ExtraBlockInfo extraInfo) 44 Block(VaType virt_, PaType phys_, ExtraBlockInfo extraInfo_)
44 : virt(virt), phys(phys), extraInfo(extraInfo) {} 45 : virt(virt_), phys(phys_), extraInfo(extraInfo_) {}
45 46
46 constexpr bool Valid() { 47 constexpr bool Valid() {
47 return virt != UnmappedVa; 48 return virt != UnmappedVa;
@@ -102,7 +103,8 @@ public:
102 * initial, fast linear pass and a subsequent slower pass that iterates until it finds a free block 103 * initial, fast linear pass and a subsequent slower pass that iterates until it finds a free block
103 */ 104 */
104template <typename VaType, VaType UnmappedVa, size_t AddressSpaceBits> 105template <typename VaType, VaType UnmappedVa, size_t AddressSpaceBits>
105requires AddressSpaceValid<VaType, AddressSpaceBits> class FlatAllocator 106requires AddressSpaceValid<VaType, AddressSpaceBits>
107class FlatAllocator
106 : public FlatAddressSpaceMap<VaType, UnmappedVa, bool, false, false, AddressSpaceBits> { 108 : public FlatAddressSpaceMap<VaType, UnmappedVa, bool, false, false, AddressSpaceBits> {
107private: 109private:
108 using Base = FlatAddressSpaceMap<VaType, UnmappedVa, bool, false, false, AddressSpaceBits>; 110 using Base = FlatAddressSpaceMap<VaType, UnmappedVa, bool, false, false, AddressSpaceBits>;
diff --git a/src/common/algorithm.h b/src/common/algorithm.h
index 055dca142..c27c9241d 100644
--- a/src/common/algorithm.h
+++ b/src/common/algorithm.h
@@ -27,7 +27,7 @@ template <class ForwardIt, class T, class Compare = std::less<>>
27template <typename T, typename Func, typename... Args> 27template <typename T, typename Func, typename... Args>
28T FoldRight(T initial_value, Func&& func, Args&&... args) { 28T FoldRight(T initial_value, Func&& func, Args&&... args) {
29 T value{initial_value}; 29 T value{initial_value};
30 const auto high_func = [&value, &func]<typename T>(T x) { value = func(value, x); }; 30 const auto high_func = [&value, &func]<typename U>(U x) { value = func(value, x); };
31 (std::invoke(high_func, std::forward<Args>(args)), ...); 31 (std::invoke(high_func, std::forward<Args>(args)), ...);
32 return value; 32 return value;
33} 33}
diff --git a/src/common/bit_field.h b/src/common/bit_field.h
index 368b7b98c..7e1df62b1 100644
--- a/src/common/bit_field.h
+++ b/src/common/bit_field.h
@@ -127,14 +127,11 @@ public:
127 } 127 }
128 } 128 }
129 129
130 BitField(T val) { 130 // This constructor and assignment operator might be considered ambiguous:
131 Assign(val); 131 // Would they initialize the storage or just the bitfield?
132 } 132 // Hence, delete them. Use the Assign method to set bitfield values!
133 133 BitField(T val) = delete;
134 BitField& operator=(T val) { 134 BitField& operator=(T val) = delete;
135 Assign(val);
136 return *this;
137 }
138 135
139 constexpr BitField() noexcept = default; 136 constexpr BitField() noexcept = default;
140 137
diff --git a/src/common/multi_level_page_table.cpp b/src/common/multi_level_page_table.cpp
index aed04d0b5..3a7a75aa7 100644
--- a/src/common/multi_level_page_table.cpp
+++ b/src/common/multi_level_page_table.cpp
@@ -1,8 +1,6 @@
1#include "common/multi_level_page_table.inc" 1#include "common/multi_level_page_table.inc"
2 2
3namespace Common { 3namespace Common {
4template class Common::MultiLevelPageTable<GPUVAddr>; 4template class Common::MultiLevelPageTable<u64>;
5template class Common::MultiLevelPageTable<VAddr>;
6template class Common::MultiLevelPageTable<PAddr>;
7template class Common::MultiLevelPageTable<u32>; 5template class Common::MultiLevelPageTable<u32>;
8} // namespace Common 6} // namespace Common
diff --git a/src/common/multi_level_page_table.inc b/src/common/multi_level_page_table.inc
index 9a68cad93..4def6dba8 100644
--- a/src/common/multi_level_page_table.inc
+++ b/src/common/multi_level_page_table.inc
@@ -30,7 +30,7 @@ MultiLevelPageTable<BaseAddr>::MultiLevelPageTable(std::size_t address_space_bit
30#ifdef _WIN32 30#ifdef _WIN32
31 void* base{VirtualAlloc(nullptr, alloc_size, MEM_RESERVE, PAGE_READWRITE)}; 31 void* base{VirtualAlloc(nullptr, alloc_size, MEM_RESERVE, PAGE_READWRITE)};
32#else 32#else
33 void* base{mmap(nullptr, alloc_size, PROT_NONE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)}; 33 void* base{mmap(nullptr, alloc_size, PROT_READ | PROT_WRITE, MAP_PRIVATE | MAP_ANONYMOUS, -1, 0)};
34 34
35 if (base == MAP_FAILED) { 35 if (base == MAP_FAILED) {
36 base = nullptr; 36 base = nullptr;