mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	ARM: pass MemorySystem separately in the constructor and make System optional
So that unit test can test CPU without constructing the entire system. Also remove hacks in the System class
This commit is contained in:
		
							parent
							
								
									9573ee46bd
								
							
						
					
					
						commit
						64f6e5e597
					
				
					 14 changed files with 80 additions and 65 deletions
				
			
		|  | @ -15,15 +15,9 @@ static Memory::PageTable* page_table = nullptr; | |||
| TestEnvironment::TestEnvironment(bool mutable_memory_) | ||||
|     : mutable_memory(mutable_memory_), test_memory(std::make_shared<TestMemory>(this)) { | ||||
| 
 | ||||
|     // HACK: some memory functions are currently referring kernel from the global instance,
 | ||||
|     //       so we need to create the kernel object there.
 | ||||
|     //       Change this when all global states are eliminated.
 | ||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||
|     Core::System::GetInstance().memory = std::make_unique<Memory::MemorySystem>(); | ||||
|     Memory::MemorySystem& memory = *Core::System::GetInstance().memory; | ||||
|     Core::System::GetInstance().kernel = std::make_unique<Kernel::KernelSystem>( | ||||
|         memory, *Core::System::GetInstance().timing, [] {}, 0); | ||||
|     kernel = Core::System::GetInstance().kernel.get(); | ||||
|     timing = std::make_unique<Core::Timing>(); | ||||
|     memory = std::make_unique<Memory::MemorySystem>(); | ||||
|     kernel = std::make_unique<Kernel::KernelSystem>(*memory, *timing, [] {}, 0); | ||||
| 
 | ||||
|     kernel->SetCurrentProcess(kernel->CreateProcess(kernel->CreateCodeSet("", 0))); | ||||
|     page_table = &kernel->GetCurrentProcess()->vm_manager.page_table; | ||||
|  | @ -31,17 +25,15 @@ TestEnvironment::TestEnvironment(bool mutable_memory_) | |||
|     page_table->pointers.fill(nullptr); | ||||
|     page_table->attributes.fill(Memory::PageType::Unmapped); | ||||
| 
 | ||||
|     memory.MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory); | ||||
|     memory.MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory); | ||||
|     memory->MapIoRegion(*page_table, 0x00000000, 0x80000000, test_memory); | ||||
|     memory->MapIoRegion(*page_table, 0x80000000, 0x80000000, test_memory); | ||||
| 
 | ||||
|     memory.SetCurrentPageTable(page_table); | ||||
|     memory->SetCurrentPageTable(page_table); | ||||
| } | ||||
| 
 | ||||
| TestEnvironment::~TestEnvironment() { | ||||
|     Memory::MemorySystem& memory = *Core::System::GetInstance().memory; | ||||
|     memory.UnmapRegion(*page_table, 0x80000000, 0x80000000); | ||||
|     memory.UnmapRegion(*page_table, 0x00000000, 0x80000000); | ||||
|     Core::System::GetInstance().kernel.reset(); | ||||
|     memory->UnmapRegion(*page_table, 0x80000000, 0x80000000); | ||||
|     memory->UnmapRegion(*page_table, 0x00000000, 0x80000000); | ||||
| } | ||||
| 
 | ||||
| void TestEnvironment::SetMemory64(VAddr vaddr, u64 value) { | ||||
|  |  | |||
|  | @ -49,6 +49,10 @@ public: | |||
|     /// Empties the internal write-record store.
 | ||||
|     void ClearWriteRecords(); | ||||
| 
 | ||||
|     Memory::MemorySystem& GetMemory() { | ||||
|         return *memory; | ||||
|     } | ||||
| 
 | ||||
| private: | ||||
|     friend struct TestMemory; | ||||
|     struct TestMemory final : Memory::MMIORegion { | ||||
|  | @ -80,7 +84,9 @@ private: | |||
|     std::shared_ptr<TestMemory> test_memory; | ||||
|     std::vector<WriteRecord> write_records; | ||||
| 
 | ||||
|     Kernel::KernelSystem* kernel; | ||||
|     std::unique_ptr<Core::Timing> timing; | ||||
|     std::unique_ptr<Memory::MemorySystem> memory; | ||||
|     std::unique_ptr<Kernel::KernelSystem> kernel; | ||||
| }; | ||||
| 
 | ||||
| } // namespace ArmTests
 | ||||
|  |  | |||
|  | @ -23,7 +23,7 @@ TEST_CASE("ARM_DynCom (vfp): vadd", "[arm_dyncom]") { | |||
|     test_env.SetMemory32(0, 0xEE321A03); // vadd.f32 s2, s4, s6
 | ||||
|     test_env.SetMemory32(4, 0xEAFFFFFE); // b +#0
 | ||||
| 
 | ||||
|     ARM_DynCom dyncom(Core::System::GetInstance(), USER32MODE); | ||||
|     ARM_DynCom dyncom(nullptr, test_env.GetMemory(), USER32MODE); | ||||
| 
 | ||||
|     std::vector<VfpTestCase> test_cases{{ | ||||
| #include "vfp_vadd_f32.inc" | ||||
|  |  | |||
|  | @ -21,10 +21,9 @@ static SharedPtr<Object> MakeObject(Kernel::KernelSystem& kernel) { | |||
| } | ||||
| 
 | ||||
| TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel]") { | ||||
|     // HACK: see comments of member timing
 | ||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||
|     auto memory = std::make_unique<Memory::MemorySystem>(); | ||||
|     Kernel::KernelSystem kernel(*memory, *Core::System::GetInstance().timing, [] {}, 0); | ||||
|     Core::Timing timing; | ||||
|     Memory::MemorySystem memory; | ||||
|     Kernel::KernelSystem kernel(memory, timing, [] {}, 0); | ||||
|     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); | ||||
|     HLERequestContext context(std::move(session)); | ||||
| 
 | ||||
|  | @ -234,10 +233,9 @@ TEST_CASE("HLERequestContext::PopulateFromIncomingCommandBuffer", "[core][kernel | |||
| } | ||||
| 
 | ||||
| TEST_CASE("HLERequestContext::WriteToOutgoingCommandBuffer", "[core][kernel]") { | ||||
|     // HACK: see comments of member timing
 | ||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||
|     auto memory = std::make_unique<Memory::MemorySystem>(); | ||||
|     Kernel::KernelSystem kernel(*memory, *Core::System::GetInstance().timing, [] {}, 0); | ||||
|     Core::Timing timing; | ||||
|     Memory::MemorySystem memory; | ||||
|     Kernel::KernelSystem kernel(memory, timing, [] {}, 0); | ||||
|     auto session = std::get<SharedPtr<ServerSession>>(kernel.CreateSessionPair()); | ||||
|     HLERequestContext context(std::move(session)); | ||||
| 
 | ||||
|  |  | |||
|  | @ -11,11 +11,9 @@ | |||
| #include "core/memory.h" | ||||
| 
 | ||||
| TEST_CASE("Memory::IsValidVirtualAddress", "[core][memory]") { | ||||
|     // HACK: see comments of member timing
 | ||||
|     Core::System::GetInstance().timing = std::make_unique<Core::Timing>(); | ||||
|     Core::System::GetInstance().memory = std::make_unique<Memory::MemorySystem>(); | ||||
|     Kernel::KernelSystem kernel(*Core::System::GetInstance().memory, | ||||
|                                 *Core::System::GetInstance().timing, [] {}, 0); | ||||
|     Core::Timing timing; | ||||
|     Memory::MemorySystem memory; | ||||
|     Kernel::KernelSystem kernel(memory, timing, [] {}, 0); | ||||
|     SECTION("these regions should not be mapped on an empty process") { | ||||
|         auto process = kernel.CreateProcess(kernel.CreateCodeSet("", 0)); | ||||
|         CHECK(Memory::IsValidVirtualAddress(*process, Memory::PROCESS_IMAGE_VADDR) == false); | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue