mirror of
				https://git.suyu.dev/suyu/suyu
				synced 2025-10-30 23:49:01 -05:00 
			
		
		
		
	core/memory: Migrate over Write{8, 16, 32, 64, Block} to the Memory class
The Write functions are used slightly less than the Read functions, which make these a bit nicer to move over. The only adjustments we really need to make here are to Dynarmic's exclusive monitor instance. We need to keep a reference to the currently active memory instance to perform exclusive read/write operations.
This commit is contained in:
		| @@ -78,7 +78,7 @@ ResultCode AddressArbiter::IncrementAndSignalToAddressIfEqual(VAddr address, s32 | ||||
|         return ERR_INVALID_STATE; | ||||
|     } | ||||
|  | ||||
|     Memory::Write32(address, static_cast<u32>(value + 1)); | ||||
|     memory.Write32(address, static_cast<u32>(value + 1)); | ||||
|     return SignalToAddressOnly(address, num_to_wake); | ||||
| } | ||||
|  | ||||
| @@ -117,7 +117,7 @@ ResultCode AddressArbiter::ModifyByWaitingCountAndSignalToAddressIfEqual(VAddr a | ||||
|         return ERR_INVALID_STATE; | ||||
|     } | ||||
|  | ||||
|     Memory::Write32(address, static_cast<u32>(updated_value)); | ||||
|     memory.Write32(address, static_cast<u32>(updated_value)); | ||||
|     WakeThreads(waiting_threads, num_to_wake); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| @@ -151,7 +151,7 @@ ResultCode AddressArbiter::WaitForAddressIfLessThan(VAddr address, s32 value, s6 | ||||
|     } | ||||
|  | ||||
|     if (should_decrement) { | ||||
|         Memory::Write32(address, static_cast<u32>(cur_value - 1)); | ||||
|         memory.Write32(address, static_cast<u32>(cur_value - 1)); | ||||
|     } | ||||
|  | ||||
|     // Short-circuit without rescheduling, if timeout is zero. | ||||
|   | ||||
| @@ -274,8 +274,8 @@ ResultCode HLERequestContext::WriteToOutgoingCommandBuffer(Thread& thread) { | ||||
|     } | ||||
|  | ||||
|     // Copy the translated command buffer back into the thread's command buffer area. | ||||
|     Memory::WriteBlock(owner_process, thread.GetTLSAddress(), dst_cmdbuf.data(), | ||||
|                        dst_cmdbuf.size() * sizeof(u32)); | ||||
|     memory.WriteBlock(owner_process, thread.GetTLSAddress(), dst_cmdbuf.data(), | ||||
|                       dst_cmdbuf.size() * sizeof(u32)); | ||||
|  | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| @@ -311,10 +311,11 @@ std::size_t HLERequestContext::WriteBuffer(const void* buffer, std::size_t size, | ||||
|         size = buffer_size; // TODO(bunnei): This needs to be HW tested | ||||
|     } | ||||
|  | ||||
|     auto& memory = Core::System::GetInstance().Memory(); | ||||
|     if (is_buffer_b) { | ||||
|         Memory::WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); | ||||
|         memory.WriteBlock(BufferDescriptorB()[buffer_index].Address(), buffer, size); | ||||
|     } else { | ||||
|         Memory::WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); | ||||
|         memory.WriteBlock(BufferDescriptorC()[buffer_index].Address(), buffer, size); | ||||
|     } | ||||
|  | ||||
|     return size; | ||||
|   | ||||
| @@ -117,7 +117,7 @@ ResultCode Mutex::Release(VAddr address) { | ||||
|  | ||||
|     // There are no more threads waiting for the mutex, release it completely. | ||||
|     if (thread == nullptr) { | ||||
|         Memory::Write32(address, 0); | ||||
|         system.Memory().Write32(address, 0); | ||||
|         return RESULT_SUCCESS; | ||||
|     } | ||||
|  | ||||
| @@ -132,7 +132,7 @@ ResultCode Mutex::Release(VAddr address) { | ||||
|     } | ||||
|  | ||||
|     // Grant the mutex to the next waiting thread and resume it. | ||||
|     Memory::Write32(address, mutex_value); | ||||
|     system.Memory().Write32(address, mutex_value); | ||||
|  | ||||
|     ASSERT(thread->GetStatus() == ThreadStatus::WaitMutex); | ||||
|     thread->ResumeFromWait(); | ||||
|   | ||||
| @@ -1120,7 +1120,7 @@ static ResultCode GetThreadContext(Core::System& system, VAddr thread_context, H | ||||
|         std::fill(ctx.vector_registers.begin() + 16, ctx.vector_registers.end(), u128{}); | ||||
|     } | ||||
|  | ||||
|     Memory::WriteBlock(thread_context, &ctx, sizeof(ctx)); | ||||
|     system.Memory().WriteBlock(thread_context, &ctx, sizeof(ctx)); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
|  | ||||
| @@ -1280,20 +1280,21 @@ static ResultCode QueryProcessMemory(Core::System& system, VAddr memory_info_add | ||||
|         return ERR_INVALID_HANDLE; | ||||
|     } | ||||
|  | ||||
|     auto& memory = system.Memory(); | ||||
|     const auto& vm_manager = process->VMManager(); | ||||
|     const MemoryInfo memory_info = vm_manager.QueryMemory(address); | ||||
|  | ||||
|     Memory::Write64(memory_info_address, memory_info.base_address); | ||||
|     Memory::Write64(memory_info_address + 8, memory_info.size); | ||||
|     Memory::Write32(memory_info_address + 16, memory_info.state); | ||||
|     Memory::Write32(memory_info_address + 20, memory_info.attributes); | ||||
|     Memory::Write32(memory_info_address + 24, memory_info.permission); | ||||
|     Memory::Write32(memory_info_address + 32, memory_info.ipc_ref_count); | ||||
|     Memory::Write32(memory_info_address + 28, memory_info.device_ref_count); | ||||
|     Memory::Write32(memory_info_address + 36, 0); | ||||
|     memory.Write64(memory_info_address, memory_info.base_address); | ||||
|     memory.Write64(memory_info_address + 8, memory_info.size); | ||||
|     memory.Write32(memory_info_address + 16, memory_info.state); | ||||
|     memory.Write32(memory_info_address + 20, memory_info.attributes); | ||||
|     memory.Write32(memory_info_address + 24, memory_info.permission); | ||||
|     memory.Write32(memory_info_address + 32, memory_info.ipc_ref_count); | ||||
|     memory.Write32(memory_info_address + 28, memory_info.device_ref_count); | ||||
|     memory.Write32(memory_info_address + 36, 0); | ||||
|  | ||||
|     // Page info appears to be currently unused by the kernel and is always set to zero. | ||||
|     Memory::Write32(page_info_address, 0); | ||||
|     memory.Write32(page_info_address, 0); | ||||
|  | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| @@ -2290,12 +2291,13 @@ static ResultCode GetProcessList(Core::System& system, u32* out_num_processes, | ||||
|         return ERR_INVALID_ADDRESS_STATE; | ||||
|     } | ||||
|  | ||||
|     auto& memory = system.Memory(); | ||||
|     const auto& process_list = kernel.GetProcessList(); | ||||
|     const auto num_processes = process_list.size(); | ||||
|     const auto copy_amount = std::min(std::size_t{out_process_ids_size}, num_processes); | ||||
|  | ||||
|     for (std::size_t i = 0; i < copy_amount; ++i) { | ||||
|         Memory::Write64(out_process_ids, process_list[i]->GetProcessID()); | ||||
|         memory.Write64(out_process_ids, process_list[i]->GetProcessID()); | ||||
|         out_process_ids += sizeof(u64); | ||||
|     } | ||||
|  | ||||
| @@ -2329,13 +2331,14 @@ static ResultCode GetThreadList(Core::System& system, u32* out_num_threads, VAdd | ||||
|         return ERR_INVALID_ADDRESS_STATE; | ||||
|     } | ||||
|  | ||||
|     auto& memory = system.Memory(); | ||||
|     const auto& thread_list = current_process->GetThreadList(); | ||||
|     const auto num_threads = thread_list.size(); | ||||
|     const auto copy_amount = std::min(std::size_t{out_thread_ids_size}, num_threads); | ||||
|  | ||||
|     auto list_iter = thread_list.cbegin(); | ||||
|     for (std::size_t i = 0; i < copy_amount; ++i, ++list_iter) { | ||||
|         Memory::Write64(out_thread_ids, (*list_iter)->GetThreadID()); | ||||
|         memory.Write64(out_thread_ids, (*list_iter)->GetThreadID()); | ||||
|         out_thread_ids += sizeof(u64); | ||||
|     } | ||||
|  | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Lioncash
					Lioncash