diff options
Diffstat (limited to 'src/common')
| -rw-r--r-- | src/common/address_space.h | 10 | ||||
| -rw-r--r-- | src/common/algorithm.h | 2 | ||||
| -rw-r--r-- | src/common/bit_field.h | 13 | ||||
| -rw-r--r-- | src/common/multi_level_page_table.cpp | 4 | ||||
| -rw-r--r-- | src/common/multi_level_page_table.inc | 2 |
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 | */ |
| 23 | template <typename VaType, VaType UnmappedVa, typename PaType, PaType UnmappedPa, | 23 | template <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> |
| 25 | requires AddressSpaceValid<VaType, AddressSpaceBits> class FlatAddressSpaceMap { | 25 | requires AddressSpaceValid<VaType, AddressSpaceBits> |
| 26 | class FlatAddressSpaceMap { | ||
| 26 | private: | 27 | private: |
| 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 | */ |
| 104 | template <typename VaType, VaType UnmappedVa, size_t AddressSpaceBits> | 105 | template <typename VaType, VaType UnmappedVa, size_t AddressSpaceBits> |
| 105 | requires AddressSpaceValid<VaType, AddressSpaceBits> class FlatAllocator | 106 | requires AddressSpaceValid<VaType, AddressSpaceBits> |
| 107 | class FlatAllocator | ||
| 106 | : public FlatAddressSpaceMap<VaType, UnmappedVa, bool, false, false, AddressSpaceBits> { | 108 | : public FlatAddressSpaceMap<VaType, UnmappedVa, bool, false, false, AddressSpaceBits> { |
| 107 | private: | 109 | private: |
| 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<>> | |||
| 27 | template <typename T, typename Func, typename... Args> | 27 | template <typename T, typename Func, typename... Args> |
| 28 | T FoldRight(T initial_value, Func&& func, Args&&... args) { | 28 | T 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 | ||
| 3 | namespace Common { | 3 | namespace Common { |
| 4 | template class Common::MultiLevelPageTable<GPUVAddr>; | 4 | template class Common::MultiLevelPageTable<u64>; |
| 5 | template class Common::MultiLevelPageTable<VAddr>; | ||
| 6 | template class Common::MultiLevelPageTable<PAddr>; | ||
| 7 | template class Common::MultiLevelPageTable<u32>; | 5 | template 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; |