From 594929189d1a25e1e6a7fff47c493fd4ccc2c096 Mon Sep 17 00:00:00 2001 From: Michael Scire Date: Mon, 30 Nov 2020 22:11:08 -0800 Subject: [PATCH] ldr: update SetProgramArguments for 11.0.0 abi change --- nx/source/services/ldr.c | 19 +++++++++++++++++-- 1 file changed, 17 insertions(+), 2 deletions(-) diff --git a/nx/source/services/ldr.c b/nx/source/services/ldr.c index e2fb271a..bcc7b94f 100644 --- a/nx/source/services/ldr.c +++ b/nx/source/services/ldr.c @@ -24,7 +24,7 @@ LDR_GENERATE_SERVICE_INIT(Shell, shel); LDR_GENERATE_SERVICE_INIT(Dmnt, dmnt); LDR_GENERATE_SERVICE_INIT(Pm, pm); -static Result _ldrSetProgramArguments(Service* srv, u64 program_id, const void *args, size_t args_size) { +static Result _ldrSetProgramArgumentsDeprecated(Service* srv, u64 program_id, const void *args, size_t args_size) { const struct { u32 args_size; u32 pad; @@ -37,6 +37,21 @@ static Result _ldrSetProgramArguments(Service* srv, u64 program_id, const void * ); } +static Result _ldrSetProgramArgumentsModern(Service* srv, u64 program_id, const void *args, size_t args_size) { + return serviceDispatchIn(srv, 0, program_id, + .buffer_attrs = { SfBufferAttr_In | SfBufferAttr_HipcPointer }, + .buffers = { { args, args_size } }, + ); +} + +static Result _ldrSetProgramArguments(Service* srv, u64 program_id, const void *args, size_t args_size) { + if (hosversionAtLeast(11,0,0)) { + return _ldrSetProgramArgumentsModern(srv, program_id, args, args_size); + } else { + return _ldrSetProgramArgumentsDeprecated(srv, program_id, args, args_size); + } +} + static Result _ldrFlushArguments(Service* srv) { return serviceDispatch(srv, 1); } @@ -50,7 +65,7 @@ Result ldrShellFlushArguments(void) { } Result ldrDmntSetProgramArguments(u64 program_id, const void *args, size_t args_size) { - return _ldrSetProgramArguments(&g_ldrDmntSrv, program_id, args, args_size); + return _ldrSetProgramArguments(&g_ldrShellSrv, program_id, args, args_size); } Result ldrDmntFlushArguments(void) {