/** @addtogroup generic
* @{
*/
/** @file
*/
#ifndef KERN_UDEBUG_H_
#define KERN_UDEBUG_H_
typedef enum { /* udebug_method_t */
/** Start debugging the recipient.
* Causes all threads in the receiving task to stop. When they
* are all stoped, an answer with retval 0 is generated.
*/
UDEBUG_M_BEGIN = 1,
/** Finish debugging the recipient.
* Answers all pending GO and GUARD messages.
*/
UDEBUG_M_END,
/** Make sure the debugged task is still there.
* This message is answered when the debugged task dies
* or the debugging session ends.
*/
UDEBUG_M_GUARD,
/** Run a thread until a debugging event occurs.
* This message is answered when the thread stops
* in a debugging event.
*
* - ARG2 - id of the thread to run
*/
UDEBUG_M_GO,
/** Stop a thread being debugged.
* Creates a special STOP event in the thread, causing
* it to answer a pending GO message (if any).
*/
UDEBUG_M_STOP,
/** Read arguments of a syscall.
*
* - ARG2 - thread identification
* - ARG3 - destination address in the caller's address space
*
*/
UDEBUG_M_ARGS_READ,
/** Read thread's userspace register state (istate_t).
*
* - ARG2 - thread identification
* - ARG3 - destination address in the caller's address space
* - ARG4 - size of receiving buffer in bytes
*
* on answer, the kernel will set:
*
* - ARG1 - actual size in bytes of data read
* - ARG2 - total size in bytes of data available
*
* or, on error, retval will be
* - ENOENT - thread does not exist
* - EBUSY - register state not available
*/
UDEBUG_M_REGS_READ,
/** Write thread's userspace register state (istate_t).
*
* - ARG2 - thread identification
* - ARG3 - source address in the caller's address space
* - ARG4 - size of source data in bytes
*
* on answer, the kernel will set:
*
* - ARG1 - actual size in bytes of data copied
* - ARG2 - max size in bytes that could have been copied
*
* or, on error, retval will be
* - ENOENT - thread does not exist
* - EBUSY - register state not available
*/
UDEBUG_M_REGS_WRITE,
/** Read the list of the debugged tasks's threads.
*
* - ARG2 - destination address in the caller's address space
* - ARG3 - size of receiving buffer in bytes
*
* The kernel fills the buffer with a series of sysarg_t values
* (thread ids). On answer, the kernel will set:
*
* - ARG1 - number of bytes that were actually copied
* - ARG2 - number of bytes of the complete data
*
*/
UDEBUG_M_THREAD_READ,
/** Read the debugged tasks's memory.
*
* - ARG2 - destination address in the caller's address space
* - ARG3 - source address in the recipient's address space
* - ARG4 - size of receiving buffer in bytes
*
*/
UDEBUG_M_MEM_READ,
/** Write the debugged tasks's memory.
*
* - ARG2 - source address in the caller's address space
* - ARG3 - destination address in the recipient's address space
* - ARG4 - size of receiving buffer in bytes
*
*/
UDEBUG_M_MEM_WRITE
} udebug_method_t;
typedef enum {
UDEBUG_EVENT_FINISHED = 1, /**< Debuging session has finished */
UDEBUG_EVENT_SYSCALL, /**< A syscall has been executed */
UDEBUG_EVENT_NEW_THREAD /**< The task created a new thread */
} udebug_event_t;
#ifdef KERNEL
typedef enum {
/** Task is not being debugged */
UDEBUG_TS_INACTIVE,
/** BEGIN operation in progress (waiting for threads to stop) */
UDEBUG_TS_BEGINNING,
/** Debugger fully connected */
UDEBUG_TS_ACTIVE,
/** Task is shutting down, no more debug activities allowed */
UDEBUG_TS_SHUTDOWN
} udebug_task_state_t;
struct task;
struct thread;
void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3,
unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc);
void udebug_new_thread_event(struct thread *t);
void udebug_stoppable_begin(void);
void udebug_stoppable_end(void);
int udebug_task_cleanup(struct task *ta);
#endif
#endif
/** @}
*/