sf: add serialization fixes necessary for htcs

This commit is contained in:
Michael Scire 2021-02-20 03:01:43 -08:00
parent d4542ec9b0
commit f3fb9b8f7b
2 changed files with 29 additions and 16 deletions

View File

@ -225,25 +225,25 @@ NX_CONSTEXPR void cmifRequestOutPointer(CmifRequest* req, void* buffer, size_t s
*req->out_pointer_sizes++ = size; *req->out_pointer_sizes++ = size;
} }
NX_CONSTEXPR void cmifRequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size) NX_CONSTEXPR void cmifRequestInAutoBuffer(CmifRequest* req, const void* buffer, size_t size, HipcBufferMode mode)
{ {
if (req->server_pointer_size && size <= req->server_pointer_size) { if (req->server_pointer_size && size <= req->server_pointer_size) {
cmifRequestInPointer(req, buffer, size); cmifRequestInPointer(req, buffer, size);
cmifRequestInBuffer(req, NULL, 0, HipcBufferMode_Normal); cmifRequestInBuffer(req, NULL, 0, mode);
} else { } else {
cmifRequestInPointer(req, NULL, 0); cmifRequestInPointer(req, NULL, 0);
cmifRequestInBuffer(req, buffer, size, HipcBufferMode_Normal); cmifRequestInBuffer(req, buffer, size, mode);
} }
} }
NX_CONSTEXPR void cmifRequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size) NX_CONSTEXPR void cmifRequestOutAutoBuffer(CmifRequest* req, void* buffer, size_t size, HipcBufferMode mode)
{ {
if (req->server_pointer_size && size <= req->server_pointer_size) { if (req->server_pointer_size && size <= req->server_pointer_size) {
cmifRequestOutPointer(req, buffer, size); cmifRequestOutPointer(req, buffer, size);
cmifRequestOutBuffer(req, NULL, 0, HipcBufferMode_Normal); cmifRequestOutBuffer(req, NULL, 0, mode);
} else { } else {
cmifRequestOutPointer(req, NULL, 0); cmifRequestOutPointer(req, NULL, 0);
cmifRequestOutBuffer(req, buffer, size, HipcBufferMode_Normal); cmifRequestOutBuffer(req, buffer, size, mode);
} }
} }

View File

@ -150,10 +150,14 @@ NX_INLINE void serviceCreate(Service* s, Handle h)
*/ */
NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Handle h) NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Handle h)
{ {
s->session = h; if (h != INVALID_HANDLE) {
s->own_handle = 1; s->session = h;
s->object_id = 0; s->own_handle = 1;
s->pointer_buffer_size = parent->pointer_buffer_size; s->object_id = 0;
s->pointer_buffer_size = parent->pointer_buffer_size;
} else {
*s = (Service){};
}
} }
/** /**
@ -164,10 +168,14 @@ NX_INLINE void serviceCreateNonDomainSubservice(Service* s, Service* parent, Han
*/ */
NX_CONSTEXPR void serviceCreateDomainSubservice(Service* s, Service* parent, u32 object_id) NX_CONSTEXPR void serviceCreateDomainSubservice(Service* s, Service* parent, u32 object_id)
{ {
s->session = parent->session; if (object_id != 0) {
s->own_handle = 0; s->session = parent->session;
s->object_id = object_id; s->own_handle = 0;
s->pointer_buffer_size = parent->pointer_buffer_size; s->object_id = object_id;
s->pointer_buffer_size = parent->pointer_buffer_size;
} else {
*s = (Service){};
}
} }
/** /**
@ -293,10 +301,15 @@ NX_CONSTEXPR void _serviceRequestProcessBuffer(CmifRequest* req, const SfBuffer*
const bool is_out = (attr & SfBufferAttr_Out); const bool is_out = (attr & SfBufferAttr_Out);
if (attr & SfBufferAttr_HipcAutoSelect) { if (attr & SfBufferAttr_HipcAutoSelect) {
HipcBufferMode mode = HipcBufferMode_Normal;
if (attr & SfBufferAttr_HipcMapTransferAllowsNonSecure)
mode = HipcBufferMode_NonSecure;
if (attr & SfBufferAttr_HipcMapTransferAllowsNonDevice)
mode = HipcBufferMode_NonDevice;
if (is_in) if (is_in)
cmifRequestInAutoBuffer(req, buf->ptr, buf->size); cmifRequestInAutoBuffer(req, buf->ptr, buf->size, mode);
if (is_out) if (is_out)
cmifRequestOutAutoBuffer(req, (void*)buf->ptr, buf->size); cmifRequestOutAutoBuffer(req, (void*)buf->ptr, buf->size, mode);
} else if (attr & SfBufferAttr_HipcPointer) { } else if (attr & SfBufferAttr_HipcPointer) {
if (is_in) if (is_in)
cmifRequestInPointer(req, buf->ptr, buf->size); cmifRequestInPointer(req, buf->ptr, buf->size);