SVC: Difference between revisions
whew |
colors:) |
||
Line 10: | Line 10: | ||
|- | |- | ||
| 0x01 | | 0x01 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ControlMemory(u32* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions) | | Result ControlMemory(u32* outaddr, u32 addr0, u32 addr1, u32 size, u32 operation, u32 permissions) | ||
| Outaddr is usually the same as the input addr0. | | Outaddr is usually the same as the input addr0. | ||
|- | |- | ||
| 0x02 | | 0x02 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result QueryMemory(MemoryInfo* info, PageInfo* out, u32 Addr) | | Result QueryMemory(MemoryInfo* info, PageInfo* out, u32 Addr) | ||
| | | | ||
|- | |- | ||
| 0x03 | | 0x03 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| void ExitProcess(void) | | void ExitProcess(void) | ||
| | | | ||
|- | |- | ||
| 0x04 | | 0x04 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetProcessAffinityMask(u8* affinitymask, Handle process, s32 processorcount) | | Result GetProcessAffinityMask(u8* affinitymask, Handle process, s32 processorcount) | ||
| | | | ||
|- | |- | ||
| 0x05 | | 0x05 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SetProcessAffinityMask(Handle process, u8* affinitymask, s32 processorcount) | | Result SetProcessAffinityMask(Handle process, u8* affinitymask, s32 processorcount) | ||
| | | | ||
|- | |- | ||
| 0x06 | | 0x06 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetProcessIdealProcessor(s32 *idealprocessor, Handle process) | | Result GetProcessIdealProcessor(s32 *idealprocessor, Handle process) | ||
| | | | ||
|- | |- | ||
| 0x07 | | 0x07 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SetProcessIdealProcessor(Handle process, s32 idealprocessor) | | Result SetProcessIdealProcessor(Handle process, s32 idealprocessor) | ||
| | | | ||
|- | |- | ||
| 0x08 | | 0x08 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result [[#CreateThread|CreateThread]](Handle* thread, func entrypoint, u32 arg, u32 stacktop, s32 threadpriority, s32 processorid) | | Result [[#CreateThread|CreateThread]](Handle* thread, func entrypoint, u32 arg, u32 stacktop, s32 threadpriority, s32 processorid) | ||
| | | | ||
|- | |- | ||
| 0x09 | | 0x09 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| void ExitThread(void) | | void ExitThread(void) | ||
| | | | ||
|- | |- | ||
| 0x0A | | 0x0A | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| void SleepThread(s64 nanoseconds) | | void SleepThread(s64 nanoseconds) | ||
| | | | ||
|- | |- | ||
| 0x0B | | 0x0B | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result GetThreadPriority(s32* priority, Handle thread) | | Result GetThreadPriority(s32* priority, Handle thread) | ||
| | | | ||
|- | |- | ||
| 0x0C | | 0x0C | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result SetThreadPriority(Handle thread, s32 priority) | | Result SetThreadPriority(Handle thread, s32 priority) | ||
| | | | ||
|- | |- | ||
| 0x0D | | 0x0D | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetThreadAffinityMask(u8* affinitymask, Handle thread, s32 processorcount) | | Result GetThreadAffinityMask(u8* affinitymask, Handle thread, s32 processorcount) | ||
| | | | ||
|- | |- | ||
| 0x0E | | 0x0E | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SetThreadAffinityMask(Handle thread, u8* affinitymask, s32 processorcount) | | Result SetThreadAffinityMask(Handle thread, u8* affinitymask, s32 processorcount) | ||
| Replaced with a stub in ARM11 NATIVE_FIRM kernel beginning with [[8.0.0-18]]. | | Replaced with a stub in ARM11 NATIVE_FIRM kernel beginning with [[8.0.0-18]]. | ||
|- | |- | ||
| 0x0F | | 0x0F | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetThreadIdealProcessor(s32* processorid, Handle thread) | | Result GetThreadIdealProcessor(s32* processorid, Handle thread) | ||
| | | | ||
|- | |- | ||
| 0x10 | | 0x10 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SetThreadIdealProcessor(Handle thread, s32 processorid) | | Result SetThreadIdealProcessor(Handle thread, s32 processorid) | ||
| Replaced with a stub in ARM11 NATIVE_FIRM kernel beginning with [[8.0.0-18]]. | | Replaced with a stub in ARM11 NATIVE_FIRM kernel beginning with [[8.0.0-18]]. | ||
|- | |- | ||
| 0x11 | | 0x11 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| s32 GetCurrentProcessorNumber(void) | | s32 GetCurrentProcessorNumber(void) | ||
| | | | ||
|- | |- | ||
| 0x12 | | 0x12 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result Run(Handle process, StartupInfo* info) | | Result Run(Handle process, StartupInfo* info) | ||
| This starts the main() thread. Buf+0 is main-thread priority, Buf+4 is main-thread stack-size. | | This starts the main() thread. Buf+0 is main-thread priority, Buf+4 is main-thread stack-size. | ||
|- | |- | ||
| 0x13 | | 0x13 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CreateMutex(Handle* mutex, bool initialLocked) | | Result CreateMutex(Handle* mutex, bool initialLocked) | ||
| | | | ||
|- | |- | ||
| 0x14 | | 0x14 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result ReleaseMutex(Handle mutex) | | Result ReleaseMutex(Handle mutex) | ||
| | | | ||
|- | |- | ||
| 0x15 | | 0x15 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CreateSemaphore(Handle* semaphore, s32 initialCount, s32 maxCount) | | Result CreateSemaphore(Handle* semaphore, s32 initialCount, s32 maxCount) | ||
| | | | ||
|- | |- | ||
| 0x16 | | 0x16 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result ReleaseSemaphore(s32* count, Handle semaphore, s32 releaseCount) | | Result ReleaseSemaphore(s32* count, Handle semaphore, s32 releaseCount) | ||
| | | | ||
|- | |- | ||
| 0x17 | | 0x17 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CreateEvent(Handle* event, ResetType resettype) | | Result CreateEvent(Handle* event, ResetType resettype) | ||
| | | | ||
|- | |- | ||
| 0x18 | | 0x18 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result SignalEvent(Handle event) | | Result SignalEvent(Handle event) | ||
| | | | ||
|- | |- | ||
| 0x19 | | 0x19 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result ClearEvent(Handle event) | | Result ClearEvent(Handle event) | ||
| | | | ||
|- | |- | ||
| 0x1A | | 0x1A | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CreateTimer(Handle* timer, ResetType resettype) | | Result CreateTimer(Handle* timer, ResetType resettype) | ||
| | | | ||
|- | |- | ||
| 0x1B | | 0x1B | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result SetTimer(Handle timer, s64 initial, s64 interval) | | Result SetTimer(Handle timer, s64 initial, s64 interval) | ||
| | | | ||
|- | |- | ||
| 0x1C | | 0x1C | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CancelTimer(Handle timer) | | Result CancelTimer(Handle timer) | ||
| | | | ||
|- | |- | ||
| 0x1D | | 0x1D | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result ClearTimer(Handle timer) | | Result ClearTimer(Handle timer) | ||
| | | | ||
|- | |- | ||
| 0x1E | | 0x1E | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result CreateMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 mypermission, u32 otherpermission) | | Result CreateMemoryBlock(Handle* memblock, u32 addr, u32 size, u32 mypermission, u32 otherpermission) | ||
| | | | ||
|- | |- | ||
| 0x1F | | 0x1F | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result MapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission) | | Result MapMemoryBlock(Handle memblock, u32 addr, u32 mypermissions, u32 otherpermission) | ||
| | | | ||
|- | |- | ||
| 0x20 | | 0x20 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result UnmapMemoryBlock(Handle memblock, u32 addr) | | Result UnmapMemoryBlock(Handle memblock, u32 addr) | ||
| | | | ||
|- | |- | ||
| 0x21 | | 0x21 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CreateAddressArbiter(Handle* arbiter) | | Result CreateAddressArbiter(Handle* arbiter) | ||
| | | | ||
|- | |- | ||
| 0x22 | | 0x22 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result ArbitrateAddress(Handle arbiter, u32 addr, ArbitrationType type, s32 value, s64 nanoseconds) | | Result ArbitrateAddress(Handle arbiter, u32 addr, ArbitrationType type, s32 value, s64 nanoseconds) | ||
| | | | ||
|- | |- | ||
| 0x23 | | 0x23 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result CloseHandle(Handle handle) | | Result CloseHandle(Handle handle) | ||
| | | | ||
|- | |- | ||
| 0x24 | | 0x24 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result WaitSynchronization1(Handle handle, s64 nanoseconds) | | Result WaitSynchronization1(Handle handle, s64 nanoseconds) | ||
| | | | ||
|- | |- | ||
| 0x25 | | 0x25 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result WaitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds) | | Result WaitSynchronizationN(s32* out, Handle* handles, s32 handlecount, bool waitAll, s64 nanoseconds) | ||
| | | | ||
|- | |- | ||
| 0x26 | | 0x26 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SignalAndWait(s32* out, Handle signal, Handle* handles, s32 handleCount, bool waitAll, s64 nanoseconds) | | Result SignalAndWait(s32* out, Handle signal, Handle* handles, s32 handleCount, bool waitAll, s64 nanoseconds) | ||
| | | | ||
|- | |- | ||
| 0x27 | | 0x27 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result DuplicateHandle(Handle* out, Handle original) | | Result DuplicateHandle(Handle* out, Handle original) | ||
| | | | ||
|- | |- | ||
| 0x28 | | 0x28 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| s64 GetSystemTick(void) (This returns the total CPU ticks elapsed since the CPU was powered-on) | | s64 GetSystemTick(void) (This returns the total CPU ticks elapsed since the CPU was powered-on) | ||
| | | | ||
|- | |- | ||
| 0x29 | | 0x29 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetHandleInfo(s64* out, Handle handle, HandleInfoType type) | | Result GetHandleInfo(s64* out, Handle handle, HandleInfoType type) | ||
| | | | ||
|- | |- | ||
| 0x2A | | 0x2A | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result GetSystemInfo(s64* out, SystemInfoType type, s32 param) | | Result GetSystemInfo(s64* out, SystemInfoType type, s32 param) | ||
| | | | ||
|- | |- | ||
| 0x2B | | 0x2B | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result GetProcessInfo(s64* out, Handle process, ProcessInfoType type) | | Result GetProcessInfo(s64* out, Handle process, ProcessInfoType type) | ||
| | | | ||
|- | |- | ||
| 0x2C | | 0x2C | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result GetThreadInfo(s64* out, Handle thread, ThreadInfoType type) | | Result GetThreadInfo(s64* out, Handle thread, ThreadInfoType type) | ||
| | | | ||
|- | |- | ||
| 0x2D | | 0x2D | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ConnectToPort(Handle* out, const char* portName) | | Result ConnectToPort(Handle* out, const char* portName) | ||
| | | | ||
|- | |- | ||
| 0x2E | | 0x2E | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SendSyncRequest1(Handle session) | | Result SendSyncRequest1(Handle session) | ||
| Stubbed | | Stubbed | ||
Line 333: | Line 333: | ||
|- | |- | ||
| 0x2F | | 0x2F | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SendSyncRequest2(Handle session) | | Result SendSyncRequest2(Handle session) | ||
| Stubbed | | Stubbed | ||
Line 341: | Line 341: | ||
|- | |- | ||
| 0x30 | | 0x30 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SendSyncRequest3(Handle session) | | Result SendSyncRequest3(Handle session) | ||
| Stubbed | | Stubbed | ||
Line 349: | Line 349: | ||
|- | |- | ||
| 0x31 | | 0x31 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SendSyncRequest4(Handle session) | | Result SendSyncRequest4(Handle session) | ||
| Stubbed | | Stubbed | ||
Line 357: | Line 357: | ||
|- | |- | ||
| 0x32 | | 0x32 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SendSyncRequest(Handle session) | | Result SendSyncRequest(Handle session) | ||
| | | | ||
|- | |- | ||
| 0x33 | | 0x33 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result OpenProcess(Handle* process, u32 processId) | | Result OpenProcess(Handle* process, u32 processId) | ||
| | | | ||
|- | |- | ||
| 0x34 | | 0x34 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result OpenThread(Handle* thread, Handle process, u32 threadId) | | Result OpenThread(Handle* thread, Handle process, u32 threadId) | ||
| | | | ||
|- | |- | ||
| 0x35 | | 0x35 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| Yes | | style="background: green" | Yes | ||
| Result GetProcessId(u32* processId, Handle process) | | Result GetProcessId(u32* processId, Handle process) | ||
| | | | ||
|- | |- | ||
| 0x36 | | 0x36 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetProcessIdOfThread(u32* processId, Handle thread) | | Result GetProcessIdOfThread(u32* processId, Handle thread) | ||
| | | | ||
|- | |- | ||
| 0x37 | | 0x37 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result GetThreadId(u32* threadId, Handle thread) | | Result GetThreadId(u32* threadId, Handle thread) | ||
| | | | ||
|- | |- | ||
| 0x38 | | 0x38 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetResourceLimit(Handle* resourceLimit, Handle process) | | Result GetResourceLimit(Handle* resourceLimit, Handle process) | ||
| | | | ||
|- | |- | ||
| 0x39 | | 0x39 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetResourceLimitLimitValues(s64* values, Handle resourceLimit, LimitableResource* names, s32 nameCount) | | Result GetResourceLimitLimitValues(s64* values, Handle resourceLimit, LimitableResource* names, s32 nameCount) | ||
| | | | ||
|- | |- | ||
| 0x3A | | 0x3A | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetResourceLimitCurrentValues(s64* values, Handle resourceLimit, LimitableResource* names, s32 nameCount) | | Result GetResourceLimitCurrentValues(s64* values, Handle resourceLimit, LimitableResource* names, s32 nameCount) | ||
| | | | ||
|- | |- | ||
| 0x3B | | 0x3B | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetThreadContext(ThreadContext* context, Handle thread) | | Result GetThreadContext(ThreadContext* context, Handle thread) | ||
| Stubbed | | Stubbed | ||
|- | |- | ||
| 0x3C | | 0x3C | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Break(BreakReason) | | Break(BreakReason) | ||
| | | | ||
|- | |- | ||
| 0x3D | | 0x3D | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| OutputDebugString(void const, int) | | OutputDebugString(void const, int) | ||
| Does nothing on non-debug units. | | Does nothing on non-debug units. | ||
|- | |- | ||
| 0x3E | | 0x3E | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| ControlPerformanceCounter(unsigned long long, int, unsigned int, unsigned long long) | | ControlPerformanceCounter(unsigned long long, int, unsigned int, unsigned long long) | ||
| | | | ||
|- style="border-top: double" | |- style="border-top: double" | ||
| 0x47 | | 0x47 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result CreatePort(Handle* portServer, Handle* portClient, const char* name, s32 maxSessions) | | Result CreatePort(Handle* portServer, Handle* portClient, const char* name, s32 maxSessions) | ||
| Setting name=NULL creates a private port not accessible from svcConnectToPort. | | Setting name=NULL creates a private port not accessible from svcConnectToPort. | ||
|- | |- | ||
| 0x48 | | 0x48 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result CreateSessionToPort(Handle* session, Handle port) | | Result CreateSessionToPort(Handle* session, Handle port) | ||
| | | | ||
|- | |- | ||
| 0x49 | | 0x49 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result CreateSession(Handle* sessionServer, Handle* sessionClient) | | Result CreateSession(Handle* sessionServer, Handle* sessionClient) | ||
| | | | ||
|- | |- | ||
| 0x4A | | 0x4A | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result AcceptSession(Handle* session, Handle port) | | Result AcceptSession(Handle* session, Handle port) | ||
| | | | ||
|- | |- | ||
| 0x4B | | 0x4B | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ReplyAndReceive1(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | | Result ReplyAndReceive1(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | ||
| Stubbed. | | Stubbed. | ||
|- | |- | ||
| 0x4C | | 0x4C | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ReplyAndReceive2(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | | Result ReplyAndReceive2(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | ||
| Stubbed. | | Stubbed. | ||
|- | |- | ||
| 0x4D | | 0x4D | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ReplyAndReceive3(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | | Result ReplyAndReceive3(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | ||
| Stubbed. | | Stubbed. | ||
|- | |- | ||
| 0x4E | | 0x4E | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ReplyAndReceive4(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | | Result ReplyAndReceive4(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | ||
| Stubbed. | | Stubbed. | ||
|- | |- | ||
| 0x4F | | 0x4F | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ReplyAndReceive(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | | Result ReplyAndReceive(s32* index, Handle* handles, s32 handleCount, Handle replyTarget) | ||
| | | | ||
|- | |- | ||
| 0x50 | | 0x50 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result BindInterrupt(Interrupt name, Handle syncObject, s32 priority, bool isManualClear) | | Result BindInterrupt(Interrupt name, Handle syncObject, s32 priority, bool isManualClear) | ||
| | | | ||
|- | |- | ||
| 0x51 | | 0x51 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result UnbindInterrupt(Interrupt name, Handle syncObject) | | Result UnbindInterrupt(Interrupt name, Handle syncObject) | ||
| | | | ||
|- | |- | ||
| 0x52 | | 0x52 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result InvalidateProcessDataCache(Handle process, void* addr, u32 size) | | Result InvalidateProcessDataCache(Handle process, void* addr, u32 size) | ||
| | | | ||
|- | |- | ||
| 0x53 | | 0x53 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result StoreProcessDataCache(Handle process, void const* addr, u32 size) | | Result StoreProcessDataCache(Handle process, void const* addr, u32 size) | ||
| | | | ||
|- | |- | ||
| 0x54 | | 0x54 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result FlushProcessDataCache(Handle process, void const* addr, u32 size) | | Result FlushProcessDataCache(Handle process, void const* addr, u32 size) | ||
| | | | ||
|- | |- | ||
| 0x55 | | 0x55 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result StartInterProcessDma(Handle* dma, Handle dstProcess, void* dst, Handle srcProcess, const void* src, u32 size, const DmaConfig& config) | | Result StartInterProcessDma(Handle* dma, Handle dstProcess, void* dst, Handle srcProcess, const void* src, u32 size, const DmaConfig& config) | ||
| | | | ||
|- | |- | ||
| 0x56 | | 0x56 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result StopDma(Handle dma) | | Result StopDma(Handle dma) | ||
| | | | ||
|- | |- | ||
| 0x57 | | 0x57 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Result GetDmaState(DmaState* state, Handle dma) | | Result GetDmaState(DmaState* state, Handle dma) | ||
| | | | ||
|- | |- | ||
| 0x58 | | 0x58 | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| RestartDma(nn::Handle, void *, void const*, unsigned int, signed char) | | RestartDma(nn::Handle, void *, void const*, unsigned int, signed char) | ||
| | | | ||
|- style="border-top: double" | |- style="border-top: double" | ||
| 0x60 | | 0x60 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result DebugActiveProcess(Handle* debug, u32 processID) | | Result DebugActiveProcess(Handle* debug, u32 processID) | ||
| | | | ||
|- | |- | ||
| 0x61 | | 0x61 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result BreakDebugProcess(Handle debug) | | Result BreakDebugProcess(Handle debug) | ||
| | | | ||
|- | |- | ||
| 0x62 | | 0x62 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result TerminateDebugProcess(Handle debug) | | Result TerminateDebugProcess(Handle debug) | ||
| | | | ||
|- | |- | ||
| 0x63 | | 0x63 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetProcessDebugEvent(DebugEventInfo* info, Handle debug) | | Result GetProcessDebugEvent(DebugEventInfo* info, Handle debug) | ||
| | | | ||
|- | |- | ||
| 0x64 | | 0x64 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ContinueDebugEvent(Handle debug, u32 flags) | | Result ContinueDebugEvent(Handle debug, u32 flags) | ||
| | | | ||
|- | |- | ||
| 0x65 | | 0x65 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetProcessList(s32* processCount, u32* processIds, s32 processIdMaxCount) | | Result GetProcessList(s32* processCount, u32* processIds, s32 processIdMaxCount) | ||
| | | | ||
|- | |- | ||
| 0x66 | | 0x66 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetThreadList(s32* threadCount, u32* threadIds, s32 threadIdMaxCount, Handle domain) | | Result GetThreadList(s32* threadCount, u32* threadIds, s32 threadIdMaxCount, Handle domain) | ||
| | | | ||
|- | |- | ||
| 0x67 | | 0x67 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result GetDebugThreadContext(ThreadContext* context, Handle debug, u32 threadId, u32 controlFlags) | | Result GetDebugThreadContext(ThreadContext* context, Handle debug, u32 threadId, u32 controlFlags) | ||
| | | | ||
|- | |- | ||
| 0x68 | | 0x68 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SetDebugThreadContext(Handle debug, u32 threadId, ThreadContext* context, u32 controlFlags) | | Result SetDebugThreadContext(Handle debug, u32 threadId, ThreadContext* context, u32 controlFlags) | ||
| | | | ||
|- | |- | ||
| 0x69 | | 0x69 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result QueryDebugProcessMemory(MemoryInfo* blockInfo, PageInfo* pageInfo, Handle process, u32 addr) | | Result QueryDebugProcessMemory(MemoryInfo* blockInfo, PageInfo* pageInfo, Handle process, u32 addr) | ||
| | | | ||
|- | |- | ||
| 0x6A | | 0x6A | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result ReadProcessMemory(void* buffer, Handle debug, u32 addr, u32 size) | | Result ReadProcessMemory(void* buffer, Handle debug, u32 addr, u32 size) | ||
| | | | ||
|- | |- | ||
| 0x6B | | 0x6B | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result WriteProcessMemory(Handle debug, void const* buffer, u32 addr, u32 size) | | Result WriteProcessMemory(Handle debug, void const* buffer, u32 addr, u32 size) | ||
| | | | ||
|- | |- | ||
| 0x6C | | 0x6C | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| Result SetHardwareBreakPoint(s32 registerId, u32 control, u32 value) | | Result SetHardwareBreakPoint(s32 registerId, u32 control, u32 value) | ||
| | | | ||
|- | |- | ||
| 0x6D | | 0x6D | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| GetDebugThreadParam(long long *, int *, nn::Handle, unsigned int, nn::dmnt::DebugThreadParam) | | GetDebugThreadParam(long long *, int *, nn::Handle, unsigned int, nn::dmnt::DebugThreadParam) | ||
| Disabled on regular kernel. | | Disabled on regular kernel. | ||
|- style="border-top: double" | |- style="border-top: double" | ||
| 0x70 | | 0x70 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| ControlProcessMemory(Handle KProcess, unsigned int Addr0, unsigned int Addr1, unsigned int Size, unsigned int Type, unsigned int Permissions) | | ControlProcessMemory(Handle KProcess, unsigned int Addr0, unsigned int Addr1, unsigned int Size, unsigned int Type, unsigned int Permissions) | ||
| | | | ||
|- | |- | ||
| 0x71 | | 0x71 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| MapProcessMemory(Handle KProcess, unsigned int StartAddr, unsigned int EndAddr) | | MapProcessMemory(Handle KProcess, unsigned int StartAddr, unsigned int EndAddr) | ||
| | | | ||
|- | |- | ||
| 0x72 | | 0x72 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| UnmapProcessMemory(Handle KProcess, unsigned int StartAddr, unsigned int EndAddr) | | UnmapProcessMemory(Handle KProcess, unsigned int StartAddr, unsigned int EndAddr) | ||
| | | | ||
|- | |- | ||
| 0x73 | | 0x73 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| CreateProcess(Handle* HandleInfo_out, struct CreateProcessInfo, u32 code_ptr, u32 ro_ptr, u32 data_ptr) | | CreateProcess(Handle* HandleInfo_out, struct CreateProcessInfo, u32 code_ptr, u32 ro_ptr, u32 data_ptr) | ||
| | | | ||
|- | |- | ||
| 0x74 | | 0x74 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| | | | ||
| Stubbed | | Stubbed | ||
|- | |- | ||
| 0x75 | | 0x75 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| SetupProcess(Handle* KProcess_out, Handle HandleInfo_in, u32 arm11kernelcaps_ptr, u32 arm11kernelcaps_num) | | SetupProcess(Handle* KProcess_out, Handle HandleInfo_in, u32 arm11kernelcaps_ptr, u32 arm11kernelcaps_num) | ||
| | | | ||
|- | |- | ||
| 0x76 | | 0x76 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| TerminateProcess(Handle) | | TerminateProcess(Handle) | ||
| | | | ||
|- | |- | ||
| 0x77 | | 0x77 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| ??? (Handle KProcess, Handle KResourceLimit) | | ??? (Handle KProcess, Handle KResourceLimit) | ||
| | | | ||
|- | |- | ||
| 0x78 | | 0x78 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| CreateResourceLimit(Handle *KResourceLimit) | | CreateResourceLimit(Handle *KResourceLimit) | ||
| | | | ||
|- | |- | ||
| 0x79 | | 0x79 | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| ??? | | ??? | ||
| | | | ||
|- | |- | ||
| 0x7A | | 0x7A | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| Yes | | style="background: green" | Yes | ||
| AddCodeSegment? (unsigned int Addr, unsigned int Size) | | AddCodeSegment? (unsigned int Addr, unsigned int Size) | ||
| Stubbed on NATIVE_FIRM beginning with [[2.0.0-2]]. Used during TWL_FIRM boot. | | Stubbed on NATIVE_FIRM beginning with [[2.0.0-2]]. Used during TWL_FIRM boot. | ||
|- | |- | ||
| 0x7B | | 0x7B | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| Backdoor(unsigned int CodeAddress) | | Backdoor(unsigned int CodeAddress) | ||
| This is used on ARM9 NATIVE_FIRM. No ARM11 processes have access to it without some form of kernelhax. | | This is used on ARM9 NATIVE_FIRM. No ARM11 processes have access to it without some form of kernelhax. | ||
|- | |- | ||
| 0x7C | | 0x7C | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| KernelSetState(unsigned int Type, unsigned int Param0, unsigned int Param1, unsigned int Param2) | | KernelSetState(unsigned int Type, unsigned int Param0, unsigned int Param1, unsigned int Param2) | ||
| The type determines the meaning of each param | | The type determines the meaning of each param | ||
|- | |- | ||
| 0x7D | | 0x7D | ||
| Yes | | style="background: green" | Yes | ||
| No | | style="background: red" | No | ||
| No | | style="background: red" | No | ||
| QueryProcessMemory(MemInfo *Info, unsigned int *Out, Handle KProcess, unsigned int Addr) | | QueryProcessMemory(MemInfo *Info, unsigned int *Out, Handle KProcess, unsigned int Addr) | ||
| | | | ||
|- style="border-top: double" | |- style="border-top: double" | ||
| 0xFF | | 0xFF | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| Yes | | style="background: green" | Yes | ||
| ??? | | ??? | ||
| Debug related? The svcaccesscontrol mask doesn't apply for this SVC. Stubbed on ARM9 NATIVE_FIRM. | | Debug related? The svcaccesscontrol mask doesn't apply for this SVC. Stubbed on ARM9 NATIVE_FIRM. | ||
|} | |} | ||
Note that "stubbed" here means that the SVC only returns an error. | Note that "stubbed" here means that the SVC only returns an error. |