<?xml version="1.0"?>
<feed xmlns="http://www.w3.org/2005/Atom" xml:lang="en">
	<id>https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cyuubi</id>
	<title>Nintendo Switch Brew - User contributions [en]</title>
	<link rel="self" type="application/atom+xml" href="https://switchbrew.org/w/api.php?action=feedcontributions&amp;feedformat=atom&amp;user=Cyuubi"/>
	<link rel="alternate" type="text/html" href="https://switchbrew.org/wiki/Special:Contributions/Cyuubi"/>
	<updated>2026-05-02T10:04:15Z</updated>
	<subtitle>User contributions</subtitle>
	<generator>MediaWiki 1.43.1</generator>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=SVC&amp;diff=4690</id>
		<title>SVC</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=SVC&amp;diff=4690"/>
		<updated>2018-05-22T16:08:38Z</updated>

		<summary type="html">&lt;p&gt;Cyuubi: Fix svcGetInfo 16&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;__NOTOC__&lt;br /&gt;
&lt;br /&gt;
= System calls =&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Id || Name || In || Out&lt;br /&gt;
|-&lt;br /&gt;
|  0x1 || [[#svcSetHeapSize]] || W1=size || W0=result, X1=outaddr&lt;br /&gt;
|-&lt;br /&gt;
|  0x2 || [[#svcSetMemoryPermission]] || X0=addr, X1=size, W2=prot || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x3 || [[#svcSetMemoryAttribute]] || X0=addr, X1=size, W2=state0, W3=state1 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x4 || [[#svcMapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x5 || [[#svcUnmapMemory]] || X0=dstaddr, X1=srcaddr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0x6 || [[#svcQueryMemory]] || X0=MemoryInfo*, X2=addr || W0=result, W1=PageInfo                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0x7 || [[#svcExitProcess]] || None ||&lt;br /&gt;
|-&lt;br /&gt;
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id  || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xA || [[#svcExitThread]] || None ||                                                         &lt;br /&gt;
|-&lt;br /&gt;
|  0xB || [[#svcSleepThread]] || X0=nano || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xC || [[#svcGetThreadPriority]] || W1=thread_handle || W0=result, W1=prio&lt;br /&gt;
|-&lt;br /&gt;
|  0xD || [[#svcSetThreadPriority]] || W0=thread_handle, W1=prio || W0=result&lt;br /&gt;
|-&lt;br /&gt;
|  0xE || [[#svcGetThreadCoreMask]] || W2=thread_handle || W0=result, W1=out, X2=out&lt;br /&gt;
|-&lt;br /&gt;
|  0xF || [[#svcSetThreadCoreMask]] || W0=thread_handle, W1=in, X2=in2 || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || [[#svcGetCurrentProcessorNumber]] || None || W0/X0=cpuid&lt;br /&gt;
|-&lt;br /&gt;
| 0x11 || svcSignalEvent || W0=wevent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x12 || svcClearEvent || W0=wevent_or_revent_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x13 || [[#svcMapSharedMemory]] || W0=shmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || svcUnmapSharedMemory || W0=shmem_handle, X1=addr, X2=size || W0=result                                                 &lt;br /&gt;
|-&lt;br /&gt;
| 0x15 || [[#svcCreateTransferMemory]] || X1=addr, X2=size, W3=perm || W0=result, W1=tmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x16 || svcCloseHandle || W0=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x17 || svcResetSignal || W0=revent_or_process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || [[#svcWaitSynchronization]] || X1=handles_ptr, W2=num_handles. X3=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x19 || svcCancelSynchronization || W0=thread_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1A || svcArbitrateLock || W0=cur_thread_handle, X1=ptr, W2=req_thread_handle ||                                     &lt;br /&gt;
|-&lt;br /&gt;
| 0x1B || svcArbitrateUnlock || X0=ptr ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || svcWaitProcessWideKeyAtomic || X0=ptr0, X1=ptr, W2=thread_handle, X3=timeout || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1D || svcSignalProcessWideKey || X0=ptr, W1=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}&lt;br /&gt;
|-&lt;br /&gt;
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || svcSendSyncRequestLight || W0=light_session_handle, X1=? || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x21 || svcSendSyncRequest || X0=normal_session_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x22 || [[#svcSendSyncRequestWithUserBuffer]] || X0=cmdbufptr, X1=size, X2=handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x23 || svcSendAsyncRequestWithUserBuffer || X1=cmdbufptr, X2=size, X3=handle || W0=result, W1=revent_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid&lt;br /&gt;
|-&lt;br /&gt;
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || ?&lt;br /&gt;
|-&lt;br /&gt;
| 0x27 || svcOutputDebugString || X0=str, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || svcReturnFromException || X0=result || &lt;br /&gt;
|-&lt;br /&gt;
| 0x29 || [[#svcGetInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x2A || svcFlushEntireDataCache || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x2B || svcFlushDataCache || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || [3.0.0+] [[#svcMapPhysicalMemory]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout || W0=result, bunch of crap&lt;br /&gt;
|-&lt;br /&gt;
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value&lt;br /&gt;
|-&lt;br /&gt;
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x33 || svcGetThreadContext3 || W0=thread_handle, W1=[[#ThreadContext]]* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=ArbitrationType, X2=? X3=timeout ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=SignalType, X2=? W3=? ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x3C || [[#svcDumpInfo]] || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x3D || [4.0.0+] svcDumpInfoNew || ||&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx&lt;br /&gt;
|-&lt;br /&gt;
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x48 || [5.0.0+] [[#svcMapPhysicalMemoryUnsafe]] || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x49 || [5.0.0+] svcUnmapPhysicalMemoryUnsafe || X0=addr, X1=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4A || [5.0.0+] svcSetUnsafeLimit || X0=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x4D || svcSleepSystem || None || None&lt;br /&gt;
|-&lt;br /&gt;
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val&lt;br /&gt;
|-&lt;br /&gt;
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x50 || [[#svcCreateSharedMemory]] || W1=size, W2=myperm, W3=otherperm || W0=result, W1=shmem_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x51 || [[#svcMapTransferMemory]] || X0=tmem_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x52 || [[#svcUnmapTransferMemory]] || W0=tmemhandle, X1=addr, X2=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x53 || svcCreateInterruptEvent || X1=irq_num, W2=flag || W0=result, W1=handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x58 || [[#svcDetachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x59 || [[#svcMapDeviceAddressSpaceByForce]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5A || [[#svcMapDeviceAddressSpaceAligned]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr, W5=perm || W0=result &lt;br /&gt;
|-&lt;br /&gt;
| 0x5B || svcMapDeviceAddressSpace || || &lt;br /&gt;
|-&lt;br /&gt;
| 0x5C || [[#svcUnmapDeviceAddressSpace]] || W0=dev_as_handle, W1=proc_handle, X2=dev_map_addr, X3=dev_as_size, X4=dev_as_addr || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x5D || svcInvalidateProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5E || svcStoreProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x5F || svcFlushProcessDataCache || W0=process_handle, X1=addr, X2=size || W0=size&lt;br /&gt;
|-&lt;br /&gt;
| 0x60 || svcDebugActiveProcess || X1=pid || W0=result, W1=debug_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x61 || svcBreakDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x62 || svcTerminateDebugProcess || W0=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x63 || svcGetDebugEvent || X0=[[#DebugEventInfo]]*, W1=debug_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x64 || svcContinueDebugEvent || W0=debug_handle, W1=[[#ContinueDebugFlags]], X2=thread_id || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x65 || svcGetProcessList || X1=pids_out_ptr, W2=max_out || W0=result, W1=num_out &lt;br /&gt;
|-&lt;br /&gt;
| 0x66 || svcGetThreadList || X1=tids_out_ptr, W2=max_out, W3=debug_handle_or_zero || W0=result, X1=num_out&lt;br /&gt;
|-&lt;br /&gt;
| 0x67 || svcGetDebugThreadContext || X0=ThreadContext*, X1=debug_handle, X2=thread_id, W3=[[#ThreadContextFlags]] || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x68 || svcSetDebugThreadContext || W0=debug_handle, W1=[[#ThreadContextFlags]], X2=ThreadContext* || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x69 || svcQueryDebugProcessMemory || X0=[[#MemoryInfo]]*, X2=debug_handle, X3=addr || W0=result, W1=PageInfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x6A || svcReadDebugProcessMemory || X0=buffer*, X1=debug_handle, X2=src_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6B || svcWriteDebugProcessMemory || X0=debug_handle, X1=buffer*, X2=dst_addr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x6C || svcSetHardwareBreakPoint || W0=HardwareBreakpointId, X1=watchpoint_flags, X2=watchpoint_value/debug_handle? || &lt;br /&gt;
|-&lt;br /&gt;
| 0x6D || svcGetDebugThreadParam || X2=debug_handle, X3=thread_id, W4=[[#DebugThreadParam]] || W0=result, X1=out0, W2=out1&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x6F || [5.0.0+] [[#svcGetSystemInfo]] || X1=info_id, X2=handle, X3=info_sub_id || W0=result, X1=out&lt;br /&gt;
|-&lt;br /&gt;
| 0x70 || svcCreatePort || W2=max_sessions, W3=unk_bool, X4=name_ptr || W0=result, W1=clientport_handle, W2=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x71 || svcManageNamedPort || X1=name_ptr, W2=max_sessions || W0=result, W1=serverport_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x72 || svcConnectToPort || W1=clientport_handle || W0=result, W1=session_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x73 || [[#svcSetProcessMemoryPermission]] || W0=process_handle, X1=addr, X2=size, W3=perm || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x74 || [[#svcMapProcessMemory]] || X0=srcaddr, W1=process_handle, X2=dstaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x75 || [[#svcUnmapProcessMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x76 || [[#svcQueryProcessMemory]] || X0=meminfo_ptr, W2=process_handle, X3=addr || W0=result, W1=pageinfo&lt;br /&gt;
|-&lt;br /&gt;
| 0x77 || [[#svcMapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x78 || [[#svcUnmapProcessCodeMemory]] || W0=process_handle, X1=dstaddr, X2=srcaddr, X3=size || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x79 || [[#svcCreateProcess]] || X1=procinfo_ptr, X2=caps_ptr, W3=cap_num ||  W0=result, W1=process_handle&lt;br /&gt;
|-&lt;br /&gt;
| 0x7A || svcStartProcess || W0=process_handle, W1=main_thread_prio, W2=default_cpuid, W3=main_thread_stacksz || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7B || svcTerminateProcess || W0=process_handle || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7C || [[#svcGetProcessInfo]] || W0=process_handle || W0=result, X1=[[#ProcessState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x7D || svcCreateResourceLimit || None || W0=result, W1=reslimit_handle &lt;br /&gt;
|-&lt;br /&gt;
| 0x7E || svcSetResourceLimitLimitValue || W0=reslimit_handle, W1=[[#LimitableResource]], X2=value || W0=result&lt;br /&gt;
|-&lt;br /&gt;
| 0x7F || svcCallSecureMonitor || X0=smc_sub_id, X1,X2,X3,X4,X5,X6,X7=smc_args || X0,X1,X2,X3,X4,X5,X6,X7=result&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetHeapSize ==&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || OutAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set the process heap to a given Size. It can both extend and shrink the heap.&lt;br /&gt;
&lt;br /&gt;
Size must be a multiple of 0x200000.&lt;br /&gt;
&lt;br /&gt;
On success, the heap base-address (which is fixed by kernel, aslr&#039;d) is written to OutAddr.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Size must be less than 0x18000000.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || Prot&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change permission of page-aligned memory region.&lt;br /&gt;
&lt;br /&gt;
Bit2 of permission (exec) is not allowed. Setting write-only is not allowed either (bit1).&lt;br /&gt;
&lt;br /&gt;
This can be used to move back and forth between ---, r-- and rw-.&lt;br /&gt;
&lt;br /&gt;
== svcSetMemoryAttribute ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || State0&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u32 || State1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Change attribute of page-aligned memory region. &lt;br /&gt;
&lt;br /&gt;
This is used to turn on/off caching for a given memory area. Useful when talking to devices such as the GPU.&lt;br /&gt;
&lt;br /&gt;
What happens &amp;quot;under the hood&amp;quot; is the &amp;quot;Memory Attribute Indirection Register&amp;quot; index is changed from 2 to 3 in the MMU descriptor.&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! State0 || State1 || Action&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 0 || Clear bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Set bit3 in [[#MemoryAttribute]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps a memory range into a different range.&lt;br /&gt;
&lt;br /&gt;
Mainly used for adding guard pages around stack.&lt;br /&gt;
&lt;br /&gt;
Source range gets reprotected to --- (it can no longer be accessed), and bit0 is set in the source [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
If dstaddr &amp;gt;= LowerTreshold, the dst-range is enforced to be within the process&#039; &amp;quot;MapRegion&amp;quot;. Code can get the range of this region from [[#svcGetInfo]] id0=2,3.&lt;br /&gt;
&lt;br /&gt;
In this case, the mapped memory will have state 0x5C3C0B.&lt;br /&gt;
&lt;br /&gt;
As long as (dstaddr+size) &amp;lt; LowerThreshold, then you can map anywhere but the mapped memory will have state 0x482907 instead.&lt;br /&gt;
&lt;br /&gt;
LowerTreshold is 0x80000000 for 36-bit address spaces, and 0x40000000 for 32-bit ones.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Support for the 0x482907 mappings outside the &amp;quot;MapRegion&amp;quot; were removed.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps a region that was previously mapped with [[#svcMapMemory]].&lt;br /&gt;
&lt;br /&gt;
It&#039;s possible to unmap ranges partially, you don&#039;t need to unmap the entire range &amp;quot;in one go&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
The srcaddr/dstaddr must match what was given when the pages were originally mapped.&lt;br /&gt;
&lt;br /&gt;
== svcQueryMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfo&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Query information about an address. Will always fetch the lowest page-aligned mapping that contains the provided address.&lt;br /&gt;
&lt;br /&gt;
Outputs a [[#MemoryInfo]] struct.&lt;br /&gt;
&lt;br /&gt;
== svcExitProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current process.&lt;br /&gt;
&lt;br /&gt;
== svcCreateThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void(*)(void*) || Entry&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || ThreadContext&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || void* || StackTop&lt;br /&gt;
|-&lt;br /&gt;
| (In) W4 || u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || u32 || ProcessorId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Create a thread in the current process.&lt;br /&gt;
&lt;br /&gt;
Processor_id must be 0,1,2,3 or -2, where -2 uses the default cpuid for process.&lt;br /&gt;
&lt;br /&gt;
== svcStartThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) None ||  ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Starts the thread for the provided handle.&lt;br /&gt;
&lt;br /&gt;
== svcExitThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Exits the current thread.&lt;br /&gt;
&lt;br /&gt;
== svcSleepThread ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Nano&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Sleep for a specified amount of time, or yield thread.&lt;br /&gt;
&lt;br /&gt;
Setting nano=0 means &amp;quot;yield thread&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || Priority&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadPriority ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0|| Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1|| u32 || Priority&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set priority of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
Priority is a number 0-0x3F. Lower value means higher priority.&lt;br /&gt;
&lt;br /&gt;
== svcGetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || Out0&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || Out1&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcSetThreadCoreMask ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Thread&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u32 || In0&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || In1&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Set affinity mask of provided thread handle.&lt;br /&gt;
&lt;br /&gt;
== svcGetCurrentProcessorNumber ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0/X0 || u64 || CpuId&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Get which cpu is executing the current thread.&lt;br /&gt;
&lt;br /&gt;
Cpu-id is an integer in the range 0-3.&lt;br /&gt;
&lt;br /&gt;
== svcMapSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the block supplied by the handle. The required permissions are different for the process that created the handle and all other processes.&lt;br /&gt;
&lt;br /&gt;
Increases reference count for the KSharedMemory object. Thus in order to release the memory associated with the object, all handles to it must be closed and all mappings must be unmapped.&lt;br /&gt;
&lt;br /&gt;
== svcCreateTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;TransferMemory&amp;gt; || Handle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This one reprotects the src block with perms you give it. It also sets bit0 into [[#MemoryAttribute]].&lt;br /&gt;
&lt;br /&gt;
Executable bit perm not allowed.&lt;br /&gt;
&lt;br /&gt;
Closing all handles automatically causes the bit0 in [[#MemoryAttribute]] to clear, and the permission to reset.&lt;br /&gt;
&lt;br /&gt;
== svcWaitSynchronization ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle* || HandlesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || HandlesNum&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u64 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Works with num_handles &amp;lt;= 0x40, error on num_handles == 0.&lt;br /&gt;
&lt;br /&gt;
Does not accept 0xFFFF8001 or 0xFFFF8000 as handles.&lt;br /&gt;
&lt;br /&gt;
=== Object types ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Port:&#039;&#039;&#039; signals when there is an incoming connection waiting to be [[#svcAcceptSession|accepted]].&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Session (server-side):&#039;&#039;&#039; signals when there is an incoming message waiting to be [[#svcReplyAndReceive|received]] or the pipe is closed.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. One of the objects was signalled before the timeout expired. Handle index is updated to indicate which object signalled.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xe401:&#039;&#039;&#039; Invalid handle. Returned when one of the handles passed is invalid. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. Returned when no objects have been signalled within the timeout. Handle index is not updated.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemTick ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X0 || u64 || Ticks&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns the value of cntpct_el0.&lt;br /&gt;
&lt;br /&gt;
The frequency is 19200000 Hz (constant from official sw).&lt;br /&gt;
&lt;br /&gt;
Official sw reads cntpct_el0 directly from usermode without using this SVC. [[ExeFS|sdk-nso]] has this SVC, but it&#039;s not known to be called anywhere.&lt;br /&gt;
&lt;br /&gt;
== svcSendSyncRequestWithUserBuffer ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || CmdPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Session&amp;gt; || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must be 0x1000-aligned.&lt;br /&gt;
&lt;br /&gt;
== svcBreak ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || Break Reason&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 ||&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Info&lt;br /&gt;
|-&lt;br /&gt;
| (Out) ? || ? || ?&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
When used on retail where inx0 bit31 is clear, the system will throw a [[Error_codes|fatal-error]]. Otherwise when bit31 is set, it will return 0 and notify the debugger?&lt;br /&gt;
&lt;br /&gt;
== svcGetInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Process || 0 || 0 || AllowedCpuIdBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 1 || 0 || AllowedThreadPrioBitmask&lt;br /&gt;
|-&lt;br /&gt;
| Process || 2 || 0 || MapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 3 || 0 || MapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 4 || 0 || HeapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 5 || 0 || HeapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 6 || 0 || TotalMemoryAvailable. Total memory available(free+used).&lt;br /&gt;
|-&lt;br /&gt;
| Process || 7 || 0 || TotalMemoryUsage. Total used size of codebin memory + main-thread stack + allocated heap.&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 8 || 0 || IsCurrentProcessBeingDebugged&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 9 || 0 || Returns ResourceLimit handle for current process. Used by [[Process_Manager_services|PM]].&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 10 || -1, {current coreid} || IdleTickCount&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 11 || 0-3 || RandomEntropy from current process. TRNG. Used to seed usermode PRNGs.&lt;br /&gt;
|-&lt;br /&gt;
| Process || 12 || 0 || [2.0.0+] AddressSpaceBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 13 || 0 || [2.0.0+] AddressSpaceSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 14 || 0 || [2.0.0+] NewMapRegionBaseAddr&lt;br /&gt;
|-&lt;br /&gt;
| Process || 15 || 0 || [2.0.0+] NewMapRegionSize&lt;br /&gt;
|-&lt;br /&gt;
| Process || 16 || 0 || [3.0.0+] IsVirtualMemoryEnabled&lt;br /&gt;
|-&lt;br /&gt;
| Process || 17 || 0 || [3.0.0+] PersonalMmHeapUsage&lt;br /&gt;
|-&lt;br /&gt;
| Process || 18 || 0 || [3.0.0+] TitleId&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 0 || [4.0.0-4.1.0] PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 19 || 1 || [4.0.0-4.1.0] PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
| Process || 20 || 0 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|-&lt;br /&gt;
| Thread  || 0xF0000002 || 0 || Performance counter related.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemory ==&lt;br /&gt;
This is like svcSetHeapSize except you can allocate heap at any address you&#039;d like.&lt;br /&gt;
&lt;br /&gt;
Uses current process pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcDumpInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) None || || &lt;br /&gt;
|-&lt;br /&gt;
| (Out) None || ||&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Does nothing, just returns with registers set to all-zero.&lt;br /&gt;
&lt;br /&gt;
== svcAcceptSession ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Port&amp;gt; || Port&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;ServerSession&amp;gt; || Session&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf201:&#039;&#039;&#039; No session waiting to be accepted&lt;br /&gt;
&lt;br /&gt;
== svcReplyAndReceive ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || *Handle&amp;lt;Port or ServerSession&amp;gt; || Handles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u32 || NumHandles&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || Handle&amp;lt;ServerSession&amp;gt; || ReplyTarget&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 (nanoseconds) || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Result&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || u32 || HandleIndex&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
If ReplyTarget is not zero, a reply from the TLS will be sent to that session.&lt;br /&gt;
Then it will wait until either of the passed sessions has an incoming message, is closed, a passed port has an incoming connection, or the timeout expires.&lt;br /&gt;
If there is an incoming message, it is copied to the TLS.&lt;br /&gt;
&lt;br /&gt;
After being validated, passed handles will be enumerated in order; even if a session has been closed, if one that appears earlier in the list has an incoming message, it will take priority and a result code of 0x0 will be returned.&lt;br /&gt;
&lt;br /&gt;
=== Result codes ===&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0x0:&#039;&#039;&#039; Success. Either a session has an incoming message or a port has an incoming connection. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xea01:&#039;&#039;&#039; Timeout. No handles were signalled before the timeout expired. HandleIndex is not updated.&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;0xf601:&#039;&#039;&#039; Port remote dead. One of the sessions has been closed. HandleIndex is set appropriately.&lt;br /&gt;
&lt;br /&gt;
== svcMapPhysicalMemoryUnsafe ==&lt;br /&gt;
Same as [[#svcMapPhysicalMemory]] except it always uses pool partition 0.&lt;br /&gt;
&lt;br /&gt;
== svcCreateCodeMemory ==&lt;br /&gt;
Takes an address range with backing memory to create the code memory object.&lt;br /&gt;
&lt;br /&gt;
The memory is initially memset to 0xFF after being locked.&lt;br /&gt;
&lt;br /&gt;
== svcControlCodeMemory ==&lt;br /&gt;
Maps the backing memory for a Code memory object into the current process.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapOwner]], memory permission must be RW-.&lt;br /&gt;
&lt;br /&gt;
For [[#CodeMemoryOperation|CodeMemoryOperation_MapSlave]], memory permission must be R-- or R-X.&lt;br /&gt;
&lt;br /&gt;
Operations [[#CodeMemoryOperation|CodeMemoryOperation_UnmapOwner/CodeMemoryOperation_UnmapSlave]] unmap memory that was previously mapped this way.&lt;br /&gt;
&lt;br /&gt;
This allows one &amp;quot;secure JIT&amp;quot; process to map the code memory as RW-, and the other &amp;quot;slave&amp;quot; process to map it R-X.&lt;br /&gt;
&lt;br /&gt;
[5.0.0+] Error 0xE401 is now returned when the process owner of the Code memory object is the same as the current process.&lt;br /&gt;
&lt;br /&gt;
== svcReadWriteRegister ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || RegAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || u64 || RwMask&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || u64 || InValue&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1|| u64 || OutValue&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Read/write IO registers with a hardcoded whitelist. Input address is physical-address and must be aligned to 4.&lt;br /&gt;
&lt;br /&gt;
rw_mask is 0 for reading and 0xffffffff for writing. You can also write individual bits by using a mask value.&lt;br /&gt;
&lt;br /&gt;
You can only write to registers inside physical pages 0x70019000 (MC), 0x7001C000 (MC0), 0x7001D000 (MC1), and they all share the same whitelist.&lt;br /&gt;
&lt;br /&gt;
The whitelist is same for writing as for reading.&lt;br /&gt;
&lt;br /&gt;
The whitelist is:&lt;br /&gt;
&lt;br /&gt;
0x054, 0x090, 0x094, 0x098, 0x09c, 0x0a0, 0x0a4, 0x0a8, 0x0ac, 0x0b0, 0x0b4, 0x0b8, 0x0bc, 0x0c0, 0x0c4, 0x0c8, 0x0d0, 0x0d4, 0x0d8, 0x0dc, 0x0e0, 0x100, 0x108, 0x10c, 0x118, 0x11c, 0x124, 0x128, 0x12c, 0x130, 0x134, 0x138, 0x13c, 0x158, 0x15c, 0x164, 0x168, 0x16c, 0x170, 0x174, 0x178, 0x17c, 0x200, 0x204, 0x2e4, 0x2e8, 0x2ec, 0x2f4, 0x2f8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37c, 0x380, 0x390, 0x394, 0x398, 0x3ac, 0x3b8, 0x3bc, 0x3c0, 0x3c4, 0x3d8, 0x3e8, 0x41c, 0x420, 0x424, 0x428, 0x42c, 0x430, 0x44c, 0x47c, 0x480, 0x484, 0x50c, 0x554, 0x558, 0x55c, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69c, 0x6a0, 0x6a4, 0x6c0, 0x6c4, 0x6f0, 0x6f4, 0x960, 0x970, 0x974, 0xa20, 0xa24, 0xb88, 0xb8c, 0xbc4, 0xbc8, 0xbcc, 0xbd0, 0xbd4, 0xbd8, 0xbdc, 0xbe0, 0xbe4, 0xbe8, 0xbec, 0xc00, 0xc5c, 0xcac&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] Whitelist was extended with 0x4c4, 0x4c8, 0x4cc, 0x584, 0x588, 0x58c.&lt;br /&gt;
&lt;br /&gt;
[2.0.0+] The IO registers in range 0x7000E400 (PMC) size 0xC00 skip the whitelist, and do a TrustZone call using [[SMC]] Id1 0xC3000008(ReadWriteRegister).&lt;br /&gt;
&lt;br /&gt;
[4.0.0+] Access to the Memory Controller (0x70019000) also uses smcReadWriteRegister.&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by that SMC, relative to the start of the PMC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x00c, 0x010, 0x014, 0x01c, 0x020, 0x02c, 0x030, 0x034, 0x038, 0x03c, 0x040, 0x044, 0x048, 0x0dc, 0x0e0, 0x0e4, 0x160, 0x164, 0x168, 0x170, 0x1a8, 0x1b8, 0x1bc, 0x1c0, 0x1c4, 0x1c8, 0x2b4, 0x2d4, 0x440, 0x4d8&lt;br /&gt;
&lt;br /&gt;
Here is the whitelist imposed by smcReadWriteRegister (checked in addition to the whitelist in svcReadWriteRegister), relative to the start of the MC registers:&lt;br /&gt;
&lt;br /&gt;
0x000, 0x004, 0x008, 0x00C, 0x010, 0x01C, 0x020, 0x030, 0x034, 0x050, 0x054, 0x090, 0x094, 0x098, 0x09C, 0x0A0, 0x0A4, 0x0A8, 0x0AC, 0x0B0, 0x0B4, 0x0B8, 0x0BC, 0x0C0, 0x0C4, 0x0C8, 0x0D0, 0x0D4, 0x0D8, 0x0DC, 0x0E0, 0x100, 0x108, 0x10C, 0x118, 0x11C, 0x124, 0x128, 0x12C, 0x130, 0x134, 0x138, 0x13C, 0x158, 0x15C, 0x164, 0x168, 0x16C, 0x170, 0x174, 0x178, 0x17C, 0x200, 0x204, 0x238, 0x240, 0x244, 0x250, 0x254, 0x258, 0x264, 0x268, 0x26C, 0x270, 0x274, 0x280, 0x284, 0x288, 0x28C, 0x294, 0x2E4, 0x2E8, 0x2EC, 0x2F4, 0x2F8, 0x310, 0x314, 0x320, 0x328, 0x344, 0x348, 0x370, 0x374, 0x37C, 0x380, 0x390, 0x394, 0x398, 0x3AC, 0x3B8, 0x3BC, 0x3C0, 0x3C4, 0x3D8, 0x3E8, 0x41C, 0x420, 0x424, 0x428, 0x42C, 0x430, 0x44C, 0x47C, 0x480, 0x484, 0x4C4, 0x4C8, 0x4CC, 0x50C, 0x554, 0x558, 0x55C, 0x584, 0x588, 0x58C, 0x670, 0x674, 0x690, 0x694, 0x698, 0x69C, 0x6A0, 0x6A4, 0x6C0, 0x6C4, 0x6F0, 0x6F4, 0x960, 0x970, 0x974, 0x9B8, 0xA20, 0xA24, 0xA88, 0xA94, 0xA98, 0xA9C, 0xAA0, 0xAA4, 0xAA8, 0xAAC, 0xAB0, 0xAB4, 0xAB8, 0xABC, 0xAC0, 0xAC4, 0xAC8, 0xACC, 0xAD0, 0xAD4, 0xAD8, 0xADC, 0xAE0, 0xB88, 0xB8C, 0xBC4, 0xBC8, 0xBCC, 0xBD0, 0xBD4, 0xBD8, 0xBDC, 0xBE0, 0xBE4, 0xBE8, 0xBEC, 0xC00, 0xC5C, 0xCAC&lt;br /&gt;
&lt;br /&gt;
== svcCreateSharedMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || [[#Permission]] || LocalPerm&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || RemotePerm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;SharedMemory&amp;gt; || MemHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Other perm can be used to enforce permission 1, 3, or 0x10000000 if don&#039;t care.&lt;br /&gt;
&lt;br /&gt;
Allocates memory from the current process&#039; pool partition.&lt;br /&gt;
&lt;br /&gt;
== svcMapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
The newly mapped pages will have [[#MemoryState]] type 0xE.&lt;br /&gt;
&lt;br /&gt;
You must pass same size and permissions as given in svcCreateMemoryMirror, otherwise error.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapTransferMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || Handle&amp;lt;TransferMemory&amp;gt; || MemHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || void* || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Size must match size given in map syscall, otherwise there&#039;s an invalid-size error.&lt;br /&gt;
&lt;br /&gt;
== svcQueryPhysicalAddress ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]]|| Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X2 || u64 || KernelAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X3 || u64 || Size&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
== svcQueryIoMapping ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || PhysAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || void* || VirtAddr&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Returns a virtual address mapped to a given IO range.&lt;br /&gt;
&lt;br /&gt;
== svcCreateDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || StartAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || EndAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || AddressSpaceHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Creates a virtual address space for binding device address spaces and returns a handle.&lt;br /&gt;
&lt;br /&gt;
dev_as_start_addr is normally set to 0 and dev_as_end_addr is normally set to 0xFFFFFFFF.&lt;br /&gt;
&lt;br /&gt;
== svcAttachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Attaches a device address space to a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcDetachDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || [[#DeviceName]] || DeviceId&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Detaches a device address space from a [[#DeviceName|device]].&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceByForce ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
dev_map_addr is the userspace destination address, while dev_as_addr is the source address between dev_as_start_addr and dev_as_end_addr (passed to [[#svcCreateDeviceAddressSpace]]).&lt;br /&gt;
&lt;br /&gt;
The userspace destination address must have the [[SVC#MemoryState|MapDeviceAllowed]] bit set. Bit [[SVC#MemoryAttribute|IsDeviceMapped]] will be set after mapping.&lt;br /&gt;
&lt;br /&gt;
== svcMapDeviceAddressSpaceAligned ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W5 || [[#Permission]] || Permissions&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Maps an attached device address space to an userspace address.&lt;br /&gt;
&lt;br /&gt;
Same as [[#svcMapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|MapDeviceAlignedAllowed]] bit set instead.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapDeviceAddressSpace ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;DeviceAddressSpace&amp;gt; || DeviceAsHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || DeviceAsSize&lt;br /&gt;
|-&lt;br /&gt;
| (In) X4 || u64 || DeviceAsAddr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
&#039;&#039;&#039;Description:&#039;&#039;&#039; Unmaps an attached device address space from an userspace address.&lt;br /&gt;
&lt;br /&gt;
== svcGetSystemInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || InfoId&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle || Handle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || InfoSubId&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) X1 || u64 || Out&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Handle type || Id0 || Id1 || Description&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 0 || TotalMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 1 || TotalMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 2 || TotalMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 0 || 3 || TotalMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 0 || CurrentMemorySize_Application&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 1 || CurrentMemorySize_Applet&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 2 || CurrentMemorySize_System&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 1 || 3 || CurrentMemorySize_SystemUnsafe&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 0 || PrivilegedProcessId_LowerBound&lt;br /&gt;
|-&lt;br /&gt;
| Zero    || 2 || 1 || PrivilegedProcessId_UpperBound&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== svcSetProcessMemoryPermission ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (In) W3 || void* || Perm&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
This sets the memory permissions for the specified memory with the supplied process handle.&lt;br /&gt;
&lt;br /&gt;
This throws an error(0xD801) when the input perm is &amp;gt;0x5, hence -WX and RWX are not allowed.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || void* || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Maps the src address from the supplied process handle into the current process.&lt;br /&gt;
&lt;br /&gt;
This allows mapping code and rodata with RW- permission.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || void* || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcQueryProcessMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X0 || [[#MemoryInfo]]* || MemInfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) W2 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Addr&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || PageInfo || PageInfo&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Equivalent to [[#svcQueryMemory]] except takes a process handle.&lt;br /&gt;
&lt;br /&gt;
== svcMapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a process handle, and maps normal heap in that process as executable code in that process. Used when loading NROs. This does not support using the current-process handle alias.&lt;br /&gt;
&lt;br /&gt;
== svcUnmapProcessCodeMemory ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || u64 || DstAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || SrcAddr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || Size&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Unmaps what was mapped by [[#svcMapProcessCodeMemory]].&lt;br /&gt;
&lt;br /&gt;
== svcCreateProcess ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) X1 || [[#CreateProcessInfo]]* || InfoPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X2 || u64 || CapabilitiesPtr&lt;br /&gt;
|-&lt;br /&gt;
| (In) X3 || u64 || CapabilitiesNum&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Takes a [[#CreateProcessInfo]] as input.&lt;br /&gt;
&lt;br /&gt;
== svcGetProcessInfo ==&lt;br /&gt;
&lt;br /&gt;
&amp;lt;div style=&amp;quot;display: inline-block;&amp;quot;&amp;gt;&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Argument || Type || Name&lt;br /&gt;
|-&lt;br /&gt;
| (In) W0 || Handle&amp;lt;Process&amp;gt; || ProcessHandle&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W0 || [[#Result]] || Ret&lt;br /&gt;
|-&lt;br /&gt;
| (Out) W1 || [[#ProcessState]] || State&lt;br /&gt;
|}&lt;br /&gt;
&amp;lt;/div&amp;gt;&lt;br /&gt;
&lt;br /&gt;
Returns an enum with value 0-7.&lt;br /&gt;
&lt;br /&gt;
== Debugging ==&lt;br /&gt;
[2.0.0+] Exactly 6 debug SVCs require that [[SPL_services#GetConfig|IsDebugMode]] is non-zero. Error 0x4201 is returned otherwise.&lt;br /&gt;
* svcBreakDebugProcess&lt;br /&gt;
* svcContinueDebugEvent&lt;br /&gt;
* svcWriteDebugProcessMemory&lt;br /&gt;
* svcSetDebugThreadContext&lt;br /&gt;
* svcTerminateDebugProcess&lt;br /&gt;
* svcSetHardwareBreakPoint&lt;br /&gt;
&lt;br /&gt;
svcDebugActiveProcess stops execution of the target process, the normal method for resuming it requires svcContinueDebugEvent(see above). Closing the debug handle also results in execution being resumed.&lt;br /&gt;
&lt;br /&gt;
= Enum/Structures =&lt;br /&gt;
== ThreadContextRequestFlags ==&lt;br /&gt;
Bitfield of one of more of these:&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || NormalContext&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || 8 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DeviceName ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DeviceName_AFI&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DeviceName_AVPC&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DeviceName_DC&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DeviceName_DCB&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DeviceName_HC&lt;br /&gt;
|-&lt;br /&gt;
| 5 || DeviceName_HDA&lt;br /&gt;
|-&lt;br /&gt;
| 6 || DeviceName_ISP2&lt;br /&gt;
|-&lt;br /&gt;
| 7 || DeviceName_MSENCNVENC&lt;br /&gt;
|-&lt;br /&gt;
| 8 || DeviceName_NV&lt;br /&gt;
|-&lt;br /&gt;
| 9 || DeviceName_NV2&lt;br /&gt;
|-&lt;br /&gt;
| 10 || DeviceName_PPCS&lt;br /&gt;
|-&lt;br /&gt;
| 11 || DeviceName_SATA&lt;br /&gt;
|-&lt;br /&gt;
| 12 || DeviceName_VI&lt;br /&gt;
|-&lt;br /&gt;
| 13 || DeviceName_VIC&lt;br /&gt;
|-&lt;br /&gt;
| 14 || DeviceName_XUSB_HOST&lt;br /&gt;
|-&lt;br /&gt;
| 15 || DeviceName_XUSB_DEV&lt;br /&gt;
|-&lt;br /&gt;
| 16 || DeviceName_TSEC&lt;br /&gt;
|-&lt;br /&gt;
| 17 || DeviceName_PPCS1&lt;br /&gt;
|-&lt;br /&gt;
| 18 || DeviceName_DC1&lt;br /&gt;
|-&lt;br /&gt;
| 19 || DeviceName_SDMMC1A&lt;br /&gt;
|-&lt;br /&gt;
| 20 || DeviceName_SDMMC2A&lt;br /&gt;
|-&lt;br /&gt;
| 21 || DeviceName_SDMMC3A&lt;br /&gt;
|-&lt;br /&gt;
| 22 || DeviceName_SDMMC4A&lt;br /&gt;
|-&lt;br /&gt;
| 23 || DeviceName_ISP2B&lt;br /&gt;
|-&lt;br /&gt;
| 24 || DeviceName_GPU&lt;br /&gt;
|-&lt;br /&gt;
| 25 || DeviceName_GPUB&lt;br /&gt;
|-&lt;br /&gt;
| 26 || DeviceName_PPCS2&lt;br /&gt;
|-&lt;br /&gt;
| 27 || DeviceName_NVDEC&lt;br /&gt;
|-&lt;br /&gt;
| 28 || DeviceName_APE&lt;br /&gt;
|-&lt;br /&gt;
| 29 || DeviceName_SE&lt;br /&gt;
|-&lt;br /&gt;
| 30 || DeviceName_NVJPG&lt;br /&gt;
|-&lt;br /&gt;
| 31 || DeviceName_HC1&lt;br /&gt;
|-&lt;br /&gt;
| 32 || DeviceName_SE1&lt;br /&gt;
|-&lt;br /&gt;
| 33 || DeviceName_AXIAP&lt;br /&gt;
|-&lt;br /&gt;
| 34 || DeviceName_ETR&lt;br /&gt;
|-&lt;br /&gt;
| 35 || DeviceName_TSECB&lt;br /&gt;
|-&lt;br /&gt;
| 36 || DeviceName_TSEC1&lt;br /&gt;
|-&lt;br /&gt;
| 37 || DeviceName_TSECB1&lt;br /&gt;
|-&lt;br /&gt;
| 38 || DeviceName_NVDEC1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CodeMemoryOperation ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || CodeMemoryOperation_MapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 1 || CodeMemoryOperation_MapSlave&lt;br /&gt;
|-&lt;br /&gt;
| 2 || CodeMemoryOperation_UnmapOwner&lt;br /&gt;
|-&lt;br /&gt;
| 3 || CodeMemoryOperation_UnmapSlave&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
&lt;br /&gt;
== LimitableResource ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || LimitableResource_Memory&lt;br /&gt;
|-&lt;br /&gt;
| 1 || LimitableResource_Threads&lt;br /&gt;
|-&lt;br /&gt;
| 2 || LimitableResource_Events&lt;br /&gt;
|-&lt;br /&gt;
| 3 || LimitableResource_TransferMemories&lt;br /&gt;
|-&lt;br /&gt;
| 4 || LimitableResource_Sessions&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ProcessEvent ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0 || ProcessEvent_Created ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || ProcessEvent_DebugAttached ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || ProcessEvent_DebugDetached ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || ProcessEvent_Crashed || Processes will not enter this state unless they were created with [[#CreateProcessInfo|EnableDebug]].&lt;br /&gt;
|-&lt;br /&gt;
| 4 || ProcessEvent_Running ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 || ProcessEvent_Exiting ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 || ProcessEvent_Exited ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ProcessEvent_DebugSuspended ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugThreadParam ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugThreadParam_ActualPriority&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || DebugThreadParam_CpuCore&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugThreadParam_CoreMask&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== CreateProcessInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 12 || || ProcessName (doesn&#039;t have to be null-terminated)&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 4 || || ProcessCategory (0: regular title, 1: kernel built-in)&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 8 || || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 8 || || CodeAddr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || || CodeNumPages&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit0 || IsAarch64&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit3-1 || [[#AddressSpaceType]]&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit4 || [2.0.0+] EnableDebug&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit5 || EnableAslr&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit6 || UseSystemMemBlocks&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit7 || [4.0.0] ?&lt;br /&gt;
|-&lt;br /&gt;
| || || Bit10-7 || [5.0.0+] PoolPartition (0=Application, 1=Applet, 2=Sysmodule, 3=Nvservices)&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || 4 || || ResourceLimitHandle&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || 4 || || [3.0.0+] PersonalMmHeapNumPages&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
On [1.0.0] there&#039;s only one pool.&lt;br /&gt;
&lt;br /&gt;
On [2.0.0-4.0.0] PoolPartition is 1 for built-ins and 0 for rest.&lt;br /&gt;
&lt;br /&gt;
On [5.0.0] PoolPartition is specified in CreateProcessArgs. There are now 4 pool partitions.&lt;br /&gt;
&lt;br /&gt;
=== AddressSpaceType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Type || Name || Width || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Normal_32Bit || 32 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Normal_36Bit || 36 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 || WithoutMap_32Bit || 32 || Appears to be missing map region [?]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [2.0.0+] Normal_39Bit || 39 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryInfo ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 8 || BaseAddress&lt;br /&gt;
|-&lt;br /&gt;
| 8 || 8 || Size&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || 4 || MemoryType: lower 8 bits of [[#MemoryState]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x14 || 4 || [[#MemoryAttribute]]&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || 4 || Permission (bit0: R, bit1: W, bit2: X)&lt;br /&gt;
|-&lt;br /&gt;
| 0x1C || 4 || IpcRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || 4 || DeviceRefCount&lt;br /&gt;
|-&lt;br /&gt;
| 0x24 || 4 || Padding: always zero&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryAttribute ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || IsBorrowed&lt;br /&gt;
|-&lt;br /&gt;
| 1 || IsIpcMapped: when IpcRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 2 || IsDeviceMapped: when DeviceRefCount &amp;gt; 0.&lt;br /&gt;
|-&lt;br /&gt;
| 3 || IsUncached&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== MemoryState ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bits || Description&lt;br /&gt;
|-&lt;br /&gt;
| 7-0 || Type&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#svcSetMemoryPermission|PermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || ForceReadWritableByDebugSyscalls&lt;br /&gt;
|-&lt;br /&gt;
| 10 || IpcSendAllowed_Type0&lt;br /&gt;
|-&lt;br /&gt;
| 11 || IpcSendAllowed_Type3&lt;br /&gt;
|-&lt;br /&gt;
| 12 || IpcSendAllowed_Type1&lt;br /&gt;
|-&lt;br /&gt;
| 14 || [[#svcSetProcessMemoryPermission|ProcessPermissionChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 15 || [[#svcMapMemory|MapAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 16 || [[#svcUnmapProcessCodeMemory|UnmapProcessCodeMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 17 || [[#svcCreateTransferMemory|TransferMemoryAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 18 || [[#svcQueryPhysicalAddress|QueryPhysicalAddressAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 19 || MapDeviceAllowed ([[#svcMapDeviceAddressSpace]] and [[#svcMapDeviceAddressSpaceByForce]])&lt;br /&gt;
|-&lt;br /&gt;
| 20 || [[#svcMapDeviceAddressSpaceAligned|MapDeviceAlignedAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 21 || [[#svcSendSyncRequestWithUserBuffer|IpcBufferAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 22 || IsPoolAllocated/IsReferenceCounted&lt;br /&gt;
|-&lt;br /&gt;
| 23 || [[#svcMapProcessMemory|MapProcessAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 24 || [[#svcSetMemoryAttribute|AttributeChangeAllowed]]&lt;br /&gt;
|-&lt;br /&gt;
| 25 || [4.0.0+] CodeMemoryAllowed&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Type || Meaning&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000000 || MemoryType_Unmapped ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002001 || MemoryType_Io || Mapped by kernel capability parsing in [[#svcCreateProcess]]. &lt;br /&gt;
|-&lt;br /&gt;
| 0x00042002 || MemoryType_Normal || Mapped by kernel capability parsing in [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DC7E03 || MemoryType_CodeStatic || Mapped during [[#svcCreateProcess]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FEBD04&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FEBD04&lt;br /&gt;
|| MemoryType_CodeMutable || Transition from 0xDC7E03 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
0x017EBD05&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x037EBD05&lt;br /&gt;
|| MemoryType_Heap || Mapped using [[#svcSetHeapSize]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402006 || MemoryType_SharedMemory || Mapped using [[#svcMapSharedMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00482907 || [1.0.0] MemoryType_WeirdMappedMemory || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00DD7E08 || MemoryType_ModuleCodeStatic || Mapped using [[#svcMapProcessCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| [1.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x01FFBD09&lt;br /&gt;
&lt;br /&gt;
[4.0.0+]&lt;br /&gt;
&lt;br /&gt;
0x03FFBD09&lt;br /&gt;
|| MemoryType_ModuleCodeMutable || Transition from 0xDD7E08 performed by [[#svcSetProcessMemoryPermission]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0A || [[IPC_Marshalling|MemoryType_IpcBuffer0]] || IPC buffers with descriptor flags=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3C0B || MemoryType_MappedMemory || Mapped using [[#svcMapMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040200C || [[Thread Local Storage|MemoryType_ThreadLocal]] || Mapped during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x015C3C0D || MemoryType_TransferMemoryIsolated || Mapped using [[#svcMapTransferMemory]] when the owning process has perm=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C380E || MemoryType_TransferMemory || Mapped using [[#svcMapTransferMemory]] when the owning process has perm!=0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0040380F || MemoryType_ProcessMemory || Mapped using [[#svcMapProcessMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000010 || MemoryType_Reserved ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x005C3811 || [[IPC_Marshalling|MemoryType_IpcBuffer1]] || IPC buffers with descriptor flags=1.&lt;br /&gt;
|-&lt;br /&gt;
| 0x004C2812 || [[IPC_Marshalling|MemoryType_IpcBuffer3]] || IPC buffers with descriptor flags=3.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00002013 || MemoryType_KernelStack || Mapped in kernel during [[#svcCreateThread]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402214 || [4.0.0+] MemoryType_CodeReadOnly || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|-&lt;br /&gt;
| 0x00402015 || [4.0.0+] MemoryType_CodeWritable || Mapped in kernel during [[#svcControlCodeMemory]].&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== ContinueDebugFlags ==&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Bit || Bitmask || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || 1 || CancelSynchronization (only if ResumeAllThreads is set; cancels with error 0x6C01)&lt;br /&gt;
|-&lt;br /&gt;
| 1 || 2 || SwallowException&lt;br /&gt;
|-&lt;br /&gt;
| 2 || 4 || ResumeAllThreads&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== DebugEventInfo ==&lt;br /&gt;
&lt;br /&gt;
Size: 0x40&lt;br /&gt;
&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0 || u32 || EventType&lt;br /&gt;
|-&lt;br /&gt;
| 4 || u32 || Flags (bit0: NeedsContinue)&lt;br /&gt;
|-&lt;br /&gt;
| 8 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || || PerTypeSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachProcess specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || TitleId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || ProcessId&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || char[12] || ProcessName&lt;br /&gt;
|-&lt;br /&gt;
| 0x2C || u32 || MmuFlags&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || [5.0.0+] UserExceptionContextAddr&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
AttachThread specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ThreadId&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || TlsPtr&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u64 || Entrypoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exit specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || Type (0=PausedThread, 1=RunningThread, 2=TerminatedProcess)&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
Exception specific:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || u64 || ExceptionType&lt;br /&gt;
|-&lt;br /&gt;
| 0x18 || u64 || FaultRegister&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || || PerExceptionSpecifics&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugEventType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || DebugEvent_AttachProcess&lt;br /&gt;
|-&lt;br /&gt;
| 1 || DebugEvent_AttachThread&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 || DebugEvent_Exit&lt;br /&gt;
|-&lt;br /&gt;
| 4 || DebugEvent_Exception&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== DebugExceptionType ===&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Value || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Exception_UndefinedInstruction&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Exception_InstructionAbort&lt;br /&gt;
|-&lt;br /&gt;
| 2 || Exception_DataAbortMisc&lt;br /&gt;
|-&lt;br /&gt;
| 3 || Exception_PcSpAlignmentFault&lt;br /&gt;
|-&lt;br /&gt;
| 4 || Exception_DebuggerAttached&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Exception_BreakPoint&lt;br /&gt;
|-&lt;br /&gt;
| 6 || Exception_UserBreak&lt;br /&gt;
|-&lt;br /&gt;
| 7 || Exception_DebuggerBreak&lt;br /&gt;
|-&lt;br /&gt;
| 8 || Exception_BadSvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UndefinedInstruction specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Opcode&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BreakPoint specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || IsWatchpoint&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
UserBreak specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || Info0&lt;br /&gt;
|-&lt;br /&gt;
| 0x28 || u64 || Info1&lt;br /&gt;
|-&lt;br /&gt;
| 0x30 || u64 || Info2&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
BadSvcId specifics:&lt;br /&gt;
{| class=wikitable&lt;br /&gt;
! Offset || Length || Description&lt;br /&gt;
|-&lt;br /&gt;
| 0x20 || u32 || SvcId&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Exception handling =&lt;br /&gt;
There is userland code for handling exceptions, however this doesn&#039;t seem to be executed on retail mode.&lt;br /&gt;
&lt;br /&gt;
When a usermode exception occurs, it jumps to the main code binary entrypoint (main_binary_address + 0 == &#039;&#039;&#039;_start&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
During normal boot &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=0 and X1=main_thread_handle (triggering normal crt0 setup).&lt;br /&gt;
During an usermode exception &#039;&#039;&#039;_start&#039;&#039;&#039; is invoked with X0=exception_info0_ptr and X1=exception_info1_ptr instead.&lt;br /&gt;
&lt;br /&gt;
The &#039;&#039;&#039;_start&#039;&#039;&#039; method determines whether to boot normally or handle an exception if X0 is set to 0 or not.&lt;/div&gt;</summary>
		<author><name>Cyuubi</name></author>
	</entry>
	<entry>
		<id>https://switchbrew.org/w/index.php?title=NV_services&amp;diff=4658</id>
		<title>NV services</title>
		<link rel="alternate" type="text/html" href="https://switchbrew.org/w/index.php?title=NV_services&amp;diff=4658"/>
		<updated>2018-05-18T14:31:11Z</updated>

		<summary type="html">&lt;p&gt;Cyuubi: Add FinishInitialize&lt;/p&gt;
&lt;hr /&gt;
&lt;div&gt;The Switch uses a customized NVIDIA driver.&lt;br /&gt;
&lt;br /&gt;
= nvdrv, nvdrv:a, nvdrv:s, nvdrv:t =&lt;br /&gt;
This is &amp;quot;nns::nvdrv::INvDrvServices&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
Main NVIDIA driver service.&lt;br /&gt;
&lt;br /&gt;
Each service is used by:&lt;br /&gt;
* &amp;quot;nvdrv&amp;quot;: regular applications&lt;br /&gt;
* &amp;quot;nvdrv:a&amp;quot;: applets&lt;br /&gt;
* &amp;quot;nvdrv:s&amp;quot;: sysmodules&lt;br /&gt;
* &amp;quot;nvdrv:t&amp;quot;: factory titles&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#Open]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#Ioctl]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#Close]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 || [[#Initialize]]&lt;br /&gt;
|-&lt;br /&gt;
| 4 || [[#QueryEvent]]&lt;br /&gt;
|-&lt;br /&gt;
| 5 || [[#MapSharedMem]]&lt;br /&gt;
|-&lt;br /&gt;
| 6 || [[#GetStatus]]&lt;br /&gt;
|-&lt;br /&gt;
| 7 || [[#ForceSetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 8 || [[#SetClientPID]]&lt;br /&gt;
|-&lt;br /&gt;
| 9 || [[#DumpGraphicsMemoryInfo]]&lt;br /&gt;
|-&lt;br /&gt;
| 10 || [3.0.0+] [[#InitializeDevtools]]&lt;br /&gt;
|-&lt;br /&gt;
| 11 || [3.0.0+] [[#Ioctl2]]&lt;br /&gt;
|-&lt;br /&gt;
| 12 || [3.0.0+] [[#Ioctl3]]&lt;br /&gt;
|-&lt;br /&gt;
| 13 || [3.0.0+] FinishInitialize&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Open ==&lt;br /&gt;
Takes a type-0x5 input buffer for the device-path. Returns the output 32bit &#039;&#039;&#039;fd&#039;&#039;&#039; and the u32 &#039;&#039;&#039;error_code&#039;&#039;&#039;.&lt;br /&gt;
&lt;br /&gt;
== Ioctl ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;, an u32 &#039;&#039;&#039;ioctl_cmd&#039;&#039;&#039;, a type-0x21 input buffer, and a type-0x22 output buffer. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
The addr/size for send/recv buffers are only set when the associated direction bit is set in the ioctl cmd (addr/size = 0 otherwise).&lt;br /&gt;
&lt;br /&gt;
== Close ==&lt;br /&gt;
Takes a 32bit &#039;&#039;&#039;fd&#039;&#039;&#039;. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Initialize ==&lt;br /&gt;
Takes two copy-handles (&#039;&#039;&#039;current_process&#039;&#039;&#039; and &#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and an input u32 (&#039;&#039;&#039;transfer_memory_size&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
Webkit applet creates the transfer-memory with perm = 0 and size 0x300000.&lt;br /&gt;
&lt;br /&gt;
== QueryEvent ==&lt;br /&gt;
Takes two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;event_id&#039;&#039;&#039;), with the second word immediately after the first one. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;) and a copy-handle (&#039;&#039;&#039;event_handle&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
QueryEvent is only supported on (and implemented differently on):&lt;br /&gt;
* /dev/nvhost-gpu&lt;br /&gt;
** 1: SmException_BptIntReport&lt;br /&gt;
** 2: SmException_BptPauseReport&lt;br /&gt;
** 3: ErrorNotifierEvent&lt;br /&gt;
* /dev/nvhost-ctrl: Used to get events for SyncPts.&lt;br /&gt;
** If bit31-28 is 1, then lower 16-bits contain event_slot, bit27-16 contain syncpt_number. &lt;br /&gt;
** If bit31-28 is 0, then lower 4-bits contain event_slot, bit31-4 contains syncpt_number.&lt;br /&gt;
* /dev/nvhost-ctrl-gpu&lt;br /&gt;
** 1: Returns error_event_handle.&lt;br /&gt;
** 2: Returns unknown event.&lt;br /&gt;
* /dev/nvhost-dbg-gpu&lt;br /&gt;
** Ignores event_id.&lt;br /&gt;
&lt;br /&gt;
== MapSharedMem ==&lt;br /&gt;
Takes a copy-handle (&#039;&#039;&#039;transfer_memory&#039;&#039;&#039;) and two input u32s (&#039;&#039;&#039;fd&#039;&#039;&#039; and &#039;&#039;&#039;nvmap_handle&#039;&#039;&#039;). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== GetStatus ==&lt;br /&gt;
Takes no input. Returns 0x10-bytes and an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== ForceSetClientPID ==&lt;br /&gt;
Takes an input u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== SetClientPID ==&lt;br /&gt;
Takes a PID-descriptor and an u64 which must [[IPC_Marshalling|match]] the user-process PID ([[AM_services|AppletResourceUserId]]). Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== DumpGraphicsMemoryInfo ==&lt;br /&gt;
No input or output. Does nothing.&lt;br /&gt;
&lt;br /&gt;
== InitializeDevtools ==&lt;br /&gt;
Takes a copy-handle and an input u32. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl2 ==&lt;br /&gt;
Takes a type-0x21 buffer, a type-0x22 buffer, a type-0x21 buffer, and two input u32s. Returns an output u32 (&#039;&#039;&#039;error_code&#039;&#039;&#039;).&lt;br /&gt;
&lt;br /&gt;
== Ioctl3 ==&lt;br /&gt;
Same input/output as Ioctl2, except cmdhdr_word1 is 0x100B instead of 0xC0B.&lt;br /&gt;
&lt;br /&gt;
== Cmd13 ==&lt;br /&gt;
Takes an input u64. No output.&lt;br /&gt;
&lt;br /&gt;
Official user-processes starting with 3.0.0 now use this at the end of nvdrv service init with value 0x1.&lt;br /&gt;
&lt;br /&gt;
= Ioctls =&lt;br /&gt;
The ioctl number is generated with the following primitive (see Linux kernel):&lt;br /&gt;
&lt;br /&gt;
 #define _IOC(inout, group, num, len) \&lt;br /&gt;
    (inout | ((len &amp;amp; IOCPARM_MASK) &amp;lt;&amp;lt; 16) | ((group) &amp;lt;&amp;lt; 8) | (num))&lt;br /&gt;
&lt;br /&gt;
The following table contains known ioctls.&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080014 || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040015 || In || 4 || [[#NVHOST_IOCTL_CTRL_SYNCPT_INCR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0016 || Inout || 12 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080017 || In || 8 || [[#NVHOST_IOCTL_CTRL_MODULE_MUTEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180018 || Inout || 24 || [[#NVHOST_IOCTL_CTRL_MODULE_REGRDWR]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100019 || Inout || 16 || [[#NVHOST_IOCTL_CTRL_SYNCPT_WAITEX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008001A || Inout || 8 || [[#NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC183001B || Inout || 387 || [[#NVHOST_IOCTL_CTRL_GET_CONFIG]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001C || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_SIGNAL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001D || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010001E || Inout || 16 || [[#NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004001F || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_REGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040020 || Inout || 4 || [[#NVHOST_IOCTL_CTRL_EVENT_UNREGISTER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080021 || In || 8 || [[#NVHOST_IOCTL_CTRL_EVENT_KILL]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_INCR ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAIT ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 thresh;&lt;br /&gt;
    __in s32 timeout;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_MUTEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 lock;        // (0==unlock; 1==lock)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_MODULE_REGRDWR ===&lt;br /&gt;
Identical to Linux driver. Uses 32-bit version and doesn&#039;t work.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 id;&lt;br /&gt;
    __in u32 num_offsets;&lt;br /&gt;
    __in u32 block_size;&lt;br /&gt;
    __in u32 offsets;&lt;br /&gt;
    __in u32 values;&lt;br /&gt;
    __in u32 write;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_WAITEX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __in  u32 thresh;&lt;br /&gt;
    __in  s32 timeout;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_SYNCPT_READ_MAX ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 value;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_GET_CONFIG ===&lt;br /&gt;
Gets configured settings. Not available in production mode.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in char domain_str[0x41];       // &amp;quot;nv&amp;quot;&lt;br /&gt;
    __in char param_str[0x41];&lt;br /&gt;
    __out char config_str[0x101];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_SIGNAL ===&lt;br /&gt;
Signals an user event. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT ===&lt;br /&gt;
Waits on an event. If waiting fails, returns error code 0x05 (Timeout) and sets &#039;&#039;&#039;value&#039;&#039;&#039; to ((&#039;&#039;&#039;syncpt_id&#039;&#039;&#039; &amp;lt;&amp;lt; 0x10) | 0x10000000).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    s32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_WAIT_ASYNC ===&lt;br /&gt;
Waits on an event (async version). If waiting fails, returns error code 0x0B (BadValue).&lt;br /&gt;
&lt;br /&gt;
Depending on &#039;&#039;&#039;threshold&#039;&#039;&#039;, an &#039;&#039;&#039;user_event_id&#039;&#039;&#039; may be returned for using with other event ioctls.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 syncpt_id;&lt;br /&gt;
    __in    u32 threshold;&lt;br /&gt;
    __in    u32 timeout;&lt;br /&gt;
    __inout u32 value;           // in=user_event_id (ignored); out=syncpt_value or user_event_id&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_REGISTER ===&lt;br /&gt;
Registers an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_UNREGISTER ===&lt;br /&gt;
Unregisters an user event. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 user_event_id;      // ranges from 0x00 to 0x3F&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVHOST_IOCTL_CTRL_EVENT_KILL ===&lt;br /&gt;
Kills user events. Exclusive to the Switch. &lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 user_events;       // 64-bit bitfield where each bit represents one event&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvmap ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080101 || Inout || 8 || [[#NVMAP_IOC_CREATE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000102 || - || 0 || NVMAP_IOC_CLAIM || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080103 || Inout || 8 || [[#NVMAP_IOC_FROM_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0200104 || Inout || 32 || [[#NVMAP_IOC_ALLOC]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0180105 || Inout || 24 || [[#NVMAP_IOC_FREE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280106 || Inout || 40 || NVMAP_IOC_MMAP || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280107 || Inout || 40 || NVMAP_IOC_WRITE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0280108 || Inout || 40 || NVMAP_IOC_READ || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC00C0109 || Inout || 12 || [[#NVMAP_IOC_PARAM]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010A || Inout || 16 || NVMAP_IOC_PIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010010B || Inout || 16 || NVMAP_IOC_UNPIN_MULT || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010C || Inout || 8 || NVMAP_IOC_CACHE || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010D || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008010E || Inout || 8 || [[#NVMAP_IOC_GET_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004010F || Inout || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040110 || In || 4 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000111 || - || 0 || || Returns NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100112 || In || 16 || NVMAP_IOC_EXPORT_FOR_ARUID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100113 || In || 16 || NVMAP_IOC_IS_OWNED_BY_ARUID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100114 || In || 16 || NVMAP_IOC_REMOVE_EXPORT_FOR_ARUID ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_CREATE ===&lt;br /&gt;
Creates an nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 size;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FROM_ID ===&lt;br /&gt;
Get handle to an existing nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 id;&lt;br /&gt;
    __out u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_ALLOC ===&lt;br /&gt;
Allocate memory for the nvmap object. Nintendo extended this one with 16 bytes, and changed it from in to inout.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 handle;&lt;br /&gt;
    __in u32 heapmask;&lt;br /&gt;
    __in u32 flags;    // (0=read-only, 1=read-write)&lt;br /&gt;
    __in u32 align;&lt;br /&gt;
    __in u8  kind;&lt;br /&gt;
    u8       pad[7];&lt;br /&gt;
    __inout u64 addr;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_FREE ===&lt;br /&gt;
This one is completely custom. Partly because the Linux driver passed the handle as the ioctl &amp;quot;arg-ptr&amp;quot;, and HIPC can&#039;t handle that voodoo.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    u32       pad;&lt;br /&gt;
    __out u64 refcount;&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
    __out u32 flags;    // 1=NOT_FREED_YET&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_PARAM ===&lt;br /&gt;
Returns info about a nvmap object. Identical to Linux driver, but extended with further params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
    __in  u32 param;  // 1=SIZE, 2=ALIGNMENT, 3=BASE (returns error), 4=HEAP (always 0x40000000), 5=KIND, 6=COMPR (unused)&lt;br /&gt;
    __out u32 result;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVMAP_IOC_GET_ID ===&lt;br /&gt;
Returns an id for a nvmap object. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 id; //~0 indicates error&lt;br /&gt;
    __in  u32 handle;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040212 || Out || 4 || TEGRA_DC_EXT_CONTROL_GET_NUM_OUTPUTS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0140213 || Inout || 20 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_PROPERTIES ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1100214 || Inout || 272 || TEGRA_DC_EXT_CONTROL_GET_OUTPUT_EDID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040216 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040217 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100218 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0100219 || Inout || 16 || TEGRA_DC_EXT_CONTROL_SET_EVENT3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0040220 || Inout || 4 || TEGRA_DC_EXT_CONTROL_SET_EVENT4 ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdisp-disp0, /dev/nvdisp-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040201 || In || 4 || TEGRA_DC_EXT_GET_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040202 || In || 4 || TEGRA_DC_EXT_PUT_WINDOW ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4C80203 || In || 1224 || TEGRA_DC_EXT_FLIP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80380204 || Out || 56 || TEGRA_DC_EXT_GET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40380205 || Out || 56 || TEGRA_DC_EXT_SET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x430C0206 || In || 780 || TEGRA_DC_EXT_SET_LUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010207 || In || 1 || TEGRA_DC_EXT_ENABLE_DISABLE_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040208 || Out || 4 || TEGRA_DC_EXT_GET_CRC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80040209 || Out || 4 || TEGRA_DC_EXT_GET_HEAD_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC038020A || Inout || 56 || TEGRA_DC_EXT_VALIDATE_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4018020B || In || 24 || TEGRA_DC_EXT_SET_CSC ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020C || Inout || 4 || TEGRA_DC_EXT_GET_VBLANK_SYNCPT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8040020D || Out || 64 || TEGRA_DC_EXT_GET_UNDERFLOWS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC99A020E || Inout || 2458 || TEGRA_DC_EXT_SET_CMU ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004020F || Inout || 4 || TEGRA_DC_EXT_DPMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80600210 || Out || 96 || TEGRA_DC_EXT_GET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40600211 || In || 96 || TEGRA_DC_EXT_SET_AVI_INFOFRAME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEBFC0215 || Inout || 11260 || TEGRA_DC_EXT_GET_MODE_DB ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC003021A || Inout || 3 || TEGRA_DC_EXT_PANEL_GET_VENDOR_ID ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C021B || Out || 60 || TEGRA_DC_EXT_GET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x403C021C || In || 60 || TEGRA_DC_EXT_SET_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC03C021D || Inout || 60 || TEGRA_DC_EXT_VALIDATE_MODE2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xEF20021E || Inout || 12064 || TEGRA_DC_EXT_GET_MODE_DB2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC004021F || Inout || 4 || TEGRA_DC_EXT_GET_WINMASK ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvcec-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010300 || In || 1 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010301 || In || 1 || NVCEC_CTRL_ENABLE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0302 || Out || 76 || NVCEC_CTRL_GET_PADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040303 || In || 4 || NVCEC_CTRL_SET_LADDR ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0304 || Inout || 76 || NVCEC_CTRL_WRITE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC04C0305 || Inout || 76 || NVCEC_CTRL_READ ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0306 || Out || 76 || NVCEC_CTRL_GET_CONNECTION_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x804C0307 || Out || 76 || NVCEC_CTRL_GET_WRITE_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhdcp_up-ctrl ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880401 || Inout || 1160 || TEGRAIO_NVHDCP_READ_M ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC4880402 || Inout || 1160 || TEGRAIO_NVHDCP_READ_S ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010403 || In || 1 || TEGRAIO_NVHDCP_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvdcutil-disp0, /dev/nvdcutil-disp1 ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010501 || In || 1 || NVDCUTIL_SW_HOTPLUG_IN_OUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010502 || In || 1 || NVDCUTIL_VIRTUAL_EDID_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x42040503 || In || 1056 || NVDCUTIL_VIRTUAL_EDID_SET_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x803C0504 || Out || 60 || NVDCUTIL_GET_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40010505 || In || 1 || NVDCUTIL_TELEMETRY_TEST_ON_OFF ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvsched-ctrl ==&lt;br /&gt;
This is a customized scheduler device.&lt;br /&gt;
&lt;br /&gt;
The way this device is exposed and configured is exclusive to the Switch, since other sources don&#039;t have an actual interface for the scheduler.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000601 || - || 0 || [[#NVSCHED_CTRL_ENABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000602 || - || 0 || [[#NVSCHED_CTRL_DISABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180603 || In || 24 || [[#NVSCHED_CTRL_ADD_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180604 || In || 24 || [[#NVSCHED_CTRL_UPDATE_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080605 || In || 8 || [[#NVSCHED_CTRL_REMOVE_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080606 || Out || 8 || [[#NVSCHED_CTRL_GET_ID]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80080607 || Out || 8 || [[#NVSCHED_CTRL_ADD_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40180608 || In || 24 || [[#NVSCHED_CTRL_UPDATE_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100609 || In || 16 || [[#NVSCHED_CTRL_LINK_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010060A || In || 16 || [[#NVSCHED_CTRL_UNLINK_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060B || In || 8 || [[#NVSCHED_CTRL_REMOVE_RUNLIST]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8001060C || Out || 1 || [[#NVSCHED_CTRL_HAS_OVERRUN_EVENT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8010060D || Out || 16 || [[#NVSCHED_CTRL_GET_NEXT_OVERRUN_EVENT]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x400C060E || In || 12 || [[#NVSCHED_CTRL_PUT_CONDUCTOR_FLIP_FENCE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008060F || In || 8 || [[#NVSCHED_CTRL_DETACH_APPLICATION]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100610 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40100611 || In || 16 || ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_ENABLE ===&lt;br /&gt;
Enables the scheduler.&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_DISABLE ===&lt;br /&gt;
Disables the scheduler.&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_ADD_APPLICATION ===&lt;br /&gt;
Adds a new application to the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
    __in u64 priority;&lt;br /&gt;
    __in u64 timeslice;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_UPDATE_APPLICATION ===&lt;br /&gt;
Updates the application parameters in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
    __in u64 priority;&lt;br /&gt;
    __in u64 timeslice;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_REMOVE_APPLICATION ===&lt;br /&gt;
Removes the application from the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_GET_ID ===&lt;br /&gt;
Returns the ID of the last scheduled object.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_ADD_RUNLIST ===&lt;br /&gt;
Creates a new runlist and returns it&#039;s ID.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 runlist_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_UPDATE_RUNLIST ===&lt;br /&gt;
Updates the runlist parameters in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
    __in u64 priority;&lt;br /&gt;
    __in u64 timeslice;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_LINK_RUNLIST ===&lt;br /&gt;
Links a runlist to a given application in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_UNLINK_RUNLIST ===&lt;br /&gt;
Unlinks a runlist from a given application in the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_REMOVE_RUNLIST ===&lt;br /&gt;
Removes the runlist from the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 runlist_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_HAS_OVERRUN_EVENT ===&lt;br /&gt;
Returns a boolean to tell if the scheduler has an overrun event or not.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u8 has_overrun;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_GET_NEXT_OVERRUN_EVENT ===&lt;br /&gt;
Returns the overrun event&#039;s data from the scheduler.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 runlist_id;&lt;br /&gt;
    __out u64 debt;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_PUT_CONDUCTOR_FLIP_FENCE ===&lt;br /&gt;
Installs a fence swap event?&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 fence_id;&lt;br /&gt;
    __in u32 fence_value;&lt;br /&gt;
    __in u32 swap_interval;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVSCHED_CTRL_DETACH_APPLICATION ===&lt;br /&gt;
Places the given application in detached state.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 application_id;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== /dev/nverpt-ctrl ==&lt;br /&gt;
Added in firmware version 3.0.0.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC1280701 || Inout || 296 || NVERPT_TELEMETRY_SUBMIT_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xCF580702 || Inout || 3928 || NVERPT_TELEMETRY_SUBMIT_DATA_EX ||&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-as-gpu ==&lt;br /&gt;
Each fd opened to this device creates an address space. An address space is then later bound with a channel.&lt;br /&gt;
&lt;br /&gt;
Once a nvgpu channel has been bound to an address space it cannot be unbound. There is no support for allowing an nvgpu channel to change from one address space to another (or from one to none).&lt;br /&gt;
                                                                                                                              &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044101 || In || 4 || [[#NVGPU_AS_IOCTL_BIND_CHANNEL]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184102 || Inout || 24 || [[#NVGPU_AS_IOCTL_ALLOC_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104103 || Inout || 16 || [[#NVGPU_AS_IOCTL_FREE_SPACE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184104 || Inout || 24 || [[#NVGPU_AS_IOCTL_MAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084105 || Inout || 8 || [[#NVGPU_AS_IOCTL_UNMAP_BUFFER]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0284106 || Inout || 40 || [[#NVGPU_AS_IOCTL_MAP_BUFFER_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40104107 || In || 16 || [[#NVGPU_AS_IOCTL_INITIALIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0404108 || Inout || 64 || [[#NVGPU_AS_IOCTL_GET_VA_REGIONS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40284109 || In || 40 || [[#NVGPU_AS_IOCTL_INITIALIZE_EX]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4114 || Inout || Variable || [[#NVGPU_AS_IOCTL_REMAP]] ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_BIND_CHANNEL ===&lt;br /&gt;
Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_ALLOC_SPACE ===&lt;br /&gt;
This one reserves pages in the device address space.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    u32      pad;&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_FREE_SPACE ===&lt;br /&gt;
This one frees pages from the device address space.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
    __in u32 pages;&lt;br /&gt;
    __in u32 page_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;        // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;    // 0 means don&#039;t care&lt;br /&gt;
    union {&lt;br /&gt;
      __out u64 offset;&lt;br /&gt;
      __in  u64 align;&lt;br /&gt;
    };&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_MAP_BUFFER_EX ===&lt;br /&gt;
Map a memory region in the device address space. Identical to Linux driver pretty much.&lt;br /&gt;
&lt;br /&gt;
Unaligned size will cause a [[#Panic]].&lt;br /&gt;
&lt;br /&gt;
On success, the mapped memory region is locked by having [[SVC#MemoryState]] bit34 set.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u32 flags;          // bit0: fixed_offset, bit2: cacheable&lt;br /&gt;
    __in    u32 kind;           // -1 is default&lt;br /&gt;
    __in    u32 nvmap_handle;&lt;br /&gt;
    __inout u32 page_size;      // 0 means don&#039;t care&lt;br /&gt;
    __in    u64 buffer_offset;&lt;br /&gt;
    __in    u64 mapping_size;&lt;br /&gt;
    __inout   u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_UNMAP_BUFFER ===&lt;br /&gt;
Unmap a memory region from the device address space.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 offset;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable).&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // ignored; passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_GET_VA_REGIONS ===&lt;br /&gt;
Nintendo modified to get rid of pointer in struct.&lt;br /&gt;
&lt;br /&gt;
  struct va_region {&lt;br /&gt;
    u64 offset;&lt;br /&gt;
    u32 page_size;&lt;br /&gt;
    u32 pad;&lt;br /&gt;
    u64 pages;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    u64         not_used;   // (contained output user ptr on linux, ignored)&lt;br /&gt;
    __inout u32 bufsize;    // forced to 2*sizeof(struct va_region)&lt;br /&gt;
    u32         pad;&lt;br /&gt;
    __out struct va_region regions[2];&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_INITIALIZE_EX ===&lt;br /&gt;
Nintendo&#039;s custom implementation of NVGPU_GPU_IOCTL_ALLOC_AS (unavailable) with extra params.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 big_page_size;   // depends on GPU&#039;s available_big_page_sizes; 0=default&lt;br /&gt;
    __in s32 as_fd;           // ignored; passes 0&lt;br /&gt;
    __in u32 flags;           // passes 0&lt;br /&gt;
    __in u32 reserved;        // ignored; passes 0&lt;br /&gt;
    __in u64 unk0;&lt;br /&gt;
    __in u64 unk1;&lt;br /&gt;
    __in u64 unk2;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_AS_IOCTL_REMAP ===&lt;br /&gt;
Nintendo&#039;s custom implementation of address space remapping.&lt;br /&gt;
&lt;br /&gt;
  struct remap_entry {&lt;br /&gt;
    __in u16 flags;        // 0 or 4&lt;br /&gt;
    __in u16 kind;           &lt;br /&gt;
    __in u32 nvmap_handle;&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
    __in u32 offset;       // (alloc_space_offset &amp;gt;&amp;gt; 0x10)&lt;br /&gt;
    __in u32 pages;        // alloc_space_pages&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
 struct {&lt;br /&gt;
    __in struct remap_entry entries[];&lt;br /&gt;
 };&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-dbg-gpu ==&lt;br /&gt;
Returns [[#Errors|NotSupported]] on Open unless nn::settings::detail::GetDebugModeFlag is set.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084401 || In || 8 || NVGPU_DBG_GPU_IOCTL_BIND_CHANNEL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4402 || Inout || Variable || NVGPU_DBG_GPU_IOCTL_REG_OPS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084403 || In || 8 || NVGPU_DBG_GPU_IOCTL_EVENTS_CTRL ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044404 || In || 4 || NVGPU_DBG_GPU_IOCTL_POWERGATE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044405 || In || 4 || NVGPU_DBG_GPU_IOCTL_SMPC_CTXSW_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044406 || In || 4 || NVGPU_DBG_GPU_IOCTL_SUSPEND_RESUME_SM ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184407 || Inout || 24 || NVGPU_DBG_GPU_IOCTL_PERFBUF_MAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084408 || In || 8 || NVGPU_DBG_GPU_IOCTL_PERFBUF_UNMAP ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084409 || In || 8 || NVGPU_DBG_GPU_IOCTL_PC_SAMPLING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008440A || In || 8 || NVGPU_DBG_GPU_IOCTL_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8008440B || Out || 8 || NVGPU_DBG_GPU_IOCTL_GET_TIMEOUT ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8004440C || Out || 4 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT_SIZE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000440D || None || 0 || NVGPU_DBG_GPU_IOCTL_GET_GR_CONTEXT || Uses Ioctl3.&lt;br /&gt;
|-&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-prof-gpu ==&lt;br /&gt;
Returns [[#Errors|NotSupported]] on Open unless nn::settings::detail::GetDebugModeFlag is set.&lt;br /&gt;
&lt;br /&gt;
This device is identical to [[#/dev/nvhost-dbg-gpu|/dev/nvhost-dbg-gpu]].&lt;br /&gt;
&lt;br /&gt;
== /dev/nvhost-ctrl-gpu ==&lt;br /&gt;
This device is for global (context independent) operations on the gpu.  &lt;br /&gt;
                                                                                                                                               &lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Direction || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044701 || Out || 4 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80284702 || Out || 40 || [[#NVGPU_GPU_IOCTL_ZCULL_GET_INFO]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x402C4703 || In || 44 || [[#NVGPU_GPU_IOCTL_ZBC_SET_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0344704 || Inout || 52 || [[#NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0B04705 || Inout || 176 || [[#NVGPU_GPU_IOCTL_GET_CHARACTERISTICS]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0184706 || Inout || 24 || NVGPU_GPU_IOCTL_GET_TPC_MASKS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084707 || In || 8 || [[#NVGPU_GPU_IOCTL_FLUSH_L2]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008470D || In || 8 || NVGPU_GPU_IOCTL_INVAL_ICACHE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008470E || In || 8 || NVGPU_GPU_IOCTL_SET_MMUDEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x4010470F || In || 16 || NVGPU_GPU_IOCTL_SET_SM_DEBUG_MODE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0084710 || Inout || 8 || NVGPU_GPU_IOCTL_WAIT_FOR_PAUSE ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084711 || Out || 8 || NVGPU_GPU_IOCTL_GET_TPC_EXCEPTION_EN_STATUS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084712 || Out || 8 || NVGPU_GPU_IOCTL_NUM_VSMS ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044713 || Inout || 4 || NVGPU_GPU_IOCTL_VSMS_MAPPING ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084714 || Out || 8 || [[#NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK]] ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x80044715 || Out || 4 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0x8018471A || Out || 24 || ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC008471B || Inout || 8 || NVGPU_GPU_IOCTL_GET_ERROR_CHANNEL_USER_DATA ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010471C || Inout || 16 || NVGPU_GPU_IOCTL_GET_GPU_TIME ||&lt;br /&gt;
|-&lt;br /&gt;
| 0xC108471D || Inout || 264 || NVGPU_GPU_IOCTL_GET_CPU_TIME_CORRELATION_INFO ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_CTX_SIZE ===&lt;br /&gt;
Returns the GPU&#039;s ZCULL context size. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZCULL_GET_INFO ===&lt;br /&gt;
Returns GPU&#039;s ZCULL information. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 width_align_pixels;&lt;br /&gt;
    __out u32 height_align_pixels;&lt;br /&gt;
    __out u32 pixel_squares_by_aliquots;&lt;br /&gt;
    __out u32 aliquot_total;&lt;br /&gt;
    __out u32 region_byte_multiplier;&lt;br /&gt;
    __out u32 region_header_size;&lt;br /&gt;
    __out u32 subregion_header_size;&lt;br /&gt;
    __out u32 subregion_width_align_pixels;&lt;br /&gt;
    __out u32 subregion_height_align_pixels;&lt;br /&gt;
    __out u32 subregion_count;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_SET_TABLE ===&lt;br /&gt;
Sets the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u32 color_ds[4];&lt;br /&gt;
    __in u32 color_l2[4];&lt;br /&gt;
    __in u32 depth;&lt;br /&gt;
    __in u32 format;&lt;br /&gt;
    __in u32 type;         // 1=color, 2=depth&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_QUERY_TABLE ===&lt;br /&gt;
Queries the active ZBC table. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __out u32 color_ds[4];&lt;br /&gt;
    __out u32 color_l2[4];&lt;br /&gt;
    __out u32 depth;&lt;br /&gt;
    __out u32 ref_cnt;&lt;br /&gt;
    __out u32 format;&lt;br /&gt;
    __out u32 type;&lt;br /&gt;
    __inout u32 index_size;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_GET_CHARACTERISTICS ===&lt;br /&gt;
Returns the GPU characteristics. Modified to return inline data instead of using a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct gpu_characteristics {&lt;br /&gt;
    u32 arch;                           // 0x120 (NVGPU_GPU_ARCH_GM200)&lt;br /&gt;
    u32 impl;                           // 0xB (NVGPU_GPU_IMPL_GM20B)&lt;br /&gt;
    u32 rev;                            // 0xA1 (Revision A1)&lt;br /&gt;
    u32 num_gpc;                        // 0x1&lt;br /&gt;
    u64 l2_cache_size;                  // 0x40000&lt;br /&gt;
    u64 on_board_video_memory_size;     // 0x0 (not used)&lt;br /&gt;
    u32 num_tpc_per_gpc;                // 0x2&lt;br /&gt;
    u32 bus_type;                       // 0x20 (NVGPU_GPU_BUS_TYPE_AXI)&lt;br /&gt;
    u32 big_page_size;                  // 0x20000&lt;br /&gt;
    u32 compression_page_size;          // 0x20000&lt;br /&gt;
    u32 pde_coverage_bit_count;         // 0x1B&lt;br /&gt;
    u32 available_big_page_sizes;       // 0x30000&lt;br /&gt;
    u32 gpc_mask;                       // 0x1&lt;br /&gt;
    u32 sm_arch_sm_version;             // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_spa_version;            // 0x503 (Maxwell Generation 5.0.3?)&lt;br /&gt;
    u32 sm_arch_warp_count;             // 0x80&lt;br /&gt;
    u32 gpu_va_bit_count;               // 0x28&lt;br /&gt;
    u32 reserved;                       // NULL&lt;br /&gt;
    u64 flags;                          // 0x55&lt;br /&gt;
    u32 twod_class;                     // 0x902D (FERMI_TWOD_A)&lt;br /&gt;
    u32 threed_class;                   // 0xB197 (MAXWELL_B)&lt;br /&gt;
    u32 compute_class;                  // 0xB1C0 (MAXWELL_COMPUTE_B)&lt;br /&gt;
    u32 gpfifo_class;                   // 0xB06F (MAXWELL_CHANNEL_GPFIFO_A)&lt;br /&gt;
    u32 inline_to_memory_class;         // 0xA140 (KEPLER_INLINE_TO_MEMORY_B)&lt;br /&gt;
    u32 dma_copy_class;                 // 0xB0B5 (MAXWELL_DMA_COPY_A)&lt;br /&gt;
    u32 max_fbps_count;                 // 0x1&lt;br /&gt;
    u32 fbp_en_mask;                    // 0x0 (disabled)&lt;br /&gt;
    u32 max_ltc_per_fbp;                // 0x2&lt;br /&gt;
    u32 max_lts_per_ltc;                // 0x1&lt;br /&gt;
    u32 max_tex_per_tpc;                // 0x0 (not supported)&lt;br /&gt;
    u32 max_gpc_count;                  // 0x1&lt;br /&gt;
    u32 rop_l2_en_mask_0;               // 0x21D70 (fuse_status_opt_rop_l2_fbp_r)&lt;br /&gt;
    u32 rop_l2_en_mask_1;               // 0x0&lt;br /&gt;
    u64 chipname;                       // 0x6230326D67 (&amp;quot;gm20b&amp;quot;)&lt;br /&gt;
    u64 gr_compbit_store_base_hw;       // 0x0 (not supported)&lt;br /&gt;
  };&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    __inout u64 gpu_characteristics_buf_size;   // must not be NULL, but gets overwritten with 0xA0=max_size&lt;br /&gt;
    __in    u64 gpu_characteristics_buf_addr;   // ignored, but must not be NULL&lt;br /&gt;
    __out struct gpu_characteristics gc;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_FLUSH_L2 ===&lt;br /&gt;
Flushes the GPU L2 cache.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 flush;          // l2_flush | l2_invalidate &amp;lt;&amp;lt; 1 | fb_flush &amp;lt;&amp;lt; 2&lt;br /&gt;
    u32      reserved;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_GPU_IOCTL_ZBC_GET_ACTIVE_SLOT_MASK ===&lt;br /&gt;
Returns the mask value for a ZBC slot.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u32 slot;       // always 0x07&lt;br /&gt;
    __out u32 mask;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
== Channels ==&lt;br /&gt;
Channels are a concept for  NVIDIA hardware blocks that share a common interface.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Path || Name&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-gpu ||&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-vic || Video Image Compositor&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvdec || Video Decoder&lt;br /&gt;
|-&lt;br /&gt;
| /dev/nvhost-nvjpg || JPEG Decoder&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== Channel Ioctls ==&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
! Value || Size || Description || Notes&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0001 || Variable || NVHOST_IOCTL_CHANNEL_SUBMIT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080002 || 8 || NVHOST_IOCTL_CHANNEL_GET_SYNCPOINT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080003 || 8 || NVHOST_IOCTL_CHANNEL_GET_WAITBASE || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080004 || 8 || NVHOST_IOCTL_CHANNEL_SET_TIMEOUT_EX || Seen on 1.0.0. Stubbed; does a debug print and returns 0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40040007 || 4 || NVHOST_IOCTL_CHANNEL_SET_SUBMIT_TIMEOUT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40080008 || 8 || NVHOST_IOCTL_CHANNEL_SET_CLK_RATE || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??0009 || Variable || NVHOST_IOCTL_CHANNEL_MAP_BUFFER || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??000A || Variable || NVHOST_IOCTL_CHANNEL_UNMAP_BUFFER || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00000013 || 0 || || Seen on 1.0.0. This one sets a u32, and bool based on input.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0080014 || || NVHOST_IOCTL_CHANNEL_GET_CLK_RATE || Seen on 1.0.0.&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40044801 || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40044803 || 4 || NVGPU_IOCTL_CHANNEL_SET_TIMEOUT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084805 || 8 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40184806 || || NVGPU_IOCTL_CHANNEL_WAIT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0044807 || 4 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4808 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104809 || 16 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4008480A || || NVHOST_IOCTL_CHANNEL_FREE_OBJ_CTX || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC010480B || 16 || [[#NVGPU_IOCTL_CHANNEL_ZCULL_BIND]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018480C || 24 || [[#NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x4004480D || 4 || [[#NVGPU_IOCTL_CHANNEL_SET_PRIORITY]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480E || 0 || [[#NVGPU_IOCTL_CHANNEL_ENABLE]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x0000480F || 0 || [[#NVGPU_IOCTL_CHANNEL_DISABLE]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004810 || 0 || [[#NVGPU_IOCTL_CHANNEL_PREEMPT]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x00004811 || 0 || [[#NVGPU_IOCTL_CHANNEL_FORCE_RESET]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40084812 || 8 || [[#NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104813 || 16 || NVGPU_IOCTL_CHANNEL_CYCLE_STATS_SNAPSHOT || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80804816 || 128 || NVGPU_IOCTL_CHANNEL_GET_ERROR_INFO || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0104817 || 16 || [[#NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x40204818 || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC0??4819 || Variable || [[#NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC020481A || 32 || [[#NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2]] || Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481B || 24 ||  || Uses Ioctl2.&lt;br /&gt;
|-&lt;br /&gt;
| 0xC018481C || 24 ||  || Uses Ioctl2.&lt;br /&gt;
|-&lt;br /&gt;
|- style=&amp;quot;border-top: double&amp;quot;&lt;br /&gt;
| 0x40084714 || 8 || NVGPU_IOCTL_CHANNEL_SET_USER_DATA || Sets an unknown user context address. Seen on 1.0.0.&lt;br /&gt;
|-&lt;br /&gt;
| 0x80084715 || 8 || NVGPU_IOCTL_CHANNEL_GET_USER_DATA || Gets an unknown user context address. Seen on 1.0.0.&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_NVMAP_FD ===&lt;br /&gt;
Binds a nvmap object to this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
This ioctl is a no-op in the Linux driver, not sure about Switch?&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 nvmap_fd;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO ===&lt;br /&gt;
Allocates gpfifo entries. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO ===&lt;br /&gt;
Submits a gpfifo object. Modified to take inline entry objects instead of a pointer.&lt;br /&gt;
&lt;br /&gt;
  struct fence {&lt;br /&gt;
    u32 syncpt_id;&lt;br /&gt;
    u32 syncpt_value;&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct gpfifo_entry {&lt;br /&gt;
    u64 entry;                            // gpu_iova | (unk_2bits &amp;lt;&amp;lt; 40) | (size &amp;lt;&amp;lt; 42) | (unk_flag &amp;lt;&amp;lt; 63)&lt;br /&gt;
  };&lt;br /&gt;
  &lt;br /&gt;
  struct {&lt;br /&gt;
    __in    u64 gpfifo;                      // (ignored) pointer to gpfifo fence structs&lt;br /&gt;
    __in    u32 num_entries;                 // number of fence objects being submitted&lt;br /&gt;
    __in    u32 flags;&lt;br /&gt;
    __inout struct fence fence_out;         // returned new fence object for others to wait on&lt;br /&gt;
    __in    struct gpfifo_entry entries[];  // depends on num_entries&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_OBJ_CTX ===&lt;br /&gt;
Allocates a graphics context object. Modified to ignore object&#039;s ID.&lt;br /&gt;
&lt;br /&gt;
You can only have one object context allocated at a time. You must have bound an address space before using this.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in  u32 class_num;    // 0x902D=2d, 0xB197=3d, 0xB1C0=compute, 0xA140=kepler, 0xB0B5=DMA, 0xB06F=channel_gpfifo&lt;br /&gt;
    __in  u32 flags;        // bit0: LOCKBOOST_ZERO&lt;br /&gt;
    __out u64 obj_id;       // (ignored) used for FREE_OBJ_CTX ioctl, which is not supported&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ZCULL_BIND ===&lt;br /&gt;
Binds a ZCULL context to the channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
 struct {&lt;br /&gt;
    __in u64 gpu_va;&lt;br /&gt;
    __in u32 mode;         // 0=global, 1=no_ctxsw, 2=separate_buffer, 3=part_of_regular_buf&lt;br /&gt;
    __in u32 padding;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_ERROR_NOTIFIER ===&lt;br /&gt;
Initializes the error notifier for this channel. Unlike for the Linux kernel, the Switch driver cannot write to an arbitrary userspace buffer. Thus new ioctls have been introduced to fetch the error information rather than using a shared memory buffer.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u64 offset;  // ignored&lt;br /&gt;
    __in u64 size;    // ignored&lt;br /&gt;
    __in u32 mem;     // must be non-zero to initialize, zero to de-initialize&lt;br /&gt;
    __in u32 padding; // ignored&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SET_PRIORITY ===&lt;br /&gt;
Change channel&#039;s priority. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 priority;    // 0x32 is low, 0x64 is medium and 0x96 is high&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ENABLE ===&lt;br /&gt;
Enables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_DISABLE ===&lt;br /&gt;
Disables the current channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_PREEMPT ===&lt;br /&gt;
Clears the FIFO pipe for this channel. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_FORCE_RESET ===&lt;br /&gt;
Forces the channel to reset. Identical to Linux driver.&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_EVENT_ID_CONTROL ===&lt;br /&gt;
Controls event notifications.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 cmd;    // 0=disable, 1=enable, 2=clear&lt;br /&gt;
    __in u32 id;     // same id&#039;s as for [[#QueryEvent]]&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_GET_ERROR_NOTIFICATION ===&lt;br /&gt;
Returns the current error notification caught by the error notifier. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
Despite being marked as inout this is all output.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __out u64 timestamp;    // fetched straight from armGetSystemTick&lt;br /&gt;
    __out u32 info32;       // error code&lt;br /&gt;
    __out u16 info16;       // additional error info&lt;br /&gt;
    __out u16 status;       // always 0xFFFF&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters. Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    __in u32 num_entries;&lt;br /&gt;
    __in u32 flags;&lt;br /&gt;
    __in u32 unk0;            // 1 works&lt;br /&gt;
    __in u32 unk1;&lt;br /&gt;
    __in u32 unk2;&lt;br /&gt;
    __in u32 unk3;&lt;br /&gt;
    __in u32 unk4;&lt;br /&gt;
    __in u32 unk5;&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_SUBMIT_GPFIFO_RETRY ===&lt;br /&gt;
Submits a gpfifo object (async version). Exclusive to the Switch.&lt;br /&gt;
&lt;br /&gt;
  struct {&lt;br /&gt;
    u64 __gpfifo;                     // in (pointer to gpfifo fence structs; ignored)&lt;br /&gt;
    u32 __num_entries;                // in (number of fence objects being submitted)&lt;br /&gt;
    u32 __flags;                      // in&lt;br /&gt;
    struct fence        __fence_out;  // out (returned new fence object for others to wait on)&lt;br /&gt;
    struct gpfifo_entry __entries[];  // in (depends on __num_entries)&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
=== NVGPU_IOCTL_CHANNEL_ALLOC_GPFIFO_EX2 ===&lt;br /&gt;
Allocates gpfifo entries with additional parameters and returns a fence. Exclusive to the Switch.&lt;br /&gt;
 &lt;br /&gt;
  struct {&lt;br /&gt;
    u32 __num_entries;         // in&lt;br /&gt;
    u32 __flags;               // in&lt;br /&gt;
    u32 __unk0;                // in (1 works)&lt;br /&gt;
    struct fence __fence_out;  // out&lt;br /&gt;
    u32 __unk1;                // in&lt;br /&gt;
    u32 __unk2;                // in&lt;br /&gt;
    u32 __unk3;                // in&lt;br /&gt;
  };&lt;br /&gt;
&lt;br /&gt;
= nvmemp =&lt;br /&gt;
NVIDIA memory profiler (this service is not available on retail units). &lt;br /&gt;
/dev/nvhost-ctrl sends the ioctl NVHOST_IOCTL_CTRL_GET_CONFIG to check the config &amp;quot;nv!NV_MEMORY_PROFILER&amp;quot;. If config_str returns &amp;quot;1&amp;quot;, the applications attempts to talk to use nvmemp.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Cmd0&lt;br /&gt;
|-&lt;br /&gt;
| 1 || Cmd1&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= nvdrvdbg =&lt;br /&gt;
This is &amp;quot;nns::nvdrv::INvDrvDebugFSServices&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || [[#OpenLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 1 || [[#CloseLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 2 || [[#ReadLog]]&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
== OpenLog ==&lt;br /&gt;
Takes process handle. Returns an fd.&lt;br /&gt;
&lt;br /&gt;
== CloseLog ==&lt;br /&gt;
Takes fd and closes it.&lt;br /&gt;
&lt;br /&gt;
== ReadLog ==&lt;br /&gt;
Takes fd and reads log into a type-6 buffer.&lt;br /&gt;
&lt;br /&gt;
= nvgem:c =&lt;br /&gt;
This is &amp;quot;nv::gemcontrol::INvGemControl&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|-&lt;br /&gt;
| 3 ||&lt;br /&gt;
|-&lt;br /&gt;
| 4 ||&lt;br /&gt;
|-&lt;br /&gt;
| 5 ||&lt;br /&gt;
|-&lt;br /&gt;
| 6 ||&lt;br /&gt;
|-&lt;br /&gt;
| 7 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= nvgem:cd =&lt;br /&gt;
This is &amp;quot;nv::gemcoredump::INvGemCoreDump&amp;quot;.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 ||&lt;br /&gt;
|-&lt;br /&gt;
| 1 ||&lt;br /&gt;
|-&lt;br /&gt;
| 2 ||&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Errors =&lt;br /&gt;
Most nvidia driver commands return an error code apart from the normal return code.&lt;br /&gt;
&lt;br /&gt;
{| class=&amp;quot;wikitable&amp;quot; border=&amp;quot;1&amp;quot;&lt;br /&gt;
|-&lt;br /&gt;
! Cmd || Name&lt;br /&gt;
|-&lt;br /&gt;
| 0 || Success&lt;br /&gt;
|-&lt;br /&gt;
| 1 || NotImplemented&lt;br /&gt;
|-&lt;br /&gt;
| 2 || NotSupported&lt;br /&gt;
|-&lt;br /&gt;
| 3 || NotInitialized&lt;br /&gt;
|-&lt;br /&gt;
| 4 || BadParameter&lt;br /&gt;
|-&lt;br /&gt;
| 5 || Timeout&lt;br /&gt;
|-&lt;br /&gt;
| 6 || InsufficientMemory&lt;br /&gt;
|-&lt;br /&gt;
| 7 || ReadOnlyAttribute&lt;br /&gt;
|-&lt;br /&gt;
| 8 || InvalidState&lt;br /&gt;
|-&lt;br /&gt;
| 9 || InvalidAddress&lt;br /&gt;
|-&lt;br /&gt;
| 0xA || InvalidSize&lt;br /&gt;
|-&lt;br /&gt;
| 0xB || BadValue&lt;br /&gt;
|-&lt;br /&gt;
| 0xD || AlreadyAllocated&lt;br /&gt;
|-&lt;br /&gt;
| 0xE || Busy&lt;br /&gt;
|-&lt;br /&gt;
| 0xF || ResourceError&lt;br /&gt;
|-&lt;br /&gt;
| 0x10 || CountMismatch&lt;br /&gt;
|-&lt;br /&gt;
| 0x1000 || SharedMemoryTooSmall&lt;br /&gt;
|-&lt;br /&gt;
| 0x30003 || FileOperationFailed&lt;br /&gt;
|-&lt;br /&gt;
| 0x30004 || DirOperationFailed&lt;br /&gt;
|-&lt;br /&gt;
| 0x3000F || IoctlFailed                        &lt;br /&gt;
|-&lt;br /&gt;
| 0x30010 || AccessDenied&lt;br /&gt;
|-&lt;br /&gt;
| 0x30013 || FileNotFound&lt;br /&gt;
|-&lt;br /&gt;
| 0xA000E || ModuleNotPresent&lt;br /&gt;
|}&lt;br /&gt;
&lt;br /&gt;
= Panic =&lt;br /&gt;
In some cases, a panic may occur. NV forces a crash by doing:&lt;br /&gt;
 (void *)0 = 0xCAFE;&lt;br /&gt;
End result is that the system hangs with a white-screen.&lt;br /&gt;
&lt;br /&gt;
== Gpfifo Panic ==&lt;br /&gt;
When the gpfifo data in the gpu_va buffers specified by the submitted gpfifo entries is invalid(?), eventually the user-process will be force-terminated after using the submit-gpfifo ioctl. It&#039;s unknown how exactly this is done.&lt;br /&gt;
&lt;br /&gt;
[[Category:Services]]&lt;/div&gt;</summary>
		<author><name>Cyuubi</name></author>
	</entry>
</feed>