summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorGravatar ReinUsesLisp2021-06-05 04:16:32 -0300
committerGravatar Markus Wick2021-06-11 17:27:06 +0200
commit740edacc8dd03a8dccdd194ffed8e2b5ec490f73 (patch)
tree34d69dad4ccb38416fc58e1506bfa1345ed34d59 /src
parentcommon/host_memory: Add Linux implementation (diff)
downloadyuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.gz
yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.tar.xz
yuzu-740edacc8dd03a8dccdd194ffed8e2b5ec490f73.zip
tests: Add tests for host memory
Diffstat (limited to 'src')
-rw-r--r--src/tests/CMakeLists.txt1
-rw-r--r--src/tests/common/host_memory.cpp183
2 files changed, 184 insertions, 0 deletions
diff --git a/src/tests/CMakeLists.txt b/src/tests/CMakeLists.txt
index d875c4fee..96bc30cac 100644
--- a/src/tests/CMakeLists.txt
+++ b/src/tests/CMakeLists.txt
@@ -2,6 +2,7 @@ add_executable(tests
2 common/bit_field.cpp 2 common/bit_field.cpp
3 common/cityhash.cpp 3 common/cityhash.cpp
4 common/fibers.cpp 4 common/fibers.cpp
5 common/host_memory.cpp
5 common/param_package.cpp 6 common/param_package.cpp
6 common/ring_buffer.cpp 7 common/ring_buffer.cpp
7 core/core_timing.cpp 8 core/core_timing.cpp
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 @@
1// Copyright 2021 yuzu emulator team
2// Licensed under GPLv2 or any later version
3// Refer to the license.txt file included.
4
5#include <catch2/catch.hpp>
6
7#include "common/host_memory.h"
8
9using Common::HostMemory;
10
11static constexpr size_t VIRTUAL_SIZE = 1ULL << 39;
12static constexpr size_t BACKING_SIZE = 4ULL * 1024 * 1024 * 1024;
13
14TEST_CASE("HostMemory: Initialize and deinitialize", "[common]") {
15 { HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); }
16 { HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); }
17}
18
19TEST_CASE("HostMemory: Simple map", "[common]") {
20 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
21 mem.Map(0x5000, 0x8000, 0x1000);
22
23 volatile u8* const data = mem.VirtualBasePointer() + 0x5000;
24 data[0] = 50;
25 REQUIRE(data[0] == 50);
26}
27
28TEST_CASE("HostMemory: Simple mirror map", "[common]") {
29 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
30 mem.Map(0x5000, 0x3000, 0x2000);
31 mem.Map(0x8000, 0x4000, 0x1000);
32
33 volatile u8* const mirror_a = mem.VirtualBasePointer() + 0x5000;
34 volatile u8* const mirror_b = mem.VirtualBasePointer() + 0x8000;
35 mirror_b[0] = 76;
36 REQUIRE(mirror_a[0x1000] == 76);
37}
38
39TEST_CASE("HostMemory: Simple unmap", "[common]") {
40 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
41 mem.Map(0x5000, 0x3000, 0x2000);
42
43 volatile u8* const data = mem.VirtualBasePointer() + 0x5000;
44 data[75] = 50;
45 REQUIRE(data[75] == 50);
46
47 mem.Unmap(0x5000, 0x2000);
48}
49
50TEST_CASE("HostMemory: Simple unmap and remap", "[common]") {
51 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
52 mem.Map(0x5000, 0x3000, 0x2000);
53
54 volatile u8* const data = mem.VirtualBasePointer() + 0x5000;
55 data[0] = 50;
56 REQUIRE(data[0] == 50);
57
58 mem.Unmap(0x5000, 0x2000);
59
60 mem.Map(0x5000, 0x3000, 0x2000);
61 REQUIRE(data[0] == 50);
62
63 mem.Map(0x7000, 0x2000, 0x5000);
64 REQUIRE(data[0x3000] == 50);
65}
66
67TEST_CASE("HostMemory: Nieche allocation", "[common]") {
68 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
69 mem.Map(0x0000, 0, 0x20000);
70 mem.Unmap(0x0000, 0x4000);
71 mem.Map(0x1000, 0, 0x2000);
72 mem.Map(0x3000, 0, 0x1000);
73 mem.Map(0, 0, 0x1000);
74}
75
76TEST_CASE("HostMemory: Full unmap", "[common]") {
77 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
78 mem.Map(0x8000, 0, 0x4000);
79 mem.Unmap(0x8000, 0x4000);
80 mem.Map(0x6000, 0, 0x16000);
81}
82
83TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") {
84 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
85 mem.Map(0x0000, 0, 0x4000);
86 mem.Unmap(0x2000, 0x4000);
87 mem.Map(0x2000, 0x80000, 0x4000);
88}
89
90TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") {
91 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
92 mem.Map(0x8000, 0, 0x4000);
93 mem.Unmap(0x6000, 0x4000);
94 mem.Map(0x8000, 0, 0x2000);
95}
96
97TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") {
98 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
99 mem.Map(0x0000, 0, 0x4000);
100 mem.Map(0x4000, 0, 0x1b000);
101 mem.Unmap(0x3000, 0x1c000);
102 mem.Map(0x3000, 0, 0x20000);
103}
104
105TEST_CASE("HostMemory: Unmap between placeholders", "[common]") {
106 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
107 mem.Map(0x0000, 0, 0x4000);
108 mem.Map(0x4000, 0, 0x4000);
109 mem.Unmap(0x2000, 0x4000);
110 mem.Map(0x2000, 0, 0x4000);
111}
112
113TEST_CASE("HostMemory: Unmap to origin", "[common]") {
114 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
115 mem.Map(0x4000, 0, 0x4000);
116 mem.Map(0x8000, 0, 0x4000);
117 mem.Unmap(0x4000, 0x4000);
118 mem.Map(0, 0, 0x4000);
119 mem.Map(0x4000, 0, 0x4000);
120}
121
122TEST_CASE("HostMemory: Unmap to right", "[common]") {
123 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
124 mem.Map(0x4000, 0, 0x4000);
125 mem.Map(0x8000, 0, 0x4000);
126 mem.Unmap(0x8000, 0x4000);
127 mem.Map(0x8000, 0, 0x4000);
128}
129
130TEST_CASE("HostMemory: Partial right unmap check bindings", "[common]") {
131 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
132 mem.Map(0x4000, 0x10000, 0x4000);
133
134 volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
135 ptr[0x1000] = 17;
136
137 mem.Unmap(0x6000, 0x2000);
138
139 REQUIRE(ptr[0x1000] == 17);
140}
141
142TEST_CASE("HostMemory: Partial left unmap check bindings", "[common]") {
143 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
144 mem.Map(0x4000, 0x10000, 0x4000);
145
146 volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
147 ptr[0x3000] = 19;
148 ptr[0x3fff] = 12;
149
150 mem.Unmap(0x4000, 0x2000);
151
152 REQUIRE(ptr[0x3000] == 19);
153 REQUIRE(ptr[0x3fff] == 12);
154}
155
156TEST_CASE("HostMemory: Partial middle unmap check bindings", "[common]") {
157 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
158 mem.Map(0x4000, 0x10000, 0x4000);
159
160 volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
161 ptr[0x0000] = 19;
162 ptr[0x3fff] = 12;
163
164 mem.Unmap(0x1000, 0x2000);
165
166 REQUIRE(ptr[0x0000] == 19);
167 REQUIRE(ptr[0x3fff] == 12);
168}
169
170TEST_CASE("HostMemory: Partial sparse middle unmap and check bindings", "[common]") {
171 HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
172 mem.Map(0x4000, 0x10000, 0x2000);
173 mem.Map(0x6000, 0x20000, 0x2000);
174
175 volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
176 ptr[0x0000] = 19;
177 ptr[0x3fff] = 12;
178
179 mem.Unmap(0x5000, 0x2000);
180
181 REQUIRE(ptr[0x0000] == 19);
182 REQUIRE(ptr[0x3fff] == 12);
183}