diff --git a/crt0/switch_crt0.s b/crt0/switch_crt0.s index b8f04ac3..55b790d3 100644 --- a/crt0/switch_crt0.s +++ b/crt0/switch_crt0.s @@ -34,10 +34,9 @@ bss_loop: add x0, x0, x30 // relocate ptr got_loop: - ldr x2, [x0] - ldr x3, [x2] + ldr x3, [x0] add x3, x3, x30 - str x3, [x2] + str x3, [x0], #8 subs x1, x1, #8 bne got_loop @@ -45,6 +44,7 @@ got_loop: mov x1, #0 // argv ldr x3, =main + add x3, x3, x30 blr x3 _sysexit: diff --git a/nx/include/switch/svc.h b/nx/include/switch/svc.h index 609655ea..e217cca6 100644 --- a/nx/include/switch/svc.h +++ b/nx/include/switch/svc.h @@ -18,8 +18,11 @@ static inline void* armGetTls(void) { return ret; } +Result svcCloseHandle(Handle handle); +Result svcWaitSynchronization(s32* index, const Handle* handles, s32 handleCount, u64 timeout); Result svcConnectToNamedPort(Handle* session, const char* name); Result svcSendSyncRequest(Handle session); Result svcBreak(u32 BreakReason, u64 inval1, u64 inval2); +Result svcAcceptSession(Handle *session_handle, Handle port_handle); Result svcReplyAndReceive(s32* index, const Handle* handles, s32 handleCount, Handle replyTarget, u64 timeout); Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions); diff --git a/nx/source/svc.s b/nx/source/svc.s index 69bdcbd5..6fbc93e3 100644 --- a/nx/source/svc.s +++ b/nx/source/svc.s @@ -11,6 +11,19 @@ .cfi_endproc .endm +SVC_BEGIN svcCloseHandle + svc 0x16 + ret +SVC_END + +SVC_BEGIN svcWaitSynchronization + str x0, [sp, #-16]! + svc 0x18 + ldr x2, [sp], #16 + str w1, [x2] + ret +SVC_END + SVC_BEGIN svcConnectToNamedPort str x0, [sp, #-16]! svc 0x1f @@ -29,6 +42,14 @@ SVC_BEGIN svcBreak ret SVC_END +SVC_BEGIN svcAcceptSession + str x0, [sp, #-16]! + svc 0x41 + ldr x2, [sp], #16 + str w1, [x2] + ret +SVC_END + SVC_BEGIN svcReplyAndReceive str x0, [sp, #-16]! svc 0x43