diff options
author | midipix <writeonce@midipix.org> | 2019-06-06 00:29:01 +0000 |
---|---|---|
committer | midipix <writeonce@midipix.org> | 2019-06-06 00:29:01 +0000 |
commit | 44a67f9f5f96136d7c8dc4cb48cc730a543c3bde (patch) | |
tree | 6fbd09426e0df1d28d154e0450ce8a74a6a96adf /include/sys | |
parent | 26ba506b86c0152030c7c761e744cb2b0d2d703a (diff) | |
download | mmglue-44a67f9f5f96136d7c8dc4cb48cc730a543c3bde.tar.bz2 mmglue-44a67f9f5f96136d7c8dc4cb48cc730a543c3bde.tar.xz |
glue layer: debug interfaces: introduced <sys/debug.h>.
Diffstat (limited to 'include/sys')
-rw-r--r-- | include/sys/debug.h | 162 |
1 files changed, 162 insertions, 0 deletions
diff --git a/include/sys/debug.h b/include/sys/debug.h new file mode 100644 index 0000000..cdb663d --- /dev/null +++ b/include/sys/debug.h @@ -0,0 +1,162 @@ +#include <stdint.h> +#include <stddef.h> +#include <signal.h> +#include <unistd.h> + +/* debug states */ +enum __dbg_state { + __DBG_STATE_IDLE, + __DBG_STATE_REPLY_PENDING, + + __DBG_STATE_CREATE_THREAD, + __DBG_STATE_CREATE_PROCESS, + + __DBG_STATE_EXIT_THREAD, + __DBG_STATE_EXIT_PROCESS, + + __DBG_STATE_EXCEPTION, + __DBG_STATE_BREAKPOINT, + __DBG_STATE_SINGLE_STEP, + + __DBG_STATE_DLL_LOAD, + __DBG_STATE_DLL_UNLOAD, +}; + +/* debug responses */ +#define __DBG_RESPONSE_CONTINUE (0x00010002) +#define __DBG_RESPONSE_EXCEPTION_HANDLED (0x00010001) +#define __DBG_RESPONSE_EXCEPTION_NOT_HANDLED (0x80010001) +#define __DBG_RESPONSE_REPLY_LATER (0x40010001) +#define __DBG_RESPONSE_TERMINATE_PROCESS (0x40010004) +#define __DBG_RESPONSE_TERMINATE_THREAD (0x40010003) + +/* thread types */ +#define __DBG_THREAD_TYPE_UNKNOWN 0x00 +#define __DBG_THREAD_TYPE_PTHREAD 0x01 +#define __DBG_THREAD_TYPE_DAEMON 0x02 +#define __DBG_THREAD_TYPE_PTYREF 0x03 +#define __DBG_THREAD_TYPE_POLLER 0x04 +#define __DBG_THREAD_TYPE_WAITER 0x05 +#define __DBG_THREAD_TYPE_TIMER 0x06 +#define __DBG_THREAD_TYPE_BRIDGE 0x07 +#define __DBG_THREAD_TYPE_PIPEIN 0x08 +#define __DBG_THREAD_TYPE_PIPEOUT 0x09 + +#define __DBG_THREAD_TYPE_TTYANY 0x40 +#define __DBG_THREAD_TYPE_TTYSRV 0x41 +#define __DBG_THREAD_TYPE_TTYSVC 0x42 +#define __DBG_THREAD_TYPE_TTYASYNC 0x43 +#define __DBG_THREAD_TYPE_TTYCLIENT 0x44 +#define __DBG_THREAD_TYPE_TTYDEBUG 0x45 +#define __DBG_THREAD_TYPE_TTYCONN 0x46 + +/* exception source bits */ +#define __DBG_EXCEPTION_SOURCE_UNKNOWN 0x00 +#define __DBG_EXCEPTION_SOURCE_HARDWARE 0x01 +#define __DBG_EXCEPTION_SOURCE_SOFTWARE 0x02 +#define __DBG_EXCEPTION_SOURCE_KERNEL 0x04 +#define __DBG_EXCEPTION_SOURCE_USER 0x08 + +/* exception record */ +struct __erec { + uint32_t exception_code; + uint32_t exception_flags; + struct __erec * exception_record; + void * exception_address; + uint32_t exception_params; + uintptr_t exception_info[0xf]; +}; + +/* debug event alpha definition */ +struct __dbg_event { + int evttype; + int evtzone; + + int32_t estatus; + int32_t eresponse; + + uint64_t evtkey; + uint64_t evtqpc; + + pid_t cpid; + pid_t ctid; + + pid_t syspid; + pid_t systid; + + mcontext_t * thread_context; + siginfo_t * thread_siginfo; + + stack_t * thread_cstack; + stack_t * thread_astack; + sigset_t * thread_sigmask; + + struct tstat * thread_stat; + struct __teb * thread_teb; + struct __tlca * thread_tlca; + + struct __erec * exception_record; + uint32_t exception_priority; + uint32_t exception_source; + + int syscall_depth; + int syscall_number; + intptr_t syscall_result; + intptr_t syscall_params[6]; + + uint32_t * thread_subsystem_key; + void * thread_start_address; + int32_t * thread_exit_code; + + uint32_t * process_subsystem_key; + void * process_image_handle; + void * process_image_base; + int32_t * process_exit_code; + + void * module_image_handle; + void * module_image_base; + + uint32_t dbg_info_offset; + uint32_t dbg_info_size; + + const char * image_rpath; + const char * image_apath; + const char * image_npath; + const char * image_dpath; +}; + +/* pid (or syspid) --> debug file descriptor */ +int __dbg_attach(pid_t); +int __dbg_detach(int); + +/* process creation/suspension/termination --> debug file descriptor */ +int __dbg_spawn(const char *, char **, char **); +int __dbg_fork(); +int __dbg_suspend(int); +int __dbg_kill(int); + +/** + * query one (or all) pending debug event(s) for the given debug + * file descriptor: + * in the 'one' case, the return value indicates the total number + * of events that are pending for the given file descriptor; + * in the 'all' case, the third argument specifies the number + * of elements in the user-provided buffer. +**/ +int __dbg_event_query_one(int,struct __dbg_event *); +int __dbg_event_query_all(int,struct __dbg_event[],int); + +/** + * first acquire (remove from the queue) the next pending debug event; + * later respond to the event, the default being __DBG_RESPONSE_CONTINUE. +**/ +int __dbg_event_acquire(int,struct __dbg_event *); +int __dbg_event_respond(int,struct __dbg_event *); + +/* debug file descriptor --> common (or system) pid */ +int __dbg_query_cpid(int); +int __dbg_query_syspid(int); + +/* code of last debug operation error encountered by this pthread */ +int __dbg_common_error(void); +int __dbg_native_error(void); |