]> Chaos Git - corbenik/ctrulib.git/commitdiff
add syscalls 0x61, 0x62, 0x63, 0x64
authorpatois <dennis@backtrace.de>
Mon, 9 Mar 2015 03:54:03 +0000 (04:54 +0100)
committerpatois <dennis@backtrace.de>
Tue, 10 Mar 2015 11:43:15 +0000 (12:43 +0100)
libctru/include/3ds/svc.h
libctru/source/svc.s

index 14dfb4ea48391f86d16f2e1d0f13e9226911997b..08a25ab979c822c6c2f6da7163bd934fb5a388a4 100644 (file)
@@ -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);
index af0d8a24c96785a7ab96fbb49d108cc398d52570..534a944bcab0d275511182cab67699cb994bf3d3 100644 (file)
@@ -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: