SVC: Difference between revisions

Roblabla (talk | contribs)
IsBorrowed is also set to true when it's the source of a MapMemory.
Roblabla (talk | contribs)
CreateDeviceAddressSpace 32-bit regs
(16 intermediate revisions by the same user not shown)
Line 19: Line 19:
|  0x7 || [[#svcExitProcess]] || None ||
|  0x7 || [[#svcExitProcess]] || None ||
|-
|-
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id || W0=result, W1=handle
|  0x8 || [[#svcCreateThread]] || X1=entry, X2=thread_context, X3=stacktop, W4=prio, W5=processor_id
R0=prio, R1=entry, R2=thread_context, R3=stacktop, R4=processor_id
|| W0=result, W1=handle
|-
|-
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result
|  0x9 || [[#svcStartThread]] || W0=thread_handle || W0=result
Line 73: Line 75:
|-
|-
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}
| 0x1E || [[#svcGetSystemTick]] || None || X0={value of cntpct_el0}
R0=cntpct_el0_lower32, R1=cntpct_el0_upper32
|-
|-
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle
| 0x1F || svcConnectToNamedPort || X1=port_name_str || W0=result, W1=handle
Line 85: Line 88:
|-
|-
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid
| 0x24 || svcGetProcessId || W1=thread_or_process_or_debug_handle || W0=result, X1=pid
R0=result, R1=pid_lower32, R2=pid_upper32
|-
|-
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out
| 0x25 || svcGetThreadId || W1=thread_handle || W0=result, X1=out
R0=result, R1=out_lower32, R2=out_upper32
|-
|-
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0
| 0x26 || [[#svcBreak]] || X0=break_reason,X1,X2=info || W0=result = 0
Line 107: Line 112:
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result
| 0x2D || [3.0.0+] svcUnmapPhysicalMemory || X0=addr, X1=size || W0=result
|-
|-
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout || W0=result, bunch of crap
| 0x2E || [5.0.0+] svcGetFutureThreadInfo || X3=timeout
R0=timeout_lower32, R1=timeout_upper32
|| W0=result, bunch of crap
|-
|-
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool
| 0x2F || svcGetLastThreadInfo || None || W0=result, W1,W2,W3,W4=unk, W5=truncated_u64, W6=bool
|-
|-
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value
| 0x30 || svcGetResourceLimitLimitValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value
R0=result, R1=value_lower32, R2=value_upper32
|-
|-
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value
| 0x31 || svcGetResourceLimitCurrentValue || W1=reslimit_handle, W2=[[#LimitableResource]] || W0=result, X1=value
R0=result, R1=value_lower32, R2=value_upper32
|-
|-
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result
| 0x32 || svcSetThreadActivity || W0=thread_handle, W1=bool || W0=result
Line 119: Line 128:
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result
| 0x33 || svcGetThreadContext3 || X0=[[#ThreadContext]]*, W1=thread_handle || W0=result
|-
|-
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value X3=timeout ||
| 0x34 || [4.0.0+] svcWaitForAddress || X0=ptr, W1=[[#ArbitrationType]], X2=value, X3=timeout
R0=ptr, R1=[[#ArbitrationType]], R2=value, R3=timeout_lower32, R4=timeout_upper32
||
|-
|-
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value W3=num_to_signal ||
| 0x35 || [4.0.0+] svcSignalToAddress || X0=ptr, W1=[[#SignalType]], X2=value, W3=num_to_signal ||
|-
|-
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result
| 0x36 || [8.0.0+] svcSynchronizePreemptionState || None || W0=result
Line 129: Line 140:
| 0x3D || [4.0.0+] svcDumpInfoNew || ||
| 0x3D || [4.0.0+] svcDumpInfoNew || ||
|- style="border-top: double"
|- style="border-top: double"
| 0x40 || svcCreateSession || W2=is_light, X3=? || W0=result, W1=server_handle, W2=client_handle
| 0x40 || svcCreateSession || W2=is_light, X3=name_ptr || W0=result, W1=server_handle, W2=client_handle
|-
|-
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle
| 0x41 || [[#svcAcceptSession]] || W1=port_handle || W0=result, W1=session_handle
Line 135: Line 146:
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out
| 0x42 || svcReplyAndReceiveLight || W0=light_session_handle || W0=result, W1,W2,W3,W4,W5,W6,W7=out
|-
|-
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout || W0=result, W1=handle_idx
| 0x43 || [[#svcReplyAndReceive]] || X1=ptr_handles, W2=num_handles, X3=replytarget_handle(0=none), X4=timeout
R0=timeout_lower32, R1=ptr_handles, R2=num_handles, R3=replytarget_handle(0=none), R4=timeout_upper32
|| W0=result, W1=handle_idx
|-
|-
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout || W0=result, W1=handle_idx
| 0x44 || svcReplyAndReceiveWithUserBuffer|| X1=buf, X2=sz, X3=ptr_handles, W4=num_handles, X5=replytarget_handle(0=none), X6=timeout
R0=num_handles, R1=buf, R2=sz, R3=ptr_handles, R4=replytarget_handle(0=none), R5=timeout_lower32, R6=timeout_upper32
|| W0=result, W1=handle_idx
|-
|-
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle
| 0x45 || svcCreateEvent || None || W0=result, W1=wevent_handle, W2=revent_handle
Line 149: Line 164:
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle
| 0x4B || [4.0.0+] [[#svcCreateCodeMemory]] || X1=addr, X2=size || W0=result, W1=code_memory_handle
|-
|-
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm || W0=result
| 0x4C || [4.0.0+] [[#svcControlCodeMemory]] || W0=code_memory_handle, W1=[[#CodeMemoryOperation]], X2=dstaddr, X3=size, W4=perm
R0=code_memory_handle, R1=[[#CodeMemoryOperation]], R2=dstaddr_lower32, R3=dstaddr_upper32, R4=size_lower32, R5=size_upper32, R6=perm
|| W0=result
|-
|-
| 0x4D || svcSleepSystem || None || None
| 0x4D || svcSleepSystem || None || None
|-
|-
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val || W0=result, W1=out_val
| 0x4E || [[#svcReadWriteRegister]] || X1=reg_addr, W2=rw_mask, W3=in_val
R0=rw_mask, R1=in_val, R2=reg_addr_lower32, R3=reg_addr_upper32
|| W0=result, W1=out_val
|-
|-
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result
| 0x4F || svcSetProcessActivity || W0=process_handle, W1=bool || W0=result
Line 167: Line 186:
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size
| 0x54 || [[#svcQueryPhysicalAddress]] || X1=addr || W0=result, X1=physaddr, X2=kerneladdr, X3=size
|-
|-
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size || W0=result, X1=virtaddr
| 0x55 || [[#svcQueryIoMapping]] || X1=physaddr, X2=size
R0=size, R2=physaddr_lower32, R3=physaddr_upper32
|| W0=result, X1=virtaddr
|-
|-
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr || W0=result, W1=dev_as_handle
| 0x56 || [[#svcCreateDeviceAddressSpace]] || X1=dev_as_start_addr, X2=dev_as_end_addr
R0=dev_as_end_addr_lower32, R1=dev_as_end_addr_upper32, R2=dev_as_start_addr_lower32, R3=dev_as_start_addr_upper32
|| W0=result, W1=dev_as_handle
|-
|-
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result
| 0x57 || [[#svcAttachDeviceAddressSpace]] || W0=device, X1=dev_as_handle || W0=result
Line 433: Line 456:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) X1 || void(*)(void*) || Entry
| (In) X1 || R1 || void(*)(void*) || Entry
|-
|-
| (In) X2 || void* || ThreadContext
| (In) X2 || R2 || void* || ThreadContext
|-
|-
| (In) X3 || void* || StackTop
| (In) X3 || R3 || void* || StackTop
|-
|-
| (In) W4 || u32 || Priority
| (In) W4 || R0 || u32 || Priority
|-
|-
| (In) W5 || u32 || ProcessorId
| (In) W5 || R4 || u32 || ProcessorId
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W0 || R0 || [[#Result]] || Ret
|-
|-
| (Out) W1 || Handle<Thread> || Handle
| (Out) W1 || R1 || Handle<Thread> || Handle
|}
|}
</div>
</div>
Line 490: Line 513:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
| (In) X0 || s64 || Nanoseconds
|-
|}
</div>
<div style="display: inline-block;vertical-align:top;">
{| class="wikitable" border="1"
|-
! Argument || Type || Name
|-
| (In) R0 || u32 || NanosecondsLower32
|-
|-
| (In) R1 || u32 || NanosecondsUpper32
| (In) X0 || R0, R1 || s64 || Nanoseconds
|-
|-
|}
|}
Line 567: Line 579:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) W2 || Handle<Thread> || Handle
| (In) W2 || R2 || Handle<Thread> || Handle
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W0 || R0 || [[#Result]] || Ret
|-
|-
| (Out) W1 || u32 || Out0
| (Out) W1 || R1 || u32 || Out0
|-
|-
| (Out) X2 || u64 || Out1
| (Out) X2 || R2, R3 || u64 || Out1
|}
</div>
<div style="display: inline-block; vertical-align:top;">
{| class="wikitable" border="1"
|-
! Argument || Type || Name
|-
| (In) R2 || Handle<Thread> || Handle
|-
| (Out) R0 || [[#Result]] || Ret
|-
| (Out) R1 || u32 || Out0
|-
| (Out) R2 || u32 || Out1Lower32
|-
| (Out) R3 || u32 || Out1Upper32
|}
|}
</div>
</div>
Line 602: Line 598:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) W0 || Handle<Thread> || Handle
| (In) W0 || R0 || Handle<Thread> || Handle
|-
|-
| (In) W1 || u32 || In0
| (In) W1 || R1 || u32 || In0
|-
|-
| (In) X2 || u64 || In1
| (In) X2 || R2, R3 || u64 || In1
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W0 || R0 || [[#Result]] || Ret
|}
</div>
<div style="display: inline-block;vertical-align:top;">
{| class="wikitable" border="1"
|-
! Argument || Type || Name
|-
| (In) R0 || Handle<Thread> || Handle
|-
| (In) R1 || u32 || In0
|-
| (In) R2 || u32 || In1Lower32
|-
| (In) R3 || u32 || In1Upper32
|-
| (Out) R0 || [[#Result]] || Ret
|}
|}
</div>
</div>
'''Description:''' Set affinity mask of provided thread handle.
'''Description:''' Set affinity mask of provided thread handle.


Line 701: Line 682:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
| (In) X1 || Handle* || HandlesPtr
|-
| (In) W2 || u64 || HandlesNum
|-
| (In) X3 || u64 || Timeout
|-
| (Out) W0 || [[#Result]] || Ret
|-
| (Out) W1 || u64 || HandleIndex
|}
</div>
<div style="display: inline-block;vertical-align:top;">
{| class="wikitable" border="1"
|-
! Argument || Type || Name
|-
|-
| (In) R0 || u32 || TimeoutLower32
| (In) X1 || R1 || Handle* || HandlesPtr
|-
|-
| (In) R1 || Handle* || HandlesPtr
| (In) W2 || R2 || u64 || HandlesNum
|-
|-
| (In) R2 || u32 || HandlesNum
| (In) X3 || R0, R3 || u64 || Timeout
|-
|-
| (In) R3 || u32 || TimeoutUpper32
| (Out) W0 || R0 || [[#Result]] || Ret
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W1 || R1 || u64 || HandleIndex
|-
| (Out) W1 || u64 || HandleIndex
|}
|}
</div>
</div>
Line 799: Line 762:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (Out) X0 || u64 || Ticks
| (Out) X0 || R0, R1 || u64 || Ticks
|}
|}
</div>
</div>
Line 1,003: Line 966:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) W1 || *Handle<Port or ServerSession> || Handles
| (In) W1 || R1 || *Handle<Port or ServerSession> || Handles
|-
|-
| (In) W2 || u32 || NumHandles
| (In) W2 || R2 || u32 || NumHandles
|-
|-
| (In) W3 || Handle<ServerSession> || ReplyTarget
| (In) W3 || R3 || Handle<ServerSession> || ReplyTarget
|-
|-
| (In) X4 || u64 (nanoseconds) || Timeout
| (In) X4 || R0, R4 || u64 (nanoseconds) || Timeout
|-
|-
| (Out) W0 || [[#Result]] || Result
| (Out) W0 || R0 || [[#Result]] || Result
|-
|-
| (Out) W1 || u32 || HandleIndex
| (Out) W1 || R1 || u32 || HandleIndex
|}
|}
</div>
</div>
Line 1,061: Line 1,024:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) X1 || u64 || RegAddr
| (In) X1 || R2, R3 || u64 || RegAddr
|-
|-
| (In) W2 || u64 || RwMask
| (In) W2 || R0 || u64 || RwMask
|-
|-
| (In) W3 || u64 || InValue
| (In) W3 || R1 || u64 || InValue
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W0 || R0 || [[#Result]] || Ret
|-
|-
| (Out) W1|| u64 || OutValue
| (Out) W1 || R1 || u64 || OutValue
|}
|}
</div>
</div>
Line 1,226: Line 1,189:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) X1 || u64 || PhysAddr
| (In) X1 || R2, R3 || u64 || PhysAddr
|-
|-
| (In) X2 || u64 || Size
| (In) X2 || R0 || u64 || Size
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W0 || R0 || [[#Result]] || Ret
|-
|-
| (Out) X1 || void* || VirtAddr
| (Out) X1 || R1 || void* || VirtAddr
|}
|}
</div>
</div>
Line 1,245: Line 1,208:
{| class="wikitable" border="1"
{| class="wikitable" border="1"
|-
|-
! Argument || Type || Name
! Argument64 || Argument32 || Type || Name
|-
|-
| (In) X1 || u64 || StartAddr
| (In) X1 || R2, R3 || u64 || StartAddr
|-
|-
| (In) X2 || u64 || EndAddr
| (In) X2 || R0, R1 || u64 || EndAddr
|-
|-
| (Out) W0 || [[#Result]] || Ret
| (Out) W0 || R0 || [[#Result]] || Ret
|-
|-
| (Out) W1 || Handle<DeviceAddressSpace> || AddressSpaceHandle
| (Out) W1 || R1 || Handle<DeviceAddressSpace> || AddressSpaceHandle
|}
|}
</div>
</div>