|
|
@ -14,13 +14,21 @@ static constexpr size_t BACKING_SIZE = 4_GiB; |
|
|
static constexpr auto PERMS = Common::MemoryPermission::ReadWrite; |
|
|
static constexpr auto PERMS = Common::MemoryPermission::ReadWrite; |
|
|
static constexpr auto HEAP = false; |
|
|
static constexpr auto HEAP = false; |
|
|
|
|
|
|
|
|
|
|
|
#ifndef __OPENORBIS__
|
|
|
TEST_CASE("HostMemory: Initialize and deinitialize", "[common]") { |
|
|
TEST_CASE("HostMemory: Initialize and deinitialize", "[common]") { |
|
|
{ HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); } |
|
|
|
|
|
{ HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); } |
|
|
|
|
|
|
|
|
{ |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
|
|
|
} |
|
|
|
|
|
{ |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
|
|
|
} |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple map", "[common]") { |
|
|
TEST_CASE("HostMemory: Simple map", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x5000, 0x8000, 0x1000, PERMS, HEAP); |
|
|
mem.Map(0x5000, 0x8000, 0x1000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000; |
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000; |
|
|
@ -30,6 +38,7 @@ TEST_CASE("HostMemory: Simple map", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple mirror map", "[common]") { |
|
|
TEST_CASE("HostMemory: Simple mirror map", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS, HEAP); |
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0x4000, 0x1000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0x4000, 0x1000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
@ -41,6 +50,7 @@ TEST_CASE("HostMemory: Simple mirror map", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple unmap", "[common]") { |
|
|
TEST_CASE("HostMemory: Simple unmap", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS, HEAP); |
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000; |
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000; |
|
|
@ -52,6 +62,7 @@ TEST_CASE("HostMemory: Simple unmap", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple unmap and remap", "[common]") { |
|
|
TEST_CASE("HostMemory: Simple unmap and remap", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS, HEAP); |
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000; |
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000; |
|
|
@ -67,8 +78,69 @@ TEST_CASE("HostMemory: Simple unmap and remap", "[common]") { |
|
|
REQUIRE(data[0x3000] == 50); |
|
|
REQUIRE(data[0x3000] == 50); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial right unmap check bindings", "[common]") { |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x1000] = 17; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x6000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
REQUIRE(ptr[0x1000] == 17); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial left unmap check bindings", "[common]") { |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x3000] = 19; |
|
|
|
|
|
ptr[0x3fff] = 12; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x4000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
REQUIRE(ptr[0x3000] == 19); |
|
|
|
|
|
REQUIRE(ptr[0x3fff] == 12); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial middle unmap check bindings", "[common]") { |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x0000] = 19; |
|
|
|
|
|
ptr[0x3fff] = 12; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x1000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
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); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x2000, PERMS, HEAP); |
|
|
|
|
|
mem.Map(0x6000, 0x20000, 0x2000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x0000] = 19; |
|
|
|
|
|
ptr[0x3fff] = 12; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x5000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
REQUIRE(ptr[0x0000] == 19); |
|
|
|
|
|
REQUIRE(ptr[0x3fff] == 12); |
|
|
|
|
|
} |
|
|
|
|
|
#endif
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Nieche allocation", "[common]") { |
|
|
TEST_CASE("HostMemory: Nieche allocation", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x0000, 0, 0x20000, PERMS, HEAP); |
|
|
mem.Map(0x0000, 0, 0x20000, PERMS, HEAP); |
|
|
mem.Unmap(0x0000, 0x4000, HEAP); |
|
|
mem.Unmap(0x0000, 0x4000, HEAP); |
|
|
mem.Map(0x1000, 0, 0x2000, PERMS, HEAP); |
|
|
mem.Map(0x1000, 0, 0x2000, PERMS, HEAP); |
|
|
@ -78,6 +150,7 @@ TEST_CASE("HostMemory: Nieche allocation", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Full unmap", "[common]") { |
|
|
TEST_CASE("HostMemory: Full unmap", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Unmap(0x8000, 0x4000, HEAP); |
|
|
mem.Unmap(0x8000, 0x4000, HEAP); |
|
|
mem.Map(0x6000, 0, 0x16000, PERMS, HEAP); |
|
|
mem.Map(0x6000, 0, 0x16000, PERMS, HEAP); |
|
|
@ -85,6 +158,7 @@ TEST_CASE("HostMemory: Full unmap", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") { |
|
|
TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x0000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x0000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Unmap(0x2000, 0x4000, HEAP); |
|
|
mem.Unmap(0x2000, 0x4000, HEAP); |
|
|
mem.Map(0x2000, 0x80000, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x2000, 0x80000, 0x4000, PERMS, HEAP); |
|
|
@ -92,6 +166,7 @@ TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") { |
|
|
TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Unmap(0x6000, 0x4000, HEAP); |
|
|
mem.Unmap(0x6000, 0x4000, HEAP); |
|
|
mem.Map(0x8000, 0, 0x2000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x2000, PERMS, HEAP); |
|
|
@ -99,6 +174,7 @@ TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") { |
|
|
TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x0000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x0000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x4000, 0, 0x1b000, PERMS, HEAP); |
|
|
mem.Map(0x4000, 0, 0x1b000, PERMS, HEAP); |
|
|
mem.Unmap(0x3000, 0x1c000, HEAP); |
|
|
mem.Unmap(0x3000, 0x1c000, HEAP); |
|
|
@ -107,6 +183,7 @@ TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Unmap between placeholders", "[common]") { |
|
|
TEST_CASE("HostMemory: Unmap between placeholders", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x0000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x0000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x4000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x4000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Unmap(0x2000, 0x4000, HEAP); |
|
|
mem.Unmap(0x2000, 0x4000, HEAP); |
|
|
@ -115,6 +192,7 @@ TEST_CASE("HostMemory: Unmap between placeholders", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Unmap to origin", "[common]") { |
|
|
TEST_CASE("HostMemory: Unmap to origin", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x4000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x4000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Unmap(0x4000, 0x4000, HEAP); |
|
|
mem.Unmap(0x4000, 0x4000, HEAP); |
|
|
@ -124,63 +202,9 @@ TEST_CASE("HostMemory: Unmap to origin", "[common]") { |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Unmap to right", "[common]") { |
|
|
TEST_CASE("HostMemory: Unmap to right", "[common]") { |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
REQUIRE(mem.BackingBasePointer() != nullptr); |
|
|
mem.Map(0x4000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x4000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Unmap(0x8000, 0x4000, HEAP); |
|
|
mem.Unmap(0x8000, 0x4000, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
mem.Map(0x8000, 0, 0x4000, PERMS, HEAP); |
|
|
} |
|
|
} |
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial right unmap check bindings", "[common]") { |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x1000] = 17; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x6000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
REQUIRE(ptr[0x1000] == 17); |
|
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial left unmap check bindings", "[common]") { |
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); |
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x3000] = 19; |
|
|
|
|
|
ptr[0x3fff] = 12; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x4000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
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, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x0000] = 19; |
|
|
|
|
|
ptr[0x3fff] = 12; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x1000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
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, PERMS, HEAP); |
|
|
|
|
|
mem.Map(0x6000, 0x20000, 0x2000, PERMS, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000; |
|
|
|
|
|
ptr[0x0000] = 19; |
|
|
|
|
|
ptr[0x3fff] = 12; |
|
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x5000, 0x2000, HEAP); |
|
|
|
|
|
|
|
|
|
|
|
REQUIRE(ptr[0x0000] == 19); |
|
|
|
|
|
REQUIRE(ptr[0x3fff] == 12); |
|
|
|
|
|
} |
|
|
|