From 57f139799ca1bee3199c1869cf2f9b84454fccd0 Mon Sep 17 00:00:00 2001 From: patois Date: Mon, 9 Mar 2015 04:54:03 +0100 Subject: [PATCH] add syscalls 0x61, 0x62, 0x63, 0x64 --- libctru/include/3ds/svc.h | 138 ++++++++++++++++++++++++++++++++++++++ libctru/source/svc.s | 24 +++++++ 2 files changed, 162 insertions(+) diff --git a/libctru/include/3ds/svc.h b/libctru/include/3ds/svc.h index 14dfb4e..08a25ab 100644 --- a/libctru/include/3ds/svc.h +++ b/libctru/include/3ds/svc.h @@ -15,6 +15,21 @@ typedef enum { MEMOP_ALLOC_LINEAR=0x10003 // Allocate linear heap } MemOp; +typedef enum { + MEMSTATE_FREE = 0, + MEMSTATE_RESERVED = 1, + MEMSTATE_IO = 2, + MEMSTATE_STATIC = 3, + MEMSTATE_CODE = 4, + MEMSTATE_PRIVATE = 5, + MEMSTATE_SHARED = 6, + MEMSTATE_CONTINUOUS = 7, + MEMSTATE_ALIASED = 8, + MEMSTATE_ALIAS = 9, + MEMSTATE_ALIASCODE = 10, + MEMSTATE_LOCKED = 11 +} MemState; + typedef enum { MEMPERM_READ = 1, MEMPERM_WRITE = 2, @@ -42,6 +57,125 @@ typedef enum { ARBITER_KERNEL4 =4, } ArbitrationType; +typedef enum { + DBG_EVENT_PROCESS = 0, + DBG_EVENT_CREATE_THREAD = 1, + DBG_EVENT_EXIT_THREAD = 2, + DBG_EVENT_EXIT_PROCESS = 3, + DBG_EVENT_EXCEPTION = 4, + DBG_EVENT_DLL_LOAD = 5, + DBG_EVENT_DLL_UNLOAD = 6, + DBG_EVENT_SCHEDULE_IN = 7, + DBG_EVENT_SCHEDULE_OUT = 8, + DBG_EVENT_SYSCALL_IN = 9, + DBG_EVENT_SYSCALL_OUT = 10, + DBG_EVENT_OUTPUT_STRING = 11, + DBG_EVENT_MAP = 12 +} DebugEventType; + +typedef enum { + REASON_CREATE = 1, + REASON_ATTACH = 2 +} ProcessEventReason; + +typedef struct { + u64 program_id; + u8 process_name[8]; + u32 process_id; + u32 reason; +} ProcessEvent; + +typedef struct { + u32 creator_thread_id; + u32 base_addr; + u32 entry_point; +} CreateThreadEvent; + +typedef enum { + EXITTHREAD_EVENT_NONE = 0, + EXITTHREAD_EVENT_TERMINATE = 1, + EXITTHREAD_EVENT_UNHANDLED_EXC = 2, + EXITTHREAD_EVENT_TERMINATE_PROCESS = 3 +} ExitThreadEventReason; + +typedef enum { + EXITPROCESS_EVENT_NONE = 0, + EXITPROCESS_EVENT_TERMINATE = 1, + EXITPROCESS_EVENT_UNHANDLED_EXCEPTION = 2 +} ExitProcessEventReason; + +typedef struct { + u32 reason; +} ExitProcessEvent; + +typedef struct { + u32 reason; +} ExitThreadEvent; + +typedef struct { + u32 type; + u32 address; + u32 argument; +} ExceptionEvent; + +typedef enum { + EXC_EVENT_UNDEFINED_INSTRUCTION = 0, // arg: (None) + EXC_EVENT_UNKNOWN1 = 1, // arg: (None) + EXC_EVENT_UNKNOWN2 = 2, // arg: address + EXC_EVENT_UNKNOWN3 = 3, // arg: address + EXC_EVENT_ATTACH_BREAK = 4, // arg: (None) + EXC_EVENT_BREAKPOINT = 5, // arg: (None) + EXC_EVENT_USER_BREAK = 6, // arg: user break type + EXC_EVENT_DEBUGGER_BREAK = 7, // arg: (None) + EXC_EVENT_UNDEFINED_SYSCALL = 8 // arg: attempted syscall +} ExceptionEventType; + +typedef enum { + USERBREAK_PANIC = 0, + USERBREAK_ASSERT = 1, + USERBREAK_USER = 2 +} UserBreakType; + +typedef struct { + u64 clock_tick; +} SchedulerInOutEvent; + +typedef struct { + u64 clock_tick; + u32 syscall; +} SyscallInOutEvent; + +typedef struct { + u32 string_addr; + u32 string_size; +} OutputStringEvent; + +typedef struct { + u32 mapped_addr; + u32 mapped_size; + u32 memperm; + u32 memstate; +} MapEvent; + +typedef struct { + u32 type; + u32 thread_id; + u32 unknown[2]; + union { + ProcessEvent process; + CreateThreadEvent create_thread; + ExitThreadEvent exit_thread; + ExitProcessEvent exit_process; + ExceptionEvent exception; + /* TODO: DLL_LOAD */ + /* TODO: DLL_UNLOAD */ + SchedulerInOutEvent scheduler; + SyscallInOutEvent syscall; + OutputStringEvent output_string; + MapEvent map; + }; +} DebugEventInfo; + static inline void* getThreadLocalStorage(void) { void* ret; @@ -92,6 +226,10 @@ s32 svcGetThreadId(u32 *out, Handle handle); s32 svcOutputDebugString(const char* str, int length); Result svcCreatePort(Handle* portServer, Handle* portClient, const char* name, s32 maxSessions); Result svcDebugActiveProcess(Handle* debug, u32 processId); +Result svcBreakDebugProcess(Handle debug); +Result svcTerminateDebugProcess(Handle debug); +Result svcGetProcessDebugEvent(DebugEventInfo *info, Handle debug); +Result svcContinueDebugEvent(Handle debug, u32 flags); Result svcGetProcessList(s32* processCount, u32* processIds, s32 processIdMaxCount); Result svcReadProcessMemory(void* buffer, Handle debug, u32 addr, u32 size); Result svcMapProcessMemory(Handle process, u32 startAddr, u32 endAddr); diff --git a/libctru/source/svc.s b/libctru/source/svc.s index af0d8a2..534a944 100644 --- a/libctru/source/svc.s +++ b/libctru/source/svc.s @@ -319,6 +319,30 @@ svcDebugActiveProcess: str r1, [r2] bx lr +.global svcBreakDebugProcess +.type svcBreakDebugProcess, %function +svcBreakDebugProcess: + svc 0x61 + bx lr + +.global svcTerminateDebugProcess +.type svcTerminateDebugProcess, %function +svcTerminateDebugProcess: + svc 0x62 + bx lr + +.global svcGetProcessDebugEvent +.type svcGetProcessDebugEvent, %function +svcGetProcessDebugEvent: + svc 0x63 + bx lr + +.global svcContinueDebugEvent +.type svcContinueDebugEvent, %function +svcContinueDebugEvent: + svc 0x64 + bx lr + .global svcGetProcessList .type svcGetProcessList, %function svcGetProcessList: