diff --git a/nx/include/switch/kernel/svc.h b/nx/include/switch/kernel/svc.h index 75cefc55..e38194a4 100644 --- a/nx/include/switch/kernel/svc.h +++ b/nx/include/switch/kernel/svc.h @@ -671,8 +671,34 @@ Result svcWriteDebugProcessMemory(Handle debug, void* buffer, u64 addr, u64 size ///@} +///@name Miscellaneous +///@{ + +/** + * @brief Retrieves privileged information about the system, or a certain kernel object. + * @param[out] out Variable to which store the information. + * @param[in] id0 First ID of the property to retrieve. + * @param[in] handle Handle of the object to retrieve information from, or \ref INVALID_HANDLE to retrieve information about the system. + * @param[in] id1 Second ID of the property to retrieve. + * @return Result code. + * @remark The full list of property IDs can be found on the switchbrew.org wiki. + * @note Syscall number 0x6F. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result svcGetSystemInfo(u64* out, u64 id0, Handle handle, u64 id1); + +///@} + ///@name Inter-process communication (IPC) ///@{ + +/** + * @brief Creates a port. + * @return Result code. + * @note Syscall number 0x70. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result svcCreatePort(Handle* portServer, Handle *portClient, s32 max_sessions, bool is_light, const char* name); /** * @brief Manages a named port. @@ -682,6 +708,14 @@ Result svcWriteDebugProcessMemory(Handle debug, void* buffer, u64 addr, u64 size */ Result svcManageNamedPort(Handle* portServer, const char* name, s32 maxSessions); +/** + * @brief Manages a named port. + * @return Result code. + * @note Syscall number 0x72. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result svcConnectToPort(Handle* session, Handle port); + ///@} ///@name Memory management @@ -704,7 +738,7 @@ Result svcSetProcessMemoryPermission(Handle proc, u64 addr, u64 size, u32 perm); * @brief Maps the src address from the supplied process handle into the current process. * @param[in] dst Address to which map the memory in the current process. * @param[in] proc Process handle. - * @param[in] src Address of the memory in the process. + * @param[in] src Source mapping address. * @param[in] size Size of the memory. * @return Result code. * @remark This allows mapping code and rodata with RW- permission. @@ -713,6 +747,19 @@ Result svcSetProcessMemoryPermission(Handle proc, u64 addr, u64 size, u32 perm); */ Result svcMapProcessMemory(void* dst, Handle proc, u64 src, u64 size); +/** + * @brief Undoes the effects of \ref svcMapProcessMemory. + * @param[in] dst Destination mapping address + * @param[in] proc Process handle. + * @param[in] src Address of the memory in the process. + * @param[in] size Size of the memory. + * @return Result code. + * @remark This allows mapping code and rodata with RW- permission. + * @note Syscall number 0x75. + * @warning This is a privileged syscall. Use \ref envIsSyscallHinted to check if it is available. + */ +Result svcUnmapProcessMemory(void* dst, Handle proc, u64 src, u64 size); + /** * @brief Maps normal heap in a certain process as executable code (used when loading NROs). * @param[in] proc Process handle (cannot be \ref CUR_PROCESS_HANDLE). diff --git a/nx/source/kernel/svc.s b/nx/source/kernel/svc.s index 5c398b9a..19b25f1b 100644 --- a/nx/source/kernel/svc.s +++ b/nx/source/kernel/svc.s @@ -345,6 +345,23 @@ SVC_BEGIN svcWriteDebugProcessMemory ret SVC_END +SVC_BEGIN svcGetSystemInfo + str x0, [sp, #-16]! + svc 0x6F + ldr x2, [sp], #16 + str x1, [x2] + ret +SVC_END + +SVC_BEGIN svcCreatePort + stp x0, x1, [sp, #-16]! + svc 0x70 + ldp x3, x4, [sp], #16 + str w1, [x3] + str w2, [x4] + ret +SVC_END + SVC_BEGIN svcManageNamedPort str x0, [sp, #-16]! svc 0x71 @@ -353,6 +370,14 @@ SVC_BEGIN svcManageNamedPort ret SVC_END +SVC_BEGIN svcConnectToPort + str x0, [sp, #-16]! + svc 0x72 + ldr x2, [sp], #16 + str w1, [x2] + ret +SVC_END + SVC_BEGIN svcSetProcessMemoryPermission svc 0x73 ret @@ -363,6 +388,11 @@ SVC_BEGIN svcMapProcessMemory ret SVC_END +SVC_BEGIN svcUnmapProcessMemory + svc 0x75 + ret +SVC_END + SVC_BEGIN svcMapProcessCodeMemory svc 0x77 ret