mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	Merge pull request #938 from Subv/querymem
Kernel/SVC: Implemented svcQueryMemory.
This commit is contained in:
		
						commit
						41513cfb0c
					
				
					 2 changed files with 24 additions and 4 deletions
				
			
		|  | @ -87,8 +87,16 @@ template<ResultCode func(u32, s64)> void Wrap() { | |||
|     } | ||||
| } | ||||
| 
 | ||||
| template<ResultCode func(void*, void*, u32)> void Wrap(){ | ||||
|     FuncReturn(func(Memory::GetPointer(PARAM(0)), Memory::GetPointer(PARAM(1)), PARAM(2)).raw); | ||||
| template<ResultCode func(MemoryInfo*, PageInfo*, u32)> void Wrap() { | ||||
|     MemoryInfo memory_info = {}; | ||||
|     PageInfo page_info = {}; | ||||
|     u32 retval = func(&memory_info, &page_info, PARAM(2)).raw; | ||||
|     Core::g_app_core->SetReg(1, memory_info.base_address); | ||||
|     Core::g_app_core->SetReg(2, memory_info.size); | ||||
|     Core::g_app_core->SetReg(3, memory_info.permission); | ||||
|     Core::g_app_core->SetReg(4, memory_info.state); | ||||
|     Core::g_app_core->SetReg(5, page_info.flags); | ||||
|     FuncReturn(retval); | ||||
| } | ||||
| 
 | ||||
| template<ResultCode func(s32*, u32)> void Wrap(){ | ||||
|  |  | |||
|  | @ -22,6 +22,7 @@ | |||
| #include "core/hle/kernel/shared_memory.h" | ||||
| #include "core/hle/kernel/thread.h" | ||||
| #include "core/hle/kernel/timer.h" | ||||
| #include "core/hle/kernel/vm_manager.h" | ||||
| 
 | ||||
| #include "core/hle/function_wrappers.h" | ||||
| #include "core/hle/result.h" | ||||
|  | @ -530,8 +531,19 @@ static ResultCode ReleaseSemaphore(s32* count, Handle handle, s32 release_count) | |||
| } | ||||
| 
 | ||||
| /// Query memory
 | ||||
| static ResultCode QueryMemory(void* info, void* out, u32 addr) { | ||||
|     LOG_ERROR(Kernel_SVC, "(UNIMPLEMENTED) called addr=0x%08X", addr); | ||||
| static ResultCode QueryMemory(MemoryInfo* memory_info, PageInfo* page_info, u32 addr) { | ||||
|     auto vma = Kernel::g_current_process->address_space->FindVMA(addr); | ||||
| 
 | ||||
|     if (vma == Kernel::g_current_process->address_space->vma_map.end()) | ||||
|         return ResultCode(ErrorDescription::InvalidAddress, ErrorModule::OS, ErrorSummary::InvalidArgument, ErrorLevel::Usage); | ||||
| 
 | ||||
|     memory_info->base_address = vma->second.base; | ||||
|     memory_info->permission = static_cast<u32>(vma->second.permissions); | ||||
|     memory_info->size = vma->second.size; | ||||
|     memory_info->state = static_cast<u32>(vma->second.meminfo_state); | ||||
| 
 | ||||
|     page_info->flags = 0; | ||||
|     LOG_TRACE(Kernel_SVC, "called addr=0x%08X", addr); | ||||
|     return RESULT_SUCCESS; | ||||
| } | ||||
| 
 | ||||
|  |  | |||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue