From c3b920d210c185beef36db7d7a3cee154e3afde6 Mon Sep 17 00:00:00 2001 From: fincs Date: Fri, 20 Sep 2019 01:48:10 +0200 Subject: [PATCH] cmif/service: Support passing optional 5.0.0+ context data to requests --- nx/include/switch/sf/cmif.h | 8 ++++---- nx/include/switch/sf/service.h | 6 ++++-- 2 files changed, 8 insertions(+), 6 deletions(-) diff --git a/nx/include/switch/sf/cmif.h b/nx/include/switch/sf/cmif.h index b5b4c28e..c38c2e23 100644 --- a/nx/include/switch/sf/cmif.h +++ b/nx/include/switch/sf/cmif.h @@ -112,7 +112,7 @@ NX_CONSTEXPR CmifRequest cmifMakeRequest(void* base, CmifRequestFormat fmt) CmifRequest req = {}; req.hipc = hipcMakeRequestInline(base, - .type = CmifCommandType_Request, + .type = fmt.context ? CmifCommandType_RequestWithContext : CmifCommandType_Request, .num_send_statics = fmt.num_in_auto_buffers + fmt.num_in_pointers, .num_send_buffers = fmt.num_in_auto_buffers + fmt.num_in_buffers, .num_recv_buffers = fmt.num_out_auto_buffers + fmt.num_out_buffers, @@ -135,7 +135,7 @@ NX_CONSTEXPR CmifRequest cmifMakeRequest(void* base, CmifRequestFormat fmt) .data_size = (u16)payload_size, .object_id = fmt.object_id, .padding = 0, - .token = 0, + .token = fmt.context, }; hdr = (CmifInHeader*)(domain_hdr+1); req.objects = (u32*)((u8*)hdr + payload_size); @@ -144,9 +144,9 @@ NX_CONSTEXPR CmifRequest cmifMakeRequest(void* base, CmifRequestFormat fmt) *hdr = (CmifInHeader){ .magic = CMIF_IN_HEADER_MAGIC, - .version = 0, + .version = fmt.context ? 1 : 0, .command_id = fmt.request_id, - .token = 0, + .token = fmt.object_id ? 0 : fmt.context, }; req.data = hdr+1; diff --git a/nx/include/switch/sf/service.h b/nx/include/switch/sf/service.h index 625fbba1..f7cf0c8a 100644 --- a/nx/include/switch/sf/service.h +++ b/nx/include/switch/sf/service.h @@ -68,6 +68,7 @@ typedef struct SfOutHandleAttrs typedef struct SfDispatchParams { Handle target_session; + u32 context; SfBufferAttrs buffer_attrs; SfBuffer buffers[8]; @@ -305,7 +306,7 @@ NX_CONSTEXPR void _serviceRequestProcessBuffer(CmifRequest* req, const SfBuffer* } NX_INLINE void* serviceMakeRequest( - Service* s, u32 request_id, u32 data_size, bool send_pid, + Service* s, u32 request_id, u32 context, u32 data_size, bool send_pid, const SfBufferAttrs buffer_attrs, const SfBuffer* buffers, u32 num_objects, const Service* const* objects, u32 num_handles, const Handle* handles @@ -318,6 +319,7 @@ NX_INLINE void* serviceMakeRequest( CmifRequestFormat fmt = {}; fmt.object_id = s->object_id; fmt.request_id = request_id; + fmt.context = context; fmt.data_size = data_size; fmt.server_pointer_size = s->pointer_buffer_size; fmt.num_objects = num_objects; @@ -416,7 +418,7 @@ NX_INLINE Result serviceDispatchImpl( SfDispatchParams disp ) { - void* in = serviceMakeRequest(s, request_id, + void* in = serviceMakeRequest(s, request_id, disp.context, in_data_size, disp.in_send_pid, disp.buffer_attrs, disp.buffers, disp.in_num_objects, disp.in_objects,