diff options
author | ReinUsesLisp <reinuseslisp@airmail.cc> | 2021-06-05 09:16:32 +0200 |
---|---|---|
committer | Markus Wick <markus@selfnet.de> | 2021-06-11 17:27:06 +0200 |
commit | 740edacc8dd03a8dccdd194ffed8e2b5ec490f73 (patch) | |
tree | 34d69dad4ccb38416fc58e1506bfa1345ed34d59 /src/tests/common/host_memory.cpp | |
parent | common/host_memory: Add Linux implementation (diff) | |
download | yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.gz yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.bz2 yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.lz yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.xz yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.zst yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.zip |
Diffstat (limited to 'src/tests/common/host_memory.cpp')
-rw-r--r-- | src/tests/common/host_memory.cpp | 183 |
1 files changed, 183 insertions, 0 deletions
diff --git a/src/tests/common/host_memory.cpp b/src/tests/common/host_memory.cpp new file mode 100644 index 000000000..e241f8be5 --- /dev/null +++ b/src/tests/common/host_memory.cpp @@ -0,0 +1,183 @@ +// Copyright 2021 yuzu emulator team +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include <catch2/catch.hpp> + +#include "common/host_memory.h" + +using Common::HostMemory; + +static constexpr size_t VIRTUAL_SIZE = 1ULL << 39; +static constexpr size_t BACKING_SIZE = 4ULL * 1024 * 1024 * 1024; + +TEST_CASE("HostMemory: Initialize and deinitialize", "[common]") { + { HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); } + { HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); } +} + +TEST_CASE("HostMemory: Simple map", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x5000, 0x8000, 0x1000); + + volatile u8* const data = mem.VirtualBasePointer() + 0x5000; + data[0] = 50; + REQUIRE(data[0] == 50); +} + +TEST_CASE("HostMemory: Simple mirror map", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x5000, 0x3000, 0x2000); + mem.Map(0x8000, 0x4000, 0x1000); + + volatile u8* const mirror_a = mem.VirtualBasePointer() + 0x5000; + volatile u8* const mirror_b = mem.VirtualBasePointer() + 0x8000; + mirror_b[0] = 76; + REQUIRE(mirror_a[0x1000] == 76); +} + +TEST_CASE("HostMemory: Simple unmap", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x5000, 0x3000, 0x2000); + + volatile u8* const data = mem.VirtualBasePointer() + 0x5000; + data[75] = 50; + REQUIRE(data[75] == 50); + + mem.Unmap(0x5000, 0x2000); +} + +TEST_CASE("HostMemory: Simple unmap and remap", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x5000, 0x3000, 0x2000); + + volatile u8* const data = mem.VirtualBasePointer() + 0x5000; + data[0] = 50; + REQUIRE(data[0] == 50); + + mem.Unmap(0x5000, 0x2000); + + mem.Map(0x5000, 0x3000, 0x2000); + REQUIRE(data[0] == 50); + + mem.Map(0x7000, 0x2000, 0x5000); + REQUIRE(data[0x3000] == 50); +} + +TEST_CASE("HostMemory: Nieche allocation", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x0000, 0, 0x20000); + mem.Unmap(0x0000, 0x4000); + mem.Map(0x1000, 0, 0x2000); + mem.Map(0x3000, 0, 0x1000); + mem.Map(0, 0, 0x1000); +} + +TEST_CASE("HostMemory: Full unmap", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x8000, 0, 0x4000); + mem.Unmap(0x8000, 0x4000); + mem.Map(0x6000, 0, 0x16000); +} + +TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x0000, 0, 0x4000); + mem.Unmap(0x2000, 0x4000); + mem.Map(0x2000, 0x80000, 0x4000); +} + +TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x8000, 0, 0x4000); + mem.Unmap(0x6000, 0x4000); + mem.Map(0x8000, 0, 0x2000); +} + +TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x0000, 0, 0x4000); + mem.Map(0x4000, 0, 0x1b000); + mem.Unmap(0x3000, 0x1c000); + mem.Map(0x3000, 0, 0x20000); +} + +TEST_CASE("HostMemory: Unmap between placeholders", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x0000, 0, 0x4000); + mem.Map(0x4000, 0, 0x4000); + mem.Unmap(0x2000, 0x4000); + mem.Map(0x2000, 0, 0x4000); +} + +TEST_CASE("HostMemory: Unmap to origin", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x4000, 0, 0x4000); + mem.Map(0x8000, 0, 0x4000); + mem.Unmap(0x4000, 0x4000); + mem.Map(0, 0, 0x4000); + mem.Map(0x4000, 0, 0x4000); +} + +TEST_CASE("HostMemory: Unmap to right", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x4000, 0, 0x4000); + mem.Map(0x8000, 0, 0x4000); + mem.Unmap(0x8000, 0x4000); + mem.Map(0x8000, 0, 0x4000); +} + +TEST_CASE("HostMemory: Partial right unmap check bindings", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x4000, 0x10000, 0x4000); + + volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; + ptr[0x1000] = 17; + + mem.Unmap(0x6000, 0x2000); + + REQUIRE(ptr[0x1000] == 17); +} + +TEST_CASE("HostMemory: Partial left unmap check bindings", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x4000, 0x10000, 0x4000); + + volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; + ptr[0x3000] = 19; + ptr[0x3fff] = 12; + + mem.Unmap(0x4000, 0x2000); + + REQUIRE(ptr[0x3000] == 19); + REQUIRE(ptr[0x3fff] == 12); +} + +TEST_CASE("HostMemory: Partial middle unmap check bindings", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x4000, 0x10000, 0x4000); + + volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; + ptr[0x0000] = 19; + ptr[0x3fff] = 12; + + mem.Unmap(0x1000, 0x2000); + + REQUIRE(ptr[0x0000] == 19); + REQUIRE(ptr[0x3fff] == 12); +} + +TEST_CASE("HostMemory: Partial sparse middle unmap and check bindings", "[common]") { + HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); + mem.Map(0x4000, 0x10000, 0x2000); + mem.Map(0x6000, 0x20000, 0x2000); + + volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; + ptr[0x0000] = 19; + ptr[0x3fff] = 12; + + mem.Unmap(0x5000, 0x2000); + + REQUIRE(ptr[0x0000] == 19); + REQUIRE(ptr[0x3fff] == 12); +} |