diff options
| author | 2024-01-07 04:50:06 +0100 | |
|---|---|---|
| committer | 2024-01-18 21:12:30 -0500 | |
| commit | 067284733075fb0604dbcdc6238d23cfa27c5355 (patch) | |
| tree | 3f554af90fd6e120b156f037485641c620829a46 /src | |
| parent | SMMU: Fix 8Gb layout. (diff) | |
| download | yuzu-067284733075fb0604dbcdc6238d23cfa27c5355.tar.gz yuzu-067284733075fb0604dbcdc6238d23cfa27c5355.tar.xz yuzu-067284733075fb0604dbcdc6238d23cfa27c5355.zip | |
SMMU: Fix Right Shift UB.
Diffstat (limited to 'src')
| -rw-r--r-- | src/core/device_memory_manager.h | 4 | ||||
| -rw-r--r-- | src/core/device_memory_manager.inc | 4 |
2 files changed, 4 insertions, 4 deletions
diff --git a/src/core/device_memory_manager.h b/src/core/device_memory_manager.h index f9cb13a7a..cc9fd023f 100644 --- a/src/core/device_memory_manager.h +++ b/src/core/device_memory_manager.h | |||
| @@ -62,13 +62,13 @@ public: | |||
| 62 | DAddr subbits = static_cast<DAddr>(address & page_mask); | 62 | DAddr subbits = static_cast<DAddr>(address & page_mask); |
| 63 | const u32 base = compressed_device_addr[(address >> page_bits)]; | 63 | const u32 base = compressed_device_addr[(address >> page_bits)]; |
| 64 | if ((base >> MULTI_FLAG_BITS) == 0) [[likely]] { | 64 | if ((base >> MULTI_FLAG_BITS) == 0) [[likely]] { |
| 65 | const DAddr d_address = static_cast<DAddr>(base << page_bits) + subbits; | 65 | const DAddr d_address = (static_cast<DAddr>(base) << page_bits) + subbits; |
| 66 | operation(d_address); | 66 | operation(d_address); |
| 67 | return; | 67 | return; |
| 68 | } | 68 | } |
| 69 | InnerGatherDeviceAddresses(buffer, address); | 69 | InnerGatherDeviceAddresses(buffer, address); |
| 70 | for (u32 value : buffer) { | 70 | for (u32 value : buffer) { |
| 71 | operation(static_cast<DAddr>(value << page_bits) + subbits); | 71 | operation((static_cast<DAddr>(value) << page_bits) + subbits); |
| 72 | } | 72 | } |
| 73 | } | 73 | } |
| 74 | 74 | ||
diff --git a/src/core/device_memory_manager.inc b/src/core/device_memory_manager.inc index 5241293b6..d7b4abacc 100644 --- a/src/core/device_memory_manager.inc +++ b/src/core/device_memory_manager.inc | |||
| @@ -301,7 +301,7 @@ template <typename Traits> | |||
| 301 | u8* DeviceMemoryManager<Traits>::GetSpan(const DAddr src_addr, const std::size_t size) { | 301 | u8* DeviceMemoryManager<Traits>::GetSpan(const DAddr src_addr, const std::size_t size) { |
| 302 | size_t page_index = src_addr >> page_bits; | 302 | size_t page_index = src_addr >> page_bits; |
| 303 | size_t subbits = src_addr & page_mask; | 303 | size_t subbits = src_addr & page_mask; |
| 304 | if ((continuity_tracker[page_index] << page_bits) >= size + subbits) { | 304 | if ((static_cast<size_t>(continuity_tracker[page_index]) << page_bits) >= size + subbits) { |
| 305 | return GetPointer<u8>(src_addr); | 305 | return GetPointer<u8>(src_addr); |
| 306 | } | 306 | } |
| 307 | return nullptr; | 307 | return nullptr; |
| @@ -311,7 +311,7 @@ template <typename Traits> | |||
| 311 | const u8* DeviceMemoryManager<Traits>::GetSpan(const DAddr src_addr, const std::size_t size) const { | 311 | const u8* DeviceMemoryManager<Traits>::GetSpan(const DAddr src_addr, const std::size_t size) const { |
| 312 | size_t page_index = src_addr >> page_bits; | 312 | size_t page_index = src_addr >> page_bits; |
| 313 | size_t subbits = src_addr & page_mask; | 313 | size_t subbits = src_addr & page_mask; |
| 314 | if ((continuity_tracker[page_index] << page_bits) >= size + subbits) { | 314 | if ((static_cast<size_t>(continuity_tracker[page_index]) << page_bits) >= size + subbits) { |
| 315 | return GetPointer<u8>(src_addr); | 315 | return GetPointer<u8>(src_addr); |
| 316 | } | 316 | } |
| 317 | return nullptr; | 317 | return nullptr; |