|
|
|
@ -11,6 +11,7 @@ using namespace Common::Literals;
|
|
|
|
|
|
|
|
|
|
static constexpr size_t VIRTUAL_SIZE = 1ULL << 39;
|
|
|
|
|
static constexpr size_t BACKING_SIZE = 4_GiB;
|
|
|
|
|
static constexpr auto PERMS = Common::MemoryPermission::ReadWrite;
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Initialize and deinitialize", "[common]") {
|
|
|
|
|
{ HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE); }
|
|
|
|
@ -19,7 +20,7 @@ TEST_CASE("HostMemory: Initialize and deinitialize", "[common]") {
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple map", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x5000, 0x8000, 0x1000);
|
|
|
|
|
mem.Map(0x5000, 0x8000, 0x1000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000;
|
|
|
|
|
data[0] = 50;
|
|
|
|
@ -28,8 +29,8 @@ TEST_CASE("HostMemory: Simple map", "[common]") {
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple mirror map", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000);
|
|
|
|
|
mem.Map(0x8000, 0x4000, 0x1000);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS);
|
|
|
|
|
mem.Map(0x8000, 0x4000, 0x1000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const mirror_a = mem.VirtualBasePointer() + 0x5000;
|
|
|
|
|
volatile u8* const mirror_b = mem.VirtualBasePointer() + 0x8000;
|
|
|
|
@ -39,7 +40,7 @@ TEST_CASE("HostMemory: Simple mirror map", "[common]") {
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple unmap", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000;
|
|
|
|
|
data[75] = 50;
|
|
|
|
@ -50,7 +51,7 @@ TEST_CASE("HostMemory: Simple unmap", "[common]") {
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Simple unmap and remap", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const data = mem.VirtualBasePointer() + 0x5000;
|
|
|
|
|
data[0] = 50;
|
|
|
|
@ -58,79 +59,79 @@ TEST_CASE("HostMemory: Simple unmap and remap", "[common]") {
|
|
|
|
|
|
|
|
|
|
mem.Unmap(0x5000, 0x2000);
|
|
|
|
|
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000);
|
|
|
|
|
mem.Map(0x5000, 0x3000, 0x2000, PERMS);
|
|
|
|
|
REQUIRE(data[0] == 50);
|
|
|
|
|
|
|
|
|
|
mem.Map(0x7000, 0x2000, 0x5000);
|
|
|
|
|
mem.Map(0x7000, 0x2000, 0x5000, PERMS);
|
|
|
|
|
REQUIRE(data[0x3000] == 50);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Nieche allocation", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x0000, 0, 0x20000);
|
|
|
|
|
mem.Map(0x0000, 0, 0x20000, PERMS);
|
|
|
|
|
mem.Unmap(0x0000, 0x4000);
|
|
|
|
|
mem.Map(0x1000, 0, 0x2000);
|
|
|
|
|
mem.Map(0x3000, 0, 0x1000);
|
|
|
|
|
mem.Map(0, 0, 0x1000);
|
|
|
|
|
mem.Map(0x1000, 0, 0x2000, PERMS);
|
|
|
|
|
mem.Map(0x3000, 0, 0x1000, PERMS);
|
|
|
|
|
mem.Map(0, 0, 0x1000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Full unmap", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Unmap(0x8000, 0x4000);
|
|
|
|
|
mem.Map(0x6000, 0, 0x16000);
|
|
|
|
|
mem.Map(0x6000, 0, 0x16000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x0000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x0000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Unmap(0x2000, 0x4000);
|
|
|
|
|
mem.Map(0x2000, 0x80000, 0x4000);
|
|
|
|
|
mem.Map(0x2000, 0x80000, 0x4000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Unmap(0x6000, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x2000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x2000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x0000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0, 0x1b000);
|
|
|
|
|
mem.Map(0x0000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Map(0x4000, 0, 0x1b000, PERMS);
|
|
|
|
|
mem.Unmap(0x3000, 0x1c000);
|
|
|
|
|
mem.Map(0x3000, 0, 0x20000);
|
|
|
|
|
mem.Map(0x3000, 0, 0x20000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Unmap between placeholders", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x0000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x0000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Unmap(0x2000, 0x4000);
|
|
|
|
|
mem.Map(0x2000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x2000, 0, 0x4000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Unmap to origin", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Unmap(0x4000, 0x4000);
|
|
|
|
|
mem.Map(0, 0, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000);
|
|
|
|
|
mem.Map(0, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Unmap to right", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000, PERMS);
|
|
|
|
|
mem.Unmap(0x8000, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000);
|
|
|
|
|
mem.Map(0x8000, 0, 0x4000, PERMS);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial right unmap check bindings", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
|
|
|
|
|
ptr[0x1000] = 17;
|
|
|
|
@ -142,7 +143,7 @@ TEST_CASE("HostMemory: Partial right unmap check bindings", "[common]") {
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial left unmap check bindings", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
|
|
|
|
|
ptr[0x3000] = 19;
|
|
|
|
@ -156,7 +157,7 @@ TEST_CASE("HostMemory: Partial left unmap check bindings", "[common]") {
|
|
|
|
|
|
|
|
|
|
TEST_CASE("HostMemory: Partial middle unmap check bindings", "[common]") {
|
|
|
|
|
HostMemory mem(BACKING_SIZE, VIRTUAL_SIZE);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x4000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
|
|
|
|
|
ptr[0x0000] = 19;
|
|
|
|
@ -170,8 +171,8 @@ TEST_CASE("HostMemory: Partial middle unmap check bindings", "[common]") {
|
|
|
|
|
|
|
|
|
|
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);
|
|
|
|
|
mem.Map(0x4000, 0x10000, 0x2000, PERMS);
|
|
|
|
|
mem.Map(0x6000, 0x20000, 0x2000, PERMS);
|
|
|
|
|
|
|
|
|
|
volatile u8* const ptr = mem.VirtualBasePointer() + 0x4000;
|
|
|
|
|
ptr[0x0000] = 19;
|
|
|
|
|