mirror of
				https://github.com/PabloMK7/citra.git
				synced 2025-10-31 05:40:04 +00:00 
			
		
		
		
	IPC: Add basic HLERequestContext support to RequestParser/Builder
This commit is contained in:
		
							parent
							
								
									05fee70211
								
							
						
					
					
						commit
						1c4b0ebb1f
					
				
					 1 changed files with 32 additions and 1 deletions
				
			
		|  | @ -6,17 +6,22 @@ | ||||||
| 
 | 
 | ||||||
| #include "core/hle/ipc.h" | #include "core/hle/ipc.h" | ||||||
| #include "core/hle/kernel/handle_table.h" | #include "core/hle/kernel/handle_table.h" | ||||||
|  | #include "core/hle/kernel/hle_ipc.h" | ||||||
| #include "core/hle/kernel/kernel.h" | #include "core/hle/kernel/kernel.h" | ||||||
| 
 | 
 | ||||||
| namespace IPC { | namespace IPC { | ||||||
| 
 | 
 | ||||||
| class RequestHelperBase { | class RequestHelperBase { | ||||||
| protected: | protected: | ||||||
|  |     Kernel::HLERequestContext* context = nullptr; | ||||||
|     u32* cmdbuf; |     u32* cmdbuf; | ||||||
|     ptrdiff_t index = 1; |     ptrdiff_t index = 1; | ||||||
|     Header header; |     Header header; | ||||||
| 
 | 
 | ||||||
| public: | public: | ||||||
|  |     RequestHelperBase(Kernel::HLERequestContext& context, Header desired_header) | ||||||
|  |         : context(&context), cmdbuf(context.CommandBuffer()), header(desired_header) {} | ||||||
|  | 
 | ||||||
|     RequestHelperBase(u32* command_buffer, Header command_header) |     RequestHelperBase(u32* command_buffer, Header command_header) | ||||||
|         : cmdbuf(command_buffer), header(command_header) {} |         : cmdbuf(command_buffer), header(command_header) {} | ||||||
| 
 | 
 | ||||||
|  | @ -51,12 +56,24 @@ public: | ||||||
| 
 | 
 | ||||||
| class RequestBuilder : public RequestHelperBase { | class RequestBuilder : public RequestHelperBase { | ||||||
| public: | public: | ||||||
|  |     RequestBuilder(Kernel::HLERequestContext& context, Header command_header) | ||||||
|  |         : RequestHelperBase(context, command_header) { | ||||||
|  |         cmdbuf[0] = header.raw; | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|  |     RequestBuilder(Kernel::HLERequestContext& context, u16 command_id, unsigned normal_params_size, | ||||||
|  |                    unsigned translate_params_size) | ||||||
|  |         : RequestBuilder( | ||||||
|  |               context, Header{MakeHeader(command_id, normal_params_size, translate_params_size)}) {} | ||||||
|  | 
 | ||||||
|     RequestBuilder(u32* command_buffer, Header command_header) |     RequestBuilder(u32* command_buffer, Header command_header) | ||||||
|         : RequestHelperBase(command_buffer, command_header) { |         : RequestHelperBase(command_buffer, command_header) { | ||||||
|         cmdbuf[0] = header.raw; |         cmdbuf[0] = header.raw; | ||||||
|     } |     } | ||||||
|  | 
 | ||||||
|     explicit RequestBuilder(u32* command_buffer, u32 command_header) |     explicit RequestBuilder(u32* command_buffer, u32 command_header) | ||||||
|         : RequestBuilder(command_buffer, Header{command_header}) {} |         : RequestBuilder(command_buffer, Header{command_header}) {} | ||||||
|  | 
 | ||||||
|     RequestBuilder(u32* command_buffer, u16 command_id, unsigned normal_params_size, |     RequestBuilder(u32* command_buffer, u16 command_id, unsigned normal_params_size, | ||||||
|                    unsigned translate_params_size) |                    unsigned translate_params_size) | ||||||
|         : RequestBuilder(command_buffer, |         : RequestBuilder(command_buffer, | ||||||
|  | @ -171,10 +188,21 @@ inline void RequestBuilder::PushMappedBuffer(VAddr buffer_vaddr, u32 size, | ||||||
| 
 | 
 | ||||||
| class RequestParser : public RequestHelperBase { | class RequestParser : public RequestHelperBase { | ||||||
| public: | public: | ||||||
|  |     RequestParser(Kernel::HLERequestContext& context, Header desired_header) | ||||||
|  |         : RequestHelperBase(context, desired_header) {} | ||||||
|  | 
 | ||||||
|  |     RequestParser(Kernel::HLERequestContext& context, u16 command_id, unsigned normal_params_size, | ||||||
|  |                   unsigned translate_params_size) | ||||||
|  |         : RequestParser(context, | ||||||
|  |                         Header{MakeHeader(command_id, normal_params_size, translate_params_size)}) { | ||||||
|  |     } | ||||||
|  | 
 | ||||||
|     RequestParser(u32* command_buffer, Header command_header) |     RequestParser(u32* command_buffer, Header command_header) | ||||||
|         : RequestHelperBase(command_buffer, command_header) {} |         : RequestHelperBase(command_buffer, command_header) {} | ||||||
|  | 
 | ||||||
|     explicit RequestParser(u32* command_buffer, u32 command_header) |     explicit RequestParser(u32* command_buffer, u32 command_header) | ||||||
|         : RequestParser(command_buffer, Header{command_header}) {} |         : RequestParser(command_buffer, Header{command_header}) {} | ||||||
|  | 
 | ||||||
|     RequestParser(u32* command_buffer, u16 command_id, unsigned normal_params_size, |     RequestParser(u32* command_buffer, u16 command_id, unsigned normal_params_size, | ||||||
|                   unsigned translate_params_size) |                   unsigned translate_params_size) | ||||||
|         : RequestParser(command_buffer, |         : RequestParser(command_buffer, | ||||||
|  | @ -186,6 +214,9 @@ public: | ||||||
|             ValidateHeader(); |             ValidateHeader(); | ||||||
|         Header builderHeader{ |         Header builderHeader{ | ||||||
|             MakeHeader(header.command_id, normal_params_size, translate_params_size)}; |             MakeHeader(header.command_id, normal_params_size, translate_params_size)}; | ||||||
|  |         if (context != nullptr) | ||||||
|  |             return {*context, builderHeader}; | ||||||
|  |         else | ||||||
|             return {cmdbuf, builderHeader}; |             return {cmdbuf, builderHeader}; | ||||||
|     } |     } | ||||||
| 
 | 
 | ||||||
|  |  | ||||||
		Loading…
	
	Add table
		Add a link
		
	
		Reference in a new issue