mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 13:50:03 +00:00 
			
		
		
		
	IPC Helpers: Implement MappedBuffer translation helper for new interface
This commit is contained in:
		
							parent
							
								
									3ecf650bf9
								
							
						
					
					
						commit
						cef6b15de4
					
				
					 2 changed files with 26 additions and 7 deletions
				
			
		|  | @ -121,7 +121,11 @@ public: | ||||||
|     [[deprecated]] void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id); |     [[deprecated]] void PushStaticBuffer(VAddr buffer_vaddr, size_t size, u8 buffer_id); | ||||||
|     void PushStaticBuffer(const std::vector<u8>& buffer, u8 buffer_id); |     void PushStaticBuffer(const std::vector<u8>& buffer, u8 buffer_id); | ||||||
| 
 | 
 | ||||||
|     void PushMappedBuffer(VAddr buffer_vaddr, size_t size, MappedBufferPermissions perms); |     [[deprecated]] void PushMappedBuffer(VAddr buffer_vaddr, size_t size, | ||||||
|  |                                          MappedBufferPermissions perms); | ||||||
|  | 
 | ||||||
|  |     /// Pushes an HLE MappedBuffer interface back to unmapped the buffer.
 | ||||||
|  |     void PushMappedBuffer(const Kernel::MappedBuffer& mapped_buffer); | ||||||
| }; | }; | ||||||
| 
 | 
 | ||||||
| /// Push ///
 | /// Push ///
 | ||||||
|  | @ -213,6 +217,11 @@ inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, size_t size, | ||||||
|     Push(buffer_vaddr); |     Push(buffer_vaddr); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | inline void RequestBuilder::PushMappedBuffer(const Kernel::MappedBuffer& mapped_buffer) { | ||||||
|  |     Push(mapped_buffer.GenerateDescriptor()); | ||||||
|  |     Push(mapped_buffer.GetId()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| class RequestParser : public RequestHelperBase { | class RequestParser : public RequestHelperBase { | ||||||
| public: | public: | ||||||
|     RequestParser(Kernel::HLERequestContext& context, Header desired_header) |     RequestParser(Kernel::HLERequestContext& context, Header desired_header) | ||||||
|  | @ -333,8 +342,11 @@ public: | ||||||
|      * @param[out] buffer_perms If non-null, the pointed value will be set to the permissions of the |      * @param[out] buffer_perms If non-null, the pointed value will be set to the permissions of the | ||||||
|      * buffer |      * buffer | ||||||
|      */ |      */ | ||||||
|     VAddr PopMappedBuffer(size_t* data_size = nullptr, |     [[deprecated]] VAddr PopMappedBuffer(size_t* data_size, | ||||||
|                           MappedBufferPermissions* buffer_perms = nullptr); |                                          MappedBufferPermissions* buffer_perms = nullptr); | ||||||
|  | 
 | ||||||
|  |     /// Pops a mapped buffer descriptor with its vaddr and resolves it to an HLE interface
 | ||||||
|  |     Kernel::MappedBuffer& PopMappedBuffer(); | ||||||
| 
 | 
 | ||||||
|     /**
 |     /**
 | ||||||
|      * @brief Reads the next normal parameters as a struct, by copying it |      * @brief Reads the next normal parameters as a struct, by copying it | ||||||
|  | @ -497,4 +509,11 @@ inline VAddr RequestParser::PopMappedBuffer(size_t* data_size, | ||||||
|     return Pop<VAddr>(); |     return Pop<VAddr>(); | ||||||
| } | } | ||||||
| 
 | 
 | ||||||
|  | inline Kernel::MappedBuffer& RequestParser::PopMappedBuffer() { | ||||||
|  |     u32 mapped_buffer_descriptor = Pop<u32>(); | ||||||
|  |     ASSERT_MSG(GetDescriptorType(mapped_buffer_descriptor) == MappedBuffer, | ||||||
|  |                "Tried to pop mapped buffer but the descriptor is not a mapped buffer descriptor"); | ||||||
|  |     return context->GetMappedBuffer(Pop<u32>()); | ||||||
|  | } | ||||||
|  | 
 | ||||||
| } // namespace IPC
 | } // namespace IPC
 | ||||||
|  |  | ||||||
|  | @ -520,7 +520,7 @@ void DeleteContents(Service::Interface* self) { | ||||||
|     u8 media_type = rp.Pop<u8>(); |     u8 media_type = rp.Pop<u8>(); | ||||||
|     u64 title_id = rp.Pop<u64>(); |     u64 title_id = rp.Pop<u64>(); | ||||||
|     u32 content_count = rp.Pop<u32>(); |     u32 content_count = rp.Pop<u32>(); | ||||||
|     VAddr content_ids_in = rp.PopMappedBuffer(); |     VAddr content_ids_in = rp.PopMappedBuffer(nullptr); | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(1, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|  | @ -534,7 +534,7 @@ void GetProgramList(Service::Interface* self) { | ||||||
| 
 | 
 | ||||||
|     u32 count = rp.Pop<u32>(); |     u32 count = rp.Pop<u32>(); | ||||||
|     u8 media_type = rp.Pop<u8>(); |     u8 media_type = rp.Pop<u8>(); | ||||||
|     VAddr title_ids_output_pointer = rp.PopMappedBuffer(); |     VAddr title_ids_output_pointer = rp.PopMappedBuffer(nullptr); | ||||||
| 
 | 
 | ||||||
|     if (!Memory::IsValidVirtualAddress(title_ids_output_pointer) || media_type > 2) { |     if (!Memory::IsValidVirtualAddress(title_ids_output_pointer) || media_type > 2) { | ||||||
|         IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |         IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|  | @ -679,7 +679,7 @@ void ListDataTitleTicketInfos(Service::Interface* self) { | ||||||
|     u32 ticket_count = rp.Pop<u32>(); |     u32 ticket_count = rp.Pop<u32>(); | ||||||
|     u64 title_id = rp.Pop<u64>(); |     u64 title_id = rp.Pop<u64>(); | ||||||
|     u32 start_index = rp.Pop<u32>(); |     u32 start_index = rp.Pop<u32>(); | ||||||
|     VAddr ticket_info_out = rp.PopMappedBuffer(); |     VAddr ticket_info_out = rp.PopMappedBuffer(nullptr); | ||||||
|     VAddr ticket_info_write = ticket_info_out; |     VAddr ticket_info_write = ticket_info_out; | ||||||
| 
 | 
 | ||||||
|     for (u32 i = 0; i < ticket_count; i++) { |     for (u32 i = 0; i < ticket_count; i++) { | ||||||
|  | @ -754,7 +754,7 @@ void GetTicketList(Service::Interface* self) { | ||||||
|     IPC::RequestParser rp(Kernel::GetCommandBuffer(), 9, 2, 2); // 0x00090082
 |     IPC::RequestParser rp(Kernel::GetCommandBuffer(), 9, 2, 2); // 0x00090082
 | ||||||
|     u32 ticket_list_count = rp.Pop<u32>(); |     u32 ticket_list_count = rp.Pop<u32>(); | ||||||
|     u32 ticket_index = rp.Pop<u32>(); |     u32 ticket_index = rp.Pop<u32>(); | ||||||
|     VAddr ticket_tids_out = rp.PopMappedBuffer(); |     VAddr ticket_tids_out = rp.PopMappedBuffer(nullptr); | ||||||
| 
 | 
 | ||||||
|     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); |     IPC::RequestBuilder rb = rp.MakeBuilder(2, 0); | ||||||
|     rb.Push(RESULT_SUCCESS); |     rb.Push(RESULT_SUCCESS); | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue