From 567c3a2ee7162e0e62d5ecd511e6d137a6b217c2 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 1 May 2017 20:55:45 +0100 Subject: tests: Arm testing framework --- src/tests/core/arm/arm_test_common.cpp | 123 +++++++++++++++++++++++++++++++++ 1 file changed, 123 insertions(+) create mode 100644 src/tests/core/arm/arm_test_common.cpp (limited to 'src/tests/core/arm/arm_test_common.cpp') diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp new file mode 100644 index 000000000..1d41e3376 --- /dev/null +++ b/src/tests/core/arm/arm_test_common.cpp @@ -0,0 +1,123 @@ +// Copyright 2016 Citra Emulator Project +// Licensed under GPLv2 or any later version +// Refer to the license.txt file included. + +#include "core/core.h" +#include "core/memory_setup.h" +#include "tests/core/arm/arm_test_common.h" + +namespace ArmTests { + +TestEnvironment::TestEnvironment(bool mutable_memory_) + : mutable_memory(mutable_memory_), test_memory(std::make_shared(this)) { + Memory::MapIoRegion(0x00000000, 0x80000000, test_memory); + Memory::MapIoRegion(0x80000000, 0x80000000, test_memory); +} + +TestEnvironment::~TestEnvironment() { + Memory::UnmapRegion(0x80000000, 0x80000000); + Memory::UnmapRegion(0x00000000, 0x80000000); +} + +void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) { + SetMemory32(vaddr + 0, static_cast(value)); + SetMemory32(vaddr + 4, static_cast(value >> 32)); +} + +void TestEnvironment::SetMemory32(VAddr vaddr, u32 value) { + SetMemory16(vaddr + 0, static_cast(value)); + SetMemory16(vaddr + 2, static_cast(value >> 16)); +} + +void TestEnvironment::SetMemory16(VAddr vaddr, u16 value) { + SetMemory8(vaddr + 0, static_cast(value)); + SetMemory8(vaddr + 1, static_cast(value >> 8)); +} + +void TestEnvironment::SetMemory8(VAddr vaddr, u8 value) { + test_memory->data[vaddr] = value; +} + +std::vector TestEnvironment::GetWriteRecords() const { + return write_records; +} + +void TestEnvironment::ClearWriteRecords() { + write_records.clear(); +} + +TestEnvironment::TestMemory::~TestMemory() {} + +bool TestEnvironment::TestMemory::IsValidAddress(VAddr addr) { + return true; +} + +u8 TestEnvironment::TestMemory::Read8(VAddr addr) { + auto iter = data.find(addr); + if (iter == data.end()) { + return addr; // Some arbitrary data + } + return iter->second; +} + +u16 TestEnvironment::TestMemory::Read16(VAddr addr) { + return Read8(addr) | static_cast(Read8(addr + 1)) << 8; +} + +u32 TestEnvironment::TestMemory::Read32(VAddr addr) { + return Read16(addr) | static_cast(Read16(addr + 2)) << 16; +} + +u64 TestEnvironment::TestMemory::Read64(VAddr addr) { + return Read32(addr) | static_cast(Read32(addr + 4)) << 32; +} + +bool TestEnvironment::TestMemory::ReadBlock(VAddr src_addr, void* dest_buffer, size_t size) { + VAddr addr = src_addr; + u8* data = static_cast(dest_buffer); + + for (size_t i = 0; i < size; i++, addr++, data++) { + *data = Read8(addr); + } + + return true; +} + +void TestEnvironment::TestMemory::Write8(VAddr addr, u8 data) { + env->write_records.emplace_back(8, addr, data); + if (env->mutable_memory) + env->SetMemory8(addr, data); +} + +void TestEnvironment::TestMemory::Write16(VAddr addr, u16 data) { + env->write_records.emplace_back(16, addr, data); + if (env->mutable_memory) + env->SetMemory16(addr, data); +} + +void TestEnvironment::TestMemory::Write32(VAddr addr, u32 data) { + env->write_records.emplace_back(32, addr, data); + if (env->mutable_memory) + env->SetMemory32(addr, data); +} + +void TestEnvironment::TestMemory::Write64(VAddr addr, u64 data) { + env->write_records.emplace_back(64, addr, data); + if (env->mutable_memory) + env->SetMemory64(addr, data); +} + +bool TestEnvironment::TestMemory::WriteBlock(VAddr dest_addr, const void* src_buffer, size_t size) { + VAddr addr = dest_addr; + const u8* data = static_cast(src_buffer); + + for (size_t i = 0; i < size; i++, addr++, data++) { + env->write_records.emplace_back(8, addr, *data); + if (env->mutable_memory) + env->SetMemory8(addr, *data); + } + + return true; +} + +} // namespace ArmTests -- cgit v1.2.3 From a08edd67eb1c5ed3a348f38f0fd5f9ebc280f5a9 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Mon, 1 May 2017 22:11:06 +0100 Subject: tests: Add tests for vadd --- src/tests/core/arm/arm_test_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/tests/core/arm/arm_test_common.cpp') diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp index 1d41e3376..1df6c5677 100644 --- a/src/tests/core/arm/arm_test_common.cpp +++ b/src/tests/core/arm/arm_test_common.cpp @@ -9,7 +9,7 @@ namespace ArmTests { TestEnvironment::TestEnvironment(bool mutable_memory_) - : mutable_memory(mutable_memory_), test_memory(std::make_shared(this)) { + : mutable_memory(mutable_memory_), test_memory(std::make_shared(this)) { Memory::MapIoRegion(0x00000000, 0x80000000, test_memory); Memory::MapIoRegion(0x80000000, 0x80000000, test_memory); } -- cgit v1.2.3 From 3bde97ea059f7bff4e7ebbc59077a1211ae068f7 Mon Sep 17 00:00:00 2001 From: Subv Date: Mon, 7 Aug 2017 14:30:01 -0500 Subject: Tests/VFP: Use a standalone pagetable for the TestEnvironment memory operations. This fixes building the tests --- src/tests/core/arm/arm_test_common.cpp | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) (limited to 'src/tests/core/arm/arm_test_common.cpp') diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp index 1df6c5677..8384ce744 100644 --- a/src/tests/core/arm/arm_test_common.cpp +++ b/src/tests/core/arm/arm_test_common.cpp @@ -3,20 +3,30 @@ // Refer to the license.txt file included. #include "core/core.h" +#include "core/memory.h" #include "core/memory_setup.h" #include "tests/core/arm/arm_test_common.h" namespace ArmTests { +static Memory::PageTable page_table; + TestEnvironment::TestEnvironment(bool mutable_memory_) : mutable_memory(mutable_memory_), test_memory(std::make_shared(this)) { - Memory::MapIoRegion(0x00000000, 0x80000000, test_memory); - Memory::MapIoRegion(0x80000000, 0x80000000, test_memory); + + page_table.pointers.fill(nullptr); + page_table.attributes.fill(Memory::PageType::Unmapped); + page_table.cached_res_count.fill(0); + + Memory::MapIoRegion(page_table, 0x00000000, 0x80000000, test_memory); + Memory::MapIoRegion(page_table, 0x80000000, 0x80000000, test_memory); + + Memory::current_page_table = &page_table; } TestEnvironment::~TestEnvironment() { - Memory::UnmapRegion(0x80000000, 0x80000000); - Memory::UnmapRegion(0x00000000, 0x80000000); + Memory::UnmapRegion(page_table, 0x80000000, 0x80000000); + Memory::UnmapRegion(page_table, 0x00000000, 0x80000000); } void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) { -- cgit v1.2.3 From c02bbb7030efd072511bd0051a44d9e503016f74 Mon Sep 17 00:00:00 2001 From: MerryMage Date: Sun, 24 Sep 2017 22:42:42 +0100 Subject: memory: Add GetCurrentPageTable/SetCurrentPageTable Don't expose Memory::current_page_table as a global. --- src/tests/core/arm/arm_test_common.cpp | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) (limited to 'src/tests/core/arm/arm_test_common.cpp') diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp index 8384ce744..cfe0d503a 100644 --- a/src/tests/core/arm/arm_test_common.cpp +++ b/src/tests/core/arm/arm_test_common.cpp @@ -21,7 +21,7 @@ TestEnvironment::TestEnvironment(bool mutable_memory_) Memory::MapIoRegion(page_table, 0x00000000, 0x80000000, test_memory); Memory::MapIoRegion(page_table, 0x80000000, 0x80000000, test_memory); - Memory::current_page_table = &page_table; + Memory::SetCurrentPageTable(&page_table); } TestEnvironment::~TestEnvironment() { -- cgit v1.2.3 From c102e3ae282ae849667ae91f5f0213a80adf474f Mon Sep 17 00:00:00 2001 From: Subv Date: Tue, 26 Sep 2017 17:29:06 -0500 Subject: Tests: Fixed ARM VFP tests --- src/tests/core/arm/arm_test_common.cpp | 22 +++++++++++++--------- 1 file changed, 13 insertions(+), 9 deletions(-) (limited to 'src/tests/core/arm/arm_test_common.cpp') diff --git a/src/tests/core/arm/arm_test_common.cpp b/src/tests/core/arm/arm_test_common.cpp index cfe0d503a..484713a92 100644 --- a/src/tests/core/arm/arm_test_common.cpp +++ b/src/tests/core/arm/arm_test_common.cpp @@ -3,30 +3,34 @@ // Refer to the license.txt file included. #include "core/core.h" +#include "core/hle/kernel/process.h" #include "core/memory.h" #include "core/memory_setup.h" #include "tests/core/arm/arm_test_common.h" namespace ArmTests { -static Memory::PageTable page_table; +static Memory::PageTable* page_table = nullptr; TestEnvironment::TestEnvironment(bool mutable_memory_) : mutable_memory(mutable_memory_), test_memory(std::make_shared(this)) { - page_table.pointers.fill(nullptr); - page_table.attributes.fill(Memory::PageType::Unmapped); - page_table.cached_res_count.fill(0); + Kernel::g_current_process = Kernel::Process::Create(Kernel::CodeSet::Create("", 0)); + page_table = &Kernel::g_current_process->vm_manager.page_table; - Memory::MapIoRegion(page_table, 0x00000000, 0x80000000, test_memory); - Memory::MapIoRegion(page_table, 0x80000000, 0x80000000, test_memory); + page_table->pointers.fill(nullptr); + page_table->attributes.fill(Memory::PageType::Unmapped); + page_table->cached_res_count.fill(0); - Memory::SetCurrentPageTable(&page_table); + Memory::MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory); + Memory::MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory); + + Memory::SetCurrentPageTable(page_table); } TestEnvironment::~TestEnvironment() { - Memory::UnmapRegion(page_table, 0x80000000, 0x80000000); - Memory::UnmapRegion(page_table, 0x00000000, 0x80000000); + Memory::UnmapRegion(*page_table, 0x80000000, 0x80000000); + Memory::UnmapRegion(*page_table, 0x00000000, 0x80000000); } void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) { -- cgit v1.2.3