libtransistor
A userland library for the Nintendo Switch
 All Data Structures Files Functions Variables Typedefs Enumerations Enumerator Macros
svc.h
Go to the documentation of this file.
1 
6 #pragma once
7 
8 #ifdef __cplusplus
9 extern "C" {
10 #endif
11 
12 #include<libtransistor/types.h>
13 #include<assert.h>
14 
15 #define CURRENT_PROCESS 0xffff8001
16 #define CURRENT_THREAD 0xffff8000
17 
18 typedef struct PACKED {
19  void *base_addr;
20  uint64_t size;
21  uint32_t memory_type;
22  uint32_t memory_attribute;
23  uint32_t permission;
24  uint32_t device_ref_count;
25  uint32_t ipc_ref_count;
26  uint32_t padding;
28 
29 typedef struct PACKED {
30  uint64_t physical_addr;
31  uint64_t kernel_addr;
32  uint64_t size;
34 
35 typedef struct {
36  uint32_t event_type;
37  uint32_t flags;
38  uint64_t thread_id;
39  union {
40  struct {
41  uint64_t title_id;
42  uint64_t process_id;
43  char process_name[12];
44  uint32_t mmu_flags;
45  uint64_t user_exception_context_addr; // [5.0.0+]
46  } attach_process;
47  struct {
48  uint64_t thread_id;
49  uint64_t tls_pointer;
50  uint64_t entrypoint;
51  } attach_thread;
52  struct {
53  uint64_t type;
54  } exit;
55  struct {
56  uint64_t exception_type;
57  uint64_t fault_register;
58  union {
59  struct {
60  uint32_t opcode;
61  } undefined_instruction;
62  struct {
63  uint32_t is_watchpoint;
64  } breakpoint;
65  struct {
66  uint32_t info0;
67  uint64_t info1;
68  uint64_t info2;
69  } user_break;
70  struct {
71  uint32_t svc_id;
72  } bad_svc_id;
73  };
74  } exception;
75  uint8_t padding[0x80]; // not sure how large this actually needs to be, but let's be safe.
76  };
78 
79 enum {
80  DEBUG_EVENT_EXIT_TYPE_PAUSED_THREAD = 0,
81  DEBUG_EVENT_EXIT_TYPE_RUNNING_THREAD = 1,
82  DEBUG_EVENT_EXIT_TYPE_TERMINATED_PROCESS = 2,
83 };
84 
85 enum {
86  DEBUG_EVENT_ATTACH_PROCESS = 0,
87  DEBUG_EVENT_ATTACH_THREAD = 1,
88  DEBUG_EVENT_UNKNOWN = 2,
89  DEBUG_EVENT_EXIT = 3,
90  DEBUG_EVENT_EXCEPTION = 4,
91 };
92 
93 enum {
94  DEBUG_EXCEPTION_UNDEFINED_INSTRUCTION = 0,
95  DEBUG_EXCEPTION_INSTRUCTION_ABORT = 1,
96  DEBUG_EXCEPTION_DATA_ABORT_MISC = 2,
97  DEBUG_EXCEPTION_PC_SP_ALIGNMENT_FAULT = 3,
98  DEBUG_EXCEPTION_DEBUGGER_ATTACHED = 4,
99  DEBUG_EXCEPTION_BREAKPOINT = 5,
100  DEBUG_EXCEPTION_USER_BREAK = 6,
101  DEBUG_EXCEPTION_DEBUGGER_BREAK = 7,
102  DEBUG_EXCEPTION_BAD_SVC_ID = 8,
103 };
104 
105 typedef struct {
106  union {
107  uint64_t regs[100];
108  struct {
109  uint64_t x[31];
110  uint64_t sp, pc;
111  uint32_t psr;
112  uint32_t _pad;
113  uint64_t fpr[32][2];
114  uint32_t fpcr, fpsr;
115  uint64_t tpidr;
116  };
117  };
119 static_assert(sizeof(thread_context_t) == 800, "sizeof(thread_context_t)");
120 
127 result_t svcSetHeapSize(void **outAddr, uint32_t size);
128 
138 result_t svcSetMemoryPermission(void *addr, uint64_t size, uint32_t permission);
139 
148 result_t svcSetMemoryAttribute(void *addr, uint64_t size, uint32_t state0, uint32_t state1);
149 
157 result_t svcMapMemory(void *dest, void *src, uint64_t size);
158 
166 result_t svcUnmapMemory(void *dest, void *src, uint64_t size);
167 
175 result_t svcQueryMemory(memory_info_t *memory_info, uint32_t *page_info, void *addr);
176 
180 void __attribute__((__noreturn__)) svcExitProcess();
181 
192 result_t svcCreateThread(thread_h *out, thread_entry entry, void *arg, void *stacktop, int32_t priority, int32_t processor_id);
193 
200 
204 void __attribute__((__noreturn__)) svcExitThread();
205 
211 result_t svcSleepThread(uint64_t nanos);
212 
219 result_t svcGetThreadPriority(uint32_t *priority, thread_h thread);
220 
227 result_t svcSetThreadPriority(thread_h thread, uint32_t priority);
228 
236 result_t svcSetThreadCoreMask(thread_h thread, uint32_t in, uint64_t in2);
237 
242 
249 
256 
265 result_t svcMapSharedMemory(shared_memory_h block, void *addr, uint64_t size, uint32_t permission);
266 
274 result_t svcUnmapSharedMemory(shared_memory_h block, void *addr, uint64_t size);
275 
284 result_t svcCreateTransferMemory(transfer_memory_h *out, void *addr, uint64_t size, uint32_t permission);
285 
292 
301 
310 result_t svcWaitSynchronization(uint32_t *handle_index, handle_t *handles, uint32_t num_handles, uint64_t timeout);
311 
318 
326 void svcArbitrateLock(thread_h current_thread, void *lock, thread_h requesting_thread);
327 
333 void svcArbitrateUnlock(void *lock);
334 
343 result_t svcWaitProcessWideKeyAtomic(void *ptr0, void *ptr1, thread_h thread, uint64_t timeout);
344 
351 result_t svcSignalProcessWideKey(void *ptr, uint32_t value);
352 
356 uint64_t svcGetSystemTick();
357 
364 result_t svcConnectToNamedPort(session_h *out, char name[8]);
365 
366 result_t svcSendSyncRequestLight(handle_t handle);
367 
374 
382 result_t svcSendSyncRequestWithUserBuffer(void *buffer, uint64_t size, session_h session);
383 
392 result_t svcSendAsyncRequestWithUserBuffer(revent_h *event_handle, void *buffer, uint64_t size, session_h session);
393 
400 result_t svcGetProcessId(uint64_t *pid, handle_t thread_or_process_handle);
401 
408 result_t svcGetThreadId(thread_h *handle_out, thread_h handle_in);
409 
413 result_t svcBreak(uint64_t reason, uint64_t unknown, uint64_t info);
414 
421 void svcOutputDebugString(char *str, uint64_t size);
422 
428 void svcReturnFromException(uint64_t result);
429 
438 result_t svcGetInfo(void *info, uint64_t info_id, handle_t handle, uint64_t info_sub_id);
439 
444 
448 result_t svcFlushDataCache(void *addr, size_t size);
449 
455 result_t svcMapPhysicalMemory(void *addr, size_t size);
456 
462 result_t svcUnmapPhysicalMemory(void *addr, size_t size);
463 
464 // 0x2E?
465 
466 result_t svcGetLastThreadInfo(void *last_thread_context, uint64_t *unknown1, uint64_t *unknown2);
467 
475 result_t svcGetResourceLimitLimitValue(uint64_t *value, handle_t limit_handle, uint32_t limitable_resource);
476 
484 result_t svcGetResourceLimitCurrentValue(uint64_t *value, handle_t limit_handle, uint32_t limitable_resource);
485 
489 result_t svcSetThreadActivity(thread_h thread_handle, bool active);
490 
491 result_t svcGetThreadContext3(thread_context_t *thread_context, thread_h thread_handle);
492 
493 // 0x34-0x3B?
494 // dumpInfo
495 // 0x3D-0x3F?
496 
504 result_t svcCreateSession(session_h *server, session_h *client, bool is_light, uint32_t unknown);
505 
513 
514 // replyAndReceiveLight
515 
525 result_t svcReplyAndReceive(uint32_t *handle_idx, session_h *handles, uint32_t num_handles, session_h reply_session, uint64_t timeout);
526 
538 result_t svcReplyAndReceiveWithUserBuffer(uint32_t *handle_idx, void *buffer, uint64_t size, session_h *handles, uint32_t num_handles, session_h reply_session, uint64_t timeout);
539 
546 result_t svcCreateEvent(wevent_h *wevent, revent_h *revent);
547 
548 // 0x46-0x4E?
549 
550 void svcSleepSystem();
551 
560 result_t svcReadWriteRegister(uint32_t *out_value, uint64_t addr, uint32_t rw_mask, uint32_t in_value);
561 
562 result_t svcSetProcessActivity(process_h process, bool active);
563 
572 result_t svcCreateSharedMemory(shared_memory_h *out, uint64_t size, uint32_t self_permissions, uint32_t foreign_permissions);
573 
582 result_t svcMapTransferMemory(transfer_memory_h handle, void *addr, uint64_t size, uint32_t perm);
583 
591 result_t svcUnmapTransferMemory(transfer_memory_h handle, void *addr, uint64_t size);
592 
593 result_t svcCreateInterruptEvent(revent_h *event, uint64_t interrupt, uint32_t interrupt_type);
594 
595 result_t svcQueryPhysicalAddress(physical_memory_info_t *info, void *addr);
596 
604 result_t svcQueryIoMapping(void *virt_addr, uint64_t phys_addr, uint64_t size);
605 
606 result_t svcCreateDeviceAddressSpace(dev_addr_space_h *out, uint64_t start_addr, uint64_t end_addr);
607 
614 result_t svcAttachDeviceAddressSpace(uint32_t device_name, dev_addr_space_h space);
615 
622 result_t svcDetachDeviceAddressSpace(uint32_t device_name, dev_addr_space_h space);
623 
634 result_t svcMapDeviceAddressSpaceByForce(dev_addr_space_h space, process_h process, uint64_t dev_addr, uint64_t dev_size, uint64_t map_addr, uint32_t perm);
635 
646 result_t svcMapDeviceAddressSpaceAligned(dev_addr_space_h space, process_h process, uint64_t dev_addr, uint64_t dev_size, uint64_t map_addr, uint32_t perm);
647 
648 result_t svcMapDeviceAddressSpace(uint64_t *unknown1, handle_t unknown2, handle_t unknown3, uint64_t dev_addr, uint64_t dev_size, uint64_t map_addr, uint32_t perm);
649 
659 result_t svcUnmapDeviceAddressSpace(dev_addr_space_h space, process_h process, uint64_t map_addr, uint64_t map_size, uint32_t perm);
660 
661 result_t svcInvalidateProcessDataCache(process_h process, uint64_t addr, size_t size);
662 result_t svcStoreProcessDataCache(process_h process, uint64_t addr, size_t size);
663 result_t svcFlushProcessDataCache(process_h process, uint64_t addr, size_t size);
664 
671 result_t svcDebugActiveProcess(debug_h *out, uint64_t process_id);
672 
673 result_t svcBreakDebugProcess(debug_h debug);
674 result_t svcTerminateDebugProcess(debug_h debug);
675 
676 result_t svcGetDebugEvent(debug_event_info_t *info, debug_h debug);
677 
678 result_t svcContinueDebugEventOld(debug_h debug, uint32_t continue_debug_flags_old, uint64_t thread_id);
679 result_t svcContinueDebugEvent(debug_h debug, uint32_t continue_debug_flags, uint64_t *thread_id_list, uint32_t num_threads);
680 
681 result_t svcGetProcessList(uint32_t *num_out, uint64_t *pids_out, uint32_t max_out);
682 
683 result_t svcGetThreadList(uint32_t *num_out, uint64_t *tids_out, uint32_t max_out, debug_h debug);
684 
685 result_t svcGetDebugThreadContext(thread_context_t *context, debug_h handle, uint64_t thread_id, uint32_t thread_context_flags);
686 
687 result_t svcSetDebugThreadContext(debug_h handle, uint64_t thread_id, thread_context_t *context, uint32_t thread_context_flags);
688 
697 result_t svcQueryDebugProcessMemory(memory_info_t *memory_info, uint32_t *page_info, debug_h debug, uint64_t addr);
698 
707 result_t svcReadDebugProcessMemory(void *buffer, debug_h debug, uint64_t addr, uint64_t size);
708 
717 result_t svcWriteDebugProcessMemory(debug_h debug, void *buffer, uint64_t addr, uint64_t size);
718 
719 result_t svcSetHardwareBreakPoint(uint32_t hw_bkpt_id, uint64_t flags, uint64_t value_or_debug_handle);
720 
721 result_t svcGetDebugThreadParam(uint64_t *param1, uint32_t *param2, debug_h handle, uint64_t thread_id, uint32_t debug_thread_param);
722 
723 // 0x6E-0x6F?
724 
725 result_t svcCreatePort(handle_t *client, handle_t *server, uint32_t max_sessions, uint32_t is_light, const char *name_ptr);
726 
727 // manageNamedPort
728 
729 result_t svcConnectToPort(handle_t *session, handle_t port);
730 
739 result_t svcSetProcessMemoryPermission(process_h process, uint64_t addr, uint64_t size, uint32_t prot);
740 
745 result_t svcMapProcessMemory(void *src, process_h process, uint64_t dst, uint64_t size);
746 
750 result_t svcUnmapProcessMemory(void *src, process_h process, uint64_t dst, uint64_t size);
751 
752 result_t svcQueryProcessMemory(memory_info_t *memory_info, uint32_t *page_info, process_h proc, uint64_t addr);
753 
757 result_t svcMapProcessCodeMemory(process_h process, void *dst, void *src, uint64_t size);
758 
762 result_t svcUnmapProcessCodeMemory(process_h process, void *dst, void *src, uint64_t size);
763 
767 result_t svcCreateProcess(process_h *process, void *procinfo, void *caps, uint32_t cap_num);
768 
772 result_t svcStartProcess(process_h process, uint32_t main_thread_prio, uint32_t default_cpuid, uint32_t main_thread_stack_size);
773 
774 result_t svcTerminateProcess(process_h process);
775 
776 result_t svcGetProcessInfo(uint64_t *info, process_h process, uint32_t type);
777 
778 result_t svcCreateResourceLimit(resource_limit_h *limit);
779 
780 result_t svcSetResourceLimitLimitValue(resource_limit_h limit, uint32_t resource, uint64_t value);
781 
782 // callSecureMonitor
783 
784 enum {
785  SVC_ID_SET_HEAP_SIZE = 0x01,
786  SVC_ID_SET_MEMORY_PERMISSION = 0x02,
787  SVC_ID_SET_MEMORY_ATTRIBUTE = 0x03,
788  SVC_ID_MAP_MEMORY = 0x04,
789  SVC_ID_UNMAP_MEMORY = 0x05,
790  SVC_ID_QUERY_MEMORY = 0x06,
791 
792  SVC_ID_EXIT_PROCESS = 0x07,
793 
794  SVC_ID_CREATE_THREAD = 0x08,
795  SVC_ID_START_THREAD = 0x09,
796  SVC_ID_EXIT_THREAD = 0x0A,
797  SVC_ID_SLEEP_THREAD = 0x0B,
798  SVC_ID_GET_THREAD_PRIORITY = 0x0C,
799  SVC_ID_SET_THREAD_PRIORITY = 0x0D,
800  SVC_ID_GET_THREAD_CORE_MASK = 0x0E,
801  SVC_ID_SET_THREAD_CORE_MASK = 0x0F,
802  SVC_ID_GET_CURRENT_PROCESSOR_NUMBER = 0x10,
803 
804  SVC_ID_SIGNAL_EVENT = 0x11,
805  SVC_ID_CLEAR_EVENT = 0x12,
806 
807  SVC_ID_MAP_SHARED_MEMORY = 0x13,
808  SVC_ID_UNMAP_SHARED_MEMORY = 0x14,
809  SVC_ID_CREATE_TRANSFER_MEMORY = 0x15,
810 
811  SVC_ID_CLOSE_HANDLE = 0x16,
812 
813  SVC_ID_RESET_SIGNAL = 0x17,
814  SVC_ID_WAIT_SYNCHRONIZATION = 0x18,
815  SVC_ID_CANCEL_SYNCHRONIZATION = 0x19,
816  SVC_ID_ARBITRATE_LOCK = 0x1A,
817  SVC_ID_ARBITRATE_UNLOCK = 0x1B,
818  SVC_ID_WAIT_PROCESS_WIDE_KEY_ATOMIC = 0x1C,
819  SVC_ID_SIGNAL_PROCESS_WIDE_KEY = 0x1D,
820  SVC_ID_GET_SYSTEM_TICK = 0x1E,
821 
822  SVC_ID_CONNECT_TO_NAMED_PORT = 0x1F,
823  SVC_ID_SEND_SYNC_REQUEST_LIGHT = 0x20,
824  SVC_ID_SEND_SYNC_REQUEST = 0x21,
825  SVC_ID_SEND_SYNC_REQUEST_WITH_USER_BUFFER = 0x22,
826  SVC_ID_SEND_ASYNC_REQUEST_WITH_USER_BUFFER = 0x23,
827 
828  SVC_ID_GET_PROCESS_ID = 0x24,
829  SVC_ID_GET_THREAD_ID = 0x25,
830 
831  SVC_ID_BREAK = 0x26,
832  SVC_ID_OUTPUT_DEBUG_STRING = 0x27,
833  SVC_ID_RETURN_FROM_EXCEPTION = 0x28,
834 
835  SVC_ID_GET_INFO = 0x29,
836  SVC_ID_FLUSH_ENTIRE_DATA_CACHE = 0x2A,
837  SVC_ID_FLUSH_DATA_CACHE = 0x2B,
838  SVC_ID_GET_LAST_THREAD_INFO = 0x2C,
839 
840  SVC_ID_GET_RESOURCE_LIMIT_LIMIT_VALUE = 0x30,
841  SVC_ID_GET_RESOURCE_LIMIT_CURRENT_VALUE = 0x31,
842 
843  SVC_ID_SET_THREAD_ACTIVITY = 0x32,
844  SVC_ID_GET_THREAD_CONTEXT3 = 0x33,
845 
846  SVC_ID_DUMP_INFO = 0x3C,
847 
848  SVC_ID_CREATE_SESSION = 0x40,
849  SVC_ID_ACCEPT_SESSION = 0x41,
850  SVC_ID_REPLY_AND_RECEIVE_LIGHT = 0x42,
851  SVC_ID_REPLY_AND_RECEIVE = 0x43,
852  SVC_ID_REPLY_AND_RECEIVE_WITH_USER_BUFFER = 0x44,
853  SVC_ID_CREATE_EVENT = 0x4E,
854  SVC_ID_SLEEP_SYSTEM = 0x4D,
855 
856  SVC_ID_READ_WRITE_REGISTER = 0x4E,
857  SVC_ID_SET_PROCESS_ACTIVITY = 0x4F,
858 
859  SVC_ID_CREATE_SHARED_MEMORY = 0x50,
860  SVC_ID_MAP_TRANSFER_MEMORY = 0x51,
861  SVC_ID_UNMAP_TRANSFER_MEMORY = 0x52,
862  SVC_ID_CREATE_INTERRUPT_EVENT = 0x53,
863  SVC_ID_QUERY_PHYSICAL_ADDRESS = 0x54,
864 
865  SVC_ID_QUERY_IO_MAPPING = 0x55,
866  SVC_ID_CREATE_DEVICE_ADDRESS_SPACE = 0x56,
867  SVC_ID_ATTACH_DEVICE_ADDRESS_SPACE = 0x57,
868  SVC_ID_DETACH_DEVICE_ADDRESS_SPACE = 0x58,
869  SVC_ID_MAP_DEVICE_ADDRESS_SPACE_BY_FORCE = 0x59,
870  SVC_ID_MAP_DEVICE_ADDRESS_SPACE_ALIGNED = 0x5A,
871  SVC_ID_MAP_DEVICE_ADDRESS_SPACE = 0x5B,
872  SVC_ID_UNMAP_DEVICE_ADDRESS_SPACE = 0x5C,
873  SVC_ID_INVALIDATE_PROCESS_DATA_CACHE = 0x5D,
874  SVC_ID_STORE_PROCESS_DATA_CACHE = 0x5E,
875  SVC_ID_FLUSH_PROCESS_DATA_CACHE = 0x5F,
876 
877  SVC_ID_DEBUG_ACTIVE_PROCESS = 0x60,
878  SVC_ID_BREAK_DEBUG_PROCESS = 0x61,
879  SVC_ID_TERMINATE_DEBUG_PROCESS = 0x62,
880  SVC_ID_GET_DEBUG_EVENT = 0x63,
881  SVC_ID_CONTINUE_DEBUG_EVENT = 0x64,
882  SVC_ID_GET_PROCESS_LIST = 0x65,
883  SVC_ID_GET_THREAD_LIST = 0x66,
884  SVC_ID_GET_DEBUG_THREAD_CONTEXT = 0x67,
885  SVC_ID_SET_DEBUG_THREAD_CONTEXT = 0x68,
886 
887  SVC_ID_QUERY_DEBUG_PROCESS_MEMORY = 0x69,
888  SVC_ID_READ_DEBUG_PROCESS_MEMORY = 0x6A,
889  SVC_ID_WRITE_DEBUG_PROCESS_MEMORY = 0x6B,
890  SVC_ID_SET_HARDWARE_BREAK_POINT = 0x6C,
891  SVC_ID_GET_DEBUG_THREAD_PARAM = 0x6D,
892 
893  SVC_ID_CREATE_PORT = 0x70,
894  SVC_ID_MANAGE_NAMED_PORT = 0x71,
895  SVC_ID_CONNECT_TO_PORT = 0x72,
896 
897  SVC_ID_SET_PROCESS_MEMORY_PERMISSION = 0x73,
898  SVC_ID_MAP_PROCESS_MEMORY = 0x74,
899  SVC_ID_UNMAP_PROCESS_MEMORY = 0x75,
900  SVC_ID_QUERY_PROCESS_MEMORY = 0x76,
901  SVC_ID_MAP_PROCESS_CODE_MEMORY = 0x77,
902  SVC_ID_UNMAP_PROCESS_CODE_MEMORY = 0x78,
903 
904  SVC_ID_CREATE_PROCESS = 0x79,
905  SVC_ID_START_PROCESS = 0x7A,
906  SVC_ID_TERMINATE_PROCESS = 0x7B,
907  SVC_ID_GET_PROCESS_INFO = 0x7C,
908 
909  SVC_ID_CREATE_RESOURCE_LIMIT = 0x7D,
910  SVC_ID_SET_RESOURCE_LIMIT_LIMIT_VALUE = 0x7E,
911 
912  SVC_ID_CALL_SECURE_MONITOR = 0x7F,
913 };
914 
915 #ifdef __cplusplus
916 }
917 #endif
result_t svcBreak(uint64_t reason, uint64_t unknown, uint64_t info)
Break to debugger.
Various system types.
result_t svcGetProcessId(uint64_t *pid, handle_t thread_or_process_handle)
Get a process's ID.
result_t svcConnectToNamedPort(session_h *out, char name[8])
Connect to a named port.
result_t svcSleepThread(uint64_t nanos)
Sleep thread for specified time.
result_t svcUnmapPhysicalMemory(void *addr, size_t size)
Unmaps memory mapped by svcMapPhysicalMemory.
result_t svcSetMemoryAttribute(void *addr, uint64_t size, uint32_t state0, uint32_t state1)
Sets memory attributes.
result_t svcReplyAndReceiveWithUserBuffer(uint32_t *handle_idx, void *buffer, uint64_t size, session_h *handles, uint32_t num_handles, session_h reply_session, uint64_t timeout)
See svcReplyAndReceive.
result_t svcMapDeviceAddressSpaceByForce(dev_addr_space_h space, process_h process, uint64_t dev_addr, uint64_t dev_size, uint64_t map_addr, uint32_t perm)
Map device address space by force.
void svcArbitrateUnlock(void *lock)
Arbitrate unlock.
result_t svcReplyAndReceive(uint32_t *handle_idx, session_h *handles, uint32_t num_handles, session_h reply_session, uint64_t timeout)
Sends a reply to the given session, then receives a request.
result_t svcReadDebugProcessMemory(void *buffer, debug_h debug, uint64_t addr, uint64_t size)
Read debug process memory.
result_t svcSetThreadCoreMask(thread_h thread, uint32_t in, uint64_t in2)
Set thread core mask.
handle_t debug_h
Debug handle.
Definition: types.h:46
result_t svcSignalProcessWideKey(void *ptr, uint32_t value)
Wait process wide key atomic.
handle_t event_h
Either revent_h or wevent_h.
Definition: types.h:49
result_t svcMapProcessCodeMemory(process_h process, void *dst, void *src, uint64_t size)
Map process code memory.
void svcFlushEntireDataCache()
Flushes the entire data cache.
result_t svcSendAsyncRequestWithUserBuffer(revent_h *event_handle, void *buffer, uint64_t size, session_h session)
Send an IPC request asynchronously.
result_t svcStartProcess(process_h process, uint32_t main_thread_prio, uint32_t default_cpuid, uint32_t main_thread_stack_size)
Starts the given process.
void svcOutputDebugString(char *str, uint64_t size)
Output a debug string.
result_t svcSetThreadPriority(thread_h thread, uint32_t priority)
Set a thread's priority.
result_t svcSignalEvent(wevent_h event)
Signal an event.
result_t svcStartThread(thread_h thread)
Start a thread.
result_t svcCreateTransferMemory(transfer_memory_h *out, void *addr, uint64_t size, uint32_t permission)
Create transfer memory.
result_t svcMapPhysicalMemory(void *addr, size_t size)
Maps size bytes of type-5 memory at addr.
result_t svcGetThreadId(thread_h *handle_out, thread_h handle_in)
Get a thread ID.
handle_t thread_h
Thread handle.
Definition: types.h:39
uint64_t svcGetSystemTick()
Get the system time tick.
result_t svcCreateEvent(wevent_h *wevent, revent_h *revent)
Creates an event object.
result_t svcGetResourceLimitLimitValue(uint64_t *value, handle_t limit_handle, uint32_t limitable_resource)
Gets the limit value for a resource limit.
result_t svcAcceptSession(session_h *out, port_h port)
Accepts an IPC session on the given port.
result_t svcSendSyncRequest(session_h session)
Send sync request.
void(* thread_entry)(void *)
Thread entrypoint function.
Definition: types.h:53
result_t svcWaitSynchronization(uint32_t *handle_index, handle_t *handles, uint32_t num_handles, uint64_t timeout)
Wait synchronization.
handle_t shared_memory_h
Shared Memory handle.
Definition: types.h:40
result_t svcMapSharedMemory(shared_memory_h block, void *addr, uint64_t size, uint32_t permission)
Map shared memory.
Definition: graphic_buffer_queue.h:83
uint32_t result_t
Function result.
Definition: types.h:51
handle_t revent_h
revent handle
Definition: types.h:47
result_t svcDetachDeviceAddressSpace(uint32_t device_name, dev_addr_space_h space)
Detach device address space.
result_t svcMapProcessMemory(void *src, process_h process, uint64_t dst, uint64_t size)
Map memory in the given process.
result_t svcDebugActiveProcess(debug_h *out, uint64_t process_id)
Debug active process.
handle_t session_h
Session handle.
Definition: types.h:42
result_t svcGetThreadPriority(uint32_t *priority, thread_h thread)
Get the thread priority.
handle_t process_h
Process handle.
Definition: types.h:45
result_t svcGetInfo(void *info, uint64_t info_id, handle_t handle, uint64_t info_sub_id)
Get info.
void svcReturnFromException(uint64_t result)
Return from exception.
void __attribute__((__noreturn__)) svcExitProcess()
Exit the process.
result_t svcWriteDebugProcessMemory(debug_h debug, void *buffer, uint64_t addr, uint64_t size)
Write debug process memory.
result_t svcGetResourceLimitCurrentValue(uint64_t *value, handle_t limit_handle, uint32_t limitable_resource)
Gets the current value for a resource limit.
result_t svcUnmapTransferMemory(transfer_memory_h handle, void *addr, uint64_t size)
Unmap transfer memory.
result_t svcSetMemoryPermission(void *addr, uint64_t size, uint32_t permission)
Sets memory permissions.
result_t svcQueryDebugProcessMemory(memory_info_t *memory_info, uint32_t *page_info, debug_h debug, uint64_t addr)
Query debug process memory.
Definition: svc.h:18
result_t svcSetThreadActivity(thread_h thread_handle, bool active)
Allows or disallows scheduling of a thread.
result_t svcReadWriteRegister(uint32_t *out_value, uint64_t addr, uint32_t rw_mask, uint32_t in_value)
Read/Write register.
result_t svcCreateThread(thread_h *out, thread_entry entry, void *arg, void *stacktop, int32_t priority, int32_t processor_id)
Create a new thread.
handle_t wevent_h
wevent handle
Definition: types.h:48
void svcArbitrateLock(thread_h current_thread, void *lock, thread_h requesting_thread)
Arbitrate lock.
result_t svcWaitProcessWideKeyAtomic(void *ptr0, void *ptr1, thread_h thread, uint64_t timeout)
Wait process wide key atomic.
result_t svcCreateProcess(process_h *process, void *procinfo, void *caps, uint32_t cap_num)
Creates a new process.
handle_t port_h
Port handle.
Definition: types.h:43
Definition: svc.h:35
uint32_t handle_t
Resource handle.
Definition: types.h:38
Definition: svc.h:105
handle_t resource_limit_h
Resource limit handle.
Definition: types.h:50
result_t svcSetProcessMemoryPermission(process_h process, uint64_t addr, uint64_t size, uint32_t prot)
Reprotect memory in the given process.
result_t svcMapMemory(void *dest, void *src, uint64_t size)
Map memory.
handle_t dev_addr_space_h
Dev Address Space handle.
Definition: types.h:44
result_t svcCancelSynchronization(handle_t handle)
Cancel synchronization.
uint32_t svcGetCurrentProcessorNumber()
Get the current processor number.
result_t svcQueryMemory(memory_info_t *memory_info, uint32_t *page_info, void *addr)
Query memory.
result_t svcClearEvent(event_h event)
Clear an event.
result_t svcCreateSession(session_h *server, session_h *client, bool is_light, uint32_t unknown)
Creates an IPC session.
result_t svcResetSignal(handle_t signal)
Resets a signal.
result_t svcAttachDeviceAddressSpace(uint32_t device_name, dev_addr_space_h space)
Attach device address space.
result_t svcMapTransferMemory(transfer_memory_h handle, void *addr, uint64_t size, uint32_t perm)
Map transfer memory.
result_t svcCloseHandle(handle_t handle)
Closes the specified handle.
result_t svcCreateSharedMemory(shared_memory_h *out, uint64_t size, uint32_t self_permissions, uint32_t foreign_permissions)
Create a block of shared memory.
result_t svcUnmapProcessCodeMemory(process_h process, void *dst, void *src, uint64_t size)
Unmap process code memory.
result_t svcUnmapProcessMemory(void *src, process_h process, uint64_t dst, uint64_t size)
Unmap memory mapped via svcMapProcessMemory.
result_t svcFlushDataCache(void *addr, size_t size)
Flushes data cache for a certain memory region.
result_t svcUnmapDeviceAddressSpace(dev_addr_space_h space, process_h process, uint64_t map_addr, uint64_t map_size, uint32_t perm)
Unmap device address space.
result_t svcUnmapMemory(void *dest, void *src, uint64_t size)
Unmap memory.
result_t svcSetHeapSize(void **outAddr, uint32_t size)
Sets the size of the heap.
handle_t transfer_memory_h
Transfer Memory handle.
Definition: types.h:41
result_t svcSendSyncRequestWithUserBuffer(void *buffer, uint64_t size, session_h session)
Send sync request with user buffer.
result_t svcMapDeviceAddressSpaceAligned(dev_addr_space_h space, process_h process, uint64_t dev_addr, uint64_t dev_size, uint64_t map_addr, uint32_t perm)
Map device address space aligned.
result_t svcQueryIoMapping(void *virt_addr, uint64_t phys_addr, uint64_t size)
Query IO mapping.
result_t svcUnmapSharedMemory(shared_memory_h block, void *addr, uint64_t size)
Unmap shared memory.