From 983c7088306532ed042925b02b29f90cfbb4dd86 Mon Sep 17 00:00:00 2001 From: plutoo Date: Sun, 24 Sep 2017 21:28:36 +0200 Subject: [PATCH] Ipc fixes --- nx/include/switch/ipc.h | 18 +++++++++++++++--- 1 file changed, 15 insertions(+), 3 deletions(-) diff --git a/nx/include/switch/ipc.h b/nx/include/switch/ipc.h index 1c46037c..e2dc2e88 100644 --- a/nx/include/switch/ipc.h +++ b/nx/include/switch/ipc.h @@ -156,9 +156,21 @@ static inline void* ipcPrepareHeader(IpcCommand* cmd, size_t sizeof_raw) { u32* raw = (u32*) (buf + padding); size_t raw_size = (sizeof_raw/4) + 4; - raw_size += ((cmd->NumStaticOut*2) + 3)/4; // todo: these contain u16 lengths for StaticOuts - buf += raw_size; + + u16* buf_u16 = (u16*) buf; + + for (i=0; iNumStaticOut; i++) { + size_t off = cmd->NumStaticIn + i; + size_t sz = (uintptr_t) cmd->StaticSizes[off]; + + buf_u16[i] = (sz > 0xFFFF) ? 0 : sz; + } + + size_t u16s_size = ((2*cmd->NumStaticOut) + 3)/4; + buf += u16s_size; + raw_size += u16s_size; + *fill_in_size_later |= raw_size; for (i=0; iNumStaticOut; i++, buf+=2) { @@ -219,7 +231,7 @@ static inline Result ipcParseResponse(IpcCommandResponse* r) { num_handles = 8; for (i=0; iHandles[i] = *(buf-i-1); + r->Handles[i] = *(buf-num_handles+i); r->NumHandles = num_handles; }