SVC: Difference between revisions
Everybody knows the kernel shopping channel, and everybody likes new SVCs in it every Wednesday. |
|||
(13 intermediate revisions by 5 users not shown) | |||
Line 169: | Line 169: | ||
| 0x54 || Result || [[#QueryPhysicalAddress|QueryPhysicalAddress]] || arch::PhysicalMemoryInfo *out_info, uintptr_t address | | 0x54 || Result || [[#QueryPhysicalAddress|QueryPhysicalAddress]] || arch::PhysicalMemoryInfo *out_info, uintptr_t address | ||
|- | |- | ||
| 0x55 || Result || [[#QueryIoMapping|QueryIoMapping]] || uintptr_t *out_address, [10.0.0+] size_t *out_size, PhysicalAddress physical_address, size_t size | | [1.0.0-9.2.0] 0x55 || Result || [[#QueryIoMapping|QueryIoMapping]] || uintptr_t *out_address, PhysicalAddress physical_address, size_t size | ||
|- | |||
| [10.0.0+] 0x55 || Result || QueryMemoryMapping || uintptr_t *out_address, size_t *out_size, PhysicalAddress physical_address, size_t size | |||
|- | |- | ||
| 0x56 || Result || [[#CreateDeviceAddressSpace|CreateDeviceAddressSpace]] || Handle *out_handle, uint64_t das_address, uint64_t das_size | | 0x56 || Result || [[#CreateDeviceAddressSpace|CreateDeviceAddressSpace]] || Handle *out_handle, uint64_t das_address, uint64_t das_size | ||
Line 177: | Line 179: | ||
| 0x58 || Result || [[#DetachDeviceAddressSpace|DetachDeviceAddressSpace]] || DeviceName device_name, Handle das_handle | | 0x58 || Result || [[#DetachDeviceAddressSpace|DetachDeviceAddressSpace]] || DeviceName device_name, Handle das_handle | ||
|- | |- | ||
| 0x59 || Result || [[#MapDeviceAddressSpaceByForce|MapDeviceAddressSpaceByForce]] || Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address, | | 0x59 || Result || [[#MapDeviceAddressSpaceByForce|MapDeviceAddressSpaceByForce]] || Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address, uint32_t option | ||
|- | |- | ||
| 0x5A || Result || [[#MapDeviceAddressSpaceAligned|MapDeviceAddressSpaceAligned]] || Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address, | | 0x5A || Result || [[#MapDeviceAddressSpaceAligned|MapDeviceAddressSpaceAligned]] || Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address, uint32_t option | ||
|- | |- | ||
| 0x5B || Result || [[#MapDeviceAddressSpace|MapDeviceAddressSpace]] || size_t *out_mapped_size, Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address, MemoryPermission device_perm | | [1.0.0-12.1.0] 0x5B || Result || [[#MapDeviceAddressSpace|MapDeviceAddressSpace]] || size_t *out_mapped_size, Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address, MemoryPermission device_perm | ||
|- | |- | ||
| 0x5C || Result || [[#UnmapDeviceAddressSpace|UnmapDeviceAddressSpace]] || Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address | | 0x5C || Result || [[#UnmapDeviceAddressSpace|UnmapDeviceAddressSpace]] || Handle das_handle, Handle process_handle, uint64_t process_address, size_t size, uint64_t device_address | ||
Line 252: | Line 254: | ||
|- | |- | ||
| 0x7F || void || [[#CallSecureMonitor|CallSecureMonitor]] || SecureMonitorArguments *args | | 0x7F || void || [[#CallSecureMonitor|CallSecureMonitor]] || SecureMonitorArguments *args | ||
|- style="border-top: double" | |||
| [15.0.0+] 0x90 || Result || MapInsecurePhysicalMemory || uintptr_t address, size_t size | |||
|- | |||
| [15.0.0+] 0x91 || Result || UnmapInsecurePhysicalMemory || uintptr_t address, size_t size | |||
|- | |- | ||
|} | |} | ||
Line 261: | Line 267: | ||
! Argument || Type || Name | ! Argument || Type || Name | ||
|- | |- | ||
| (In) | | (In) X1 || uint64_t || Size | ||
|- | |- | ||
| (Out) W0 || [[#Result]] || Result | | (Out) W0 || [[#Result]] || Result | ||
Line 643: | Line 649: | ||
</div> | </div> | ||
Takes the given event out of the signaled state. | Takes the given event out of the signaled state, if it is signaled. | ||
=== Result codes === | === Result codes === | ||
Line 649: | Line 655: | ||
'''0xE401:''' Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent. | '''0xE401:''' Invalid handle. The handle either does not exist, or is not a ReadableEvent nor a WritableEvent. | ||
== MapSharedMemory == | == MapSharedMemory == | ||
Line 738: | Line 742: | ||
</div> | </div> | ||
Resets the signal on the given handle, ensuring future calls to [[#WaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this is | Resets the signal on the given handle, ensuring future calls to [[#WaitSynchronization]] on this handle will sleep until the handle is signaled again. If the handle is a ReadableEvent, this returns ResultInvalidState if the event is not signaled. | ||
If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling ResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01. | If the handle is a Process, it will clear the signaled state (which is set when the process changes [[#ProcessState]]. Once the process enters the Exited state, calling ResetSignal on the process will no longer have an effect (the process is permanently signaled), and the syscall will return 0xFA01. | ||
Line 1,426: | Line 1,430: | ||
! Argument64 || Argument32 || Type || Name | ! Argument64 || Argument32 || Type || Name | ||
|- | |- | ||
| (In) | | (In) X1 || R1 || Handle<Port>* or Handle<ServerSession>* || Handles | ||
|- | |- | ||
| (In) W2 || R2 || uint32_t || NumHandles | | (In) W2 || R2 || uint32_t || NumHandles | ||
Line 1,858: | Line 1,862: | ||
| (In) X4 || R5, R6 || uint64_t || DeviceAddressSpaceAddress | | (In) X4 || R5, R6 || uint64_t || DeviceAddressSpaceAddress | ||
|- | |- | ||
| (In) W5 || R7 || | | (In) W5 || R7 || uint32_t || Option | ||
|- | |- | ||
| (Out) W0 || R0 || [[#Result]] || Result | | (Out) W0 || R0 || [[#Result]] || Result | ||
Line 1,869: | Line 1,873: | ||
The userspace destination address must have the [[SVC#MemoryState|FlagCanDeviceMap]] bit set. Bit [[SVC#MemoryAttribute|DeviceShared]] will be set after mapping. | The userspace destination address must have the [[SVC#MemoryState|FlagCanDeviceMap]] bit set. Bit [[SVC#MemoryAttribute|DeviceShared]] will be set after mapping. | ||
The Option encodes a [[#MemoryPermission]] in the low 16 bits, and an indicator of IO mapping in the high bits. | |||
== MapDeviceAddressSpaceAligned == | == MapDeviceAddressSpaceAligned == | ||
Line 1,886: | Line 1,892: | ||
| (In) X4 || R5, R6 || uint64_t || DeviceAddressSpaceAddress | | (In) X4 || R5, R6 || uint64_t || DeviceAddressSpaceAddress | ||
|- | |- | ||
| (In) W5 || R7 || | | (In) W5 || R7 || uint32_t || Option | ||
|- | |- | ||
| (Out) W0 || R0 || [[#Result]] || Result | | (Out) W0 || R0 || [[#Result]] || Result | ||
Line 1,895: | Line 1,901: | ||
Same as [[#MapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|FlagCanAlignedDeviceMap]] bit set instead. | Same as [[#MapDeviceAddressSpaceByForce]], but the userspace destination address must have the [[SVC#MemoryState|FlagCanAlignedDeviceMap]] bit set instead. | ||
The Option encodes a [[#MemoryPermission]] in the low 16 bits, and an indicator of IO mapping in the high bits. | |||
== MapDeviceAddressSpace == | == MapDeviceAddressSpace == | ||
Line 2,651: | Line 2,659: | ||
| Process || 24 || 0 || [11.0.0+] FreeThreadCount | | Process || 24 || 0 || [11.0.0+] FreeThreadCount | ||
|- | |- | ||
| Thread || 0xF0000002 || 0-3, -1 || ThreadTickCount. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread. | | Thread || 25 ([1.0.0-12.1.0] 0xF0000002) || 0-3, -1 || ThreadTickCount. When 0-3 are passed, gets specific core CPU ticks spent on thread. When -1 is passed, gets total CPU ticks spent on thread. | ||
|- | |||
| Process || 26 || 0 || [14.0.0+] IsSvcPermitted | |||
|- | |||
| Process || 27 || 0 || [16.0.0+] IoRegionHint | |||
|- | |||
| Process || 28 || 0 || [18.0.0+] AliasRegionExtraSize | |||
|} | |} | ||
Line 2,985: | Line 2,999: | ||
|- | |- | ||
| 3 || Uncached || | | 3 || Uncached || | ||
|- | |||
| 4 || PermissionLocked || | |||
|} | |} | ||
Line 3,028: | Line 3,044: | ||
|- | |- | ||
| 25 || [4.0.0+] [[#CreateCodeMemory|FlagCanCodeMemory]] || | | 25 || [4.0.0+] [[#CreateCodeMemory|FlagCanCodeMemory]] || | ||
|- | |||
| 26 || [15.0.0+] FlagLinearMapped || | |||
|} | |} | ||
Line 3,097: | Line 3,115: | ||
|- | |- | ||
| 0x00402015 || [4.0.0+] CodeOut || Mapped in kernel during [[#ControlCodeMemory]]. | | 0x00402015 || [4.0.0+] CodeOut || Mapped in kernel during [[#ControlCodeMemory]]. | ||
|- | |||
| 0x00002016 || [13.0.0+] Coverage || | |||
|- | |||
| 0x05583817 || [15.0.0+] Insecure || | |||
|} | |} | ||
Line 3,138: | Line 3,160: | ||
! Bit || Bitmask || Description | ! Bit || Bitmask || Description | ||
|- | |- | ||
| 0 || 1 || | | 0 || 1 || HandleException (note: doesn't need to be set in the same call than Resume) | ||
|- | |- | ||
| 1 || 2 || | | 1 || 2 || EnableExceptionEvent | ||
|- | |- | ||
| 2 || 4 || | | 2 || 4 || ContinueAll | ||
|- | |- | ||
| 3 || 8 || | | 3 || 8 || ContinueOthers | ||
|} | |} | ||
ContinueOthers is like ContinueAll but acts on all threads that aren't in the input list. The affected threads are resumed. | |||
Only one of of | Only one of of HandleException and EnableExceptionEvent can be set at a time. | ||
If the input number of threads is 0, this means "all threads". | If the input number of threads is 0, this means "all threads". |