@ -1,3 +1,6 @@
// SPDX-FileCopyrightText: Copyright 2026 Eden Emulator Project
// SPDX-License-Identifier: GPL-3.0-or-later
// SPDX-FileCopyrightText: Copyright 2021 yuzu Emulator Project
// SPDX-License-Identifier: GPL-2.0-or-later
@ -15,12 +18,19 @@ static constexpr auto PERMS = Common::MemoryPermission::ReadWrite;
static constexpr auto HEAP = false ;
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] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x5000 , 0x8000 , 0x1000 , PERMS , HEAP ) ;
volatile u8 * const data = mem . VirtualBasePointer ( ) + 0x5000 ;
@ -30,6 +40,7 @@ TEST_CASE("HostMemory: Simple map", "[common]") {
TEST_CASE ( " HostMemory: Simple mirror map " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x5000 , 0x3000 , 0x2000 , PERMS , HEAP ) ;
mem . Map ( 0x8000 , 0x4000 , 0x1000 , PERMS , HEAP ) ;
@ -41,6 +52,7 @@ TEST_CASE("HostMemory: Simple mirror map", "[common]") {
TEST_CASE ( " HostMemory: Simple unmap " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x5000 , 0x3000 , 0x2000 , PERMS , HEAP ) ;
volatile u8 * const data = mem . VirtualBasePointer ( ) + 0x5000 ;
@ -52,6 +64,7 @@ TEST_CASE("HostMemory: Simple unmap", "[common]") {
TEST_CASE ( " HostMemory: Simple unmap and remap " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x5000 , 0x3000 , 0x2000 , PERMS , HEAP ) ;
volatile u8 * const data = mem . VirtualBasePointer ( ) + 0x5000 ;
@ -69,6 +82,7 @@ TEST_CASE("HostMemory: Simple unmap and remap", "[common]") {
TEST_CASE ( " HostMemory: Nieche allocation " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x0000 , 0 , 0x20000 , PERMS , HEAP ) ;
mem . Unmap ( 0x0000 , 0x4000 , HEAP ) ;
mem . Map ( 0x1000 , 0 , 0x2000 , PERMS , HEAP ) ;
@ -78,6 +92,7 @@ TEST_CASE("HostMemory: Nieche allocation", "[common]") {
TEST_CASE ( " HostMemory: Full unmap " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x8000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Unmap ( 0x8000 , 0x4000 , HEAP ) ;
mem . Map ( 0x6000 , 0 , 0x16000 , PERMS , HEAP ) ;
@ -85,6 +100,7 @@ TEST_CASE("HostMemory: Full unmap", "[common]") {
TEST_CASE ( " HostMemory: Right out of bounds unmap " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x0000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Unmap ( 0x2000 , 0x4000 , HEAP ) ;
mem . Map ( 0x2000 , 0x80000 , 0x4000 , PERMS , HEAP ) ;
@ -92,6 +108,7 @@ TEST_CASE("HostMemory: Right out of bounds unmap", "[common]") {
TEST_CASE ( " HostMemory: Left out of bounds unmap " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
mem . Map ( 0x8000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Unmap ( 0x6000 , 0x4000 , HEAP ) ;
mem . Map ( 0x8000 , 0 , 0x2000 , PERMS , HEAP ) ;
@ -99,6 +116,7 @@ TEST_CASE("HostMemory: Left out of bounds unmap", "[common]") {
TEST_CASE ( " HostMemory: Multiple placeholder unmap " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x0000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Map ( 0x4000 , 0 , 0x1b000 , PERMS , HEAP ) ;
mem . Unmap ( 0x3000 , 0x1c000 , HEAP ) ;
@ -107,6 +125,7 @@ TEST_CASE("HostMemory: Multiple placeholder unmap", "[common]") {
TEST_CASE ( " HostMemory: Unmap between placeholders " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x0000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Map ( 0x4000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Unmap ( 0x2000 , 0x4000 , HEAP ) ;
@ -115,6 +134,7 @@ TEST_CASE("HostMemory: Unmap between placeholders", "[common]") {
TEST_CASE ( " HostMemory: Unmap to origin " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x4000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Map ( 0x8000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Unmap ( 0x4000 , 0x4000 , HEAP ) ;
@ -124,6 +144,7 @@ TEST_CASE("HostMemory: Unmap to origin", "[common]") {
TEST_CASE ( " HostMemory: Unmap to right " , " [common] " ) {
HostMemory mem ( BACKING_SIZE , VIRTUAL_SIZE ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x4000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Map ( 0x8000 , 0 , 0x4000 , PERMS , HEAP ) ;
mem . Unmap ( 0x8000 , 0x4000 , HEAP ) ;
@ -132,6 +153,7 @@ TEST_CASE("HostMemory: Unmap to right", "[common]") {
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 ;
@ -144,6 +166,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 ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x4000 , 0x10000 , 0x4000 , PERMS , HEAP ) ;
volatile u8 * const ptr = mem . VirtualBasePointer ( ) + 0x4000 ;
@ -158,6 +181,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 ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x4000 , 0x10000 , 0x4000 , PERMS , HEAP ) ;
volatile u8 * const ptr = mem . VirtualBasePointer ( ) + 0x4000 ;
@ -172,6 +196,7 @@ 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 ) ;
REQUIRE ( mem . BackingBasePointer ( ) ! = nullptr ) ;
mem . Map ( 0x4000 , 0x10000 , 0x2000 , PERMS , HEAP ) ;
mem . Map ( 0x6000 , 0x20000 , 0x2000 , PERMS , HEAP ) ;