Ignore:
File:
1 edited

Legend:

Unmodified
Added
Removed
  • kernel/generic/include/udebug/udebug.h

    r9c81703 r3698e44  
    3636#define KERN_UDEBUG_H_
    3737
    38 #define UDEBUG_EVMASK(event)  (1 << ((event) - 1))
     38#include <ipc/ipc.h>
    3939
    4040typedef enum { /* udebug_method_t */
    41        
    42         /** Start debugging the recipient.
    43          *
    44          * Causes all threads in the receiving task to stop. When they
    45          * are all stoped, an answer with retval 0 is generated.
    46          *
    47          */
    48         UDEBUG_M_BEGIN = 1,
    49        
    50         /** Finish debugging the recipient.
    51          *
    52          * Answers all pending GO and GUARD messages.
    53          *
    54          */
    55         UDEBUG_M_END,
    56        
    57         /** Set which events should be captured. */
    58         UDEBUG_M_SET_EVMASK,
    59        
    60         /** Make sure the debugged task is still there.
    61          *
    62          * This message is answered when the debugged task dies
    63          * or the debugging session ends.
    64          *
    65          */
    66         UDEBUG_M_GUARD,
    67        
    68         /** Run a thread until a debugging event occurs.
    69          *
    70          * This message is answered when the thread stops
    71          * in a debugging event.
    72          *
    73          * - ARG2 - id of the thread to run
    74          *
    75          */
    76         UDEBUG_M_GO,
    77        
    78         /** Stop a thread being debugged.
    79          *
    80          * Creates a special STOP event in the thread, causing
    81          * it to answer a pending GO message (if any).
    82          *
    83          */
    84         UDEBUG_M_STOP,
    85        
    86         /** Read arguments of a syscall.
    87          *
    88          * - ARG2 - thread identification
    89          * - ARG3 - destination address in the caller's address space
    90          *
    91          */
    92         UDEBUG_M_ARGS_READ,
    93        
    94         /** Read thread's userspace register state (istate_t).
    95          *
    96          * - ARG2 - thread identification
    97          * - ARG3 - destination address in the caller's address space
    98          *
    99          * or, on error, retval will be
    100          * - ENOENT - thread does not exist
    101          * - EBUSY - register state not available
    102          */
    103         UDEBUG_M_REGS_READ,
    104        
    105         /** Read the list of the debugged tasks's threads.
    106          *
    107          * - ARG2 - destination address in the caller's address space
    108          * - ARG3 - size of receiving buffer in bytes
    109          *
    110          * The kernel fills the buffer with a series of sysarg_t values
    111          * (thread ids). On answer, the kernel will set:
    112          *
    113          * - ARG2 - number of bytes that were actually copied
    114          * - ARG3 - number of bytes of the complete data
    115          *
    116          */
    117         UDEBUG_M_THREAD_READ,
    118        
    119         /** Read the name of the debugged task.
    120          *
    121          * - ARG2 - destination address in the caller's address space
    122          * - ARG3 - size of receiving buffer in bytes
    123          *
    124          * The kernel fills the buffer with a non-terminated string.
    125          *
    126          * - ARG2 - number of bytes that were actually copied
    127          * - ARG3 - number of bytes of the complete data
    128          *
    129          */
    130         UDEBUG_M_NAME_READ,
    131        
    132         /** Read the list of the debugged task's address space areas.
    133          *
    134          * - ARG2 - destination address in the caller's address space
    135          * - ARG3 - size of receiving buffer in bytes
    136          *
    137          * The kernel fills the buffer with a series of as_area_info_t structures.
    138          * Upon answer, the kernel will set:
    139          *
    140          * - ARG2 - number of bytes that were actually copied
    141          * - ARG3 - number of bytes of the complete data
    142          *
    143          */
    144         UDEBUG_M_AREAS_READ,
    145        
    146         /** Read the debugged tasks's memory.
    147          *
    148          * - ARG2 - destination address in the caller's address space
    149          * - ARG3 - source address in the recipient's address space
    150          * - ARG4 - size of receiving buffer in bytes
    151          *
    152          */
    153         UDEBUG_M_MEM_READ
     41
     42/** Start debugging the recipient.
     43 * Causes all threads in the receiving task to stop. When they
     44 * are all stoped, an answer with retval 0 is generated.
     45 */
     46UDEBUG_M_BEGIN = 1,
     47
     48/** Finish debugging the recipient.
     49 * Answers all pending GO and GUARD messages.
     50 */
     51UDEBUG_M_END,
     52
     53/** Set which events should be captured.
     54 */
     55UDEBUG_M_SET_EVMASK,
     56
     57/** Make sure the debugged task is still there.
     58 * This message is answered when the debugged task dies
     59 * or the debugging session ends.
     60 */
     61UDEBUG_M_GUARD,
     62
     63/** Run a thread until a debugging event occurs.
     64 * This message is answered when the thread stops
     65 * in a debugging event.
     66 *
     67 * - ARG2 - id of the thread to run
     68 */
     69UDEBUG_M_GO,
     70
     71/** Stop a thread being debugged.
     72 * Creates a special STOP event in the thread, causing
     73 * it to answer a pending GO message (if any).
     74 */
     75UDEBUG_M_STOP,
     76
     77/** Read arguments of a syscall.
     78 *
     79 * - ARG2 - thread identification
     80 * - ARG3 - destination address in the caller's address space
     81 *
     82 */
     83UDEBUG_M_ARGS_READ,
     84
     85/** Read thread's userspace register state (istate_t).
     86 *
     87 * - ARG2 - thread identification
     88 * - ARG3 - destination address in the caller's address space
     89 *
     90 * or, on error, retval will be
     91 * - ENOENT - thread does not exist
     92 * - EBUSY - register state not available
     93 */
     94UDEBUG_M_REGS_READ,
     95
     96/** Read the list of the debugged tasks's threads.
     97 *
     98 * - ARG2 - destination address in the caller's address space
     99 * - ARG3 - size of receiving buffer in bytes
     100 *
     101 * The kernel fills the buffer with a series of sysarg_t values
     102 * (thread ids). On answer, the kernel will set:
     103 *
     104 * - ARG2 - number of bytes that were actually copied
     105 * - ARG3 - number of bytes of the complete data
     106 *
     107 */
     108UDEBUG_M_THREAD_READ,
     109
     110/** Read the name of the debugged task.
     111 *
     112 * - ARG2 - destination address in the caller's address space
     113 * - ARG3 - size of receiving buffer in bytes
     114 *
     115 * The kernel fills the buffer with a non-terminated string.
     116 *
     117 * - ARG2 - number of bytes that were actually copied
     118 * - ARG3 - number of bytes of the complete data
     119 *
     120 */
     121UDEBUG_M_NAME_READ,
     122
     123/** Read the list of the debugged task's address space areas.
     124 *
     125 * - ARG2 - destination address in the caller's address space
     126 * - ARG3 - size of receiving buffer in bytes
     127 *
     128 * The kernel fills the buffer with a series of as_area_info_t structures.
     129 * Upon answer, the kernel will set:
     130 *
     131 * - ARG2 - number of bytes that were actually copied
     132 * - ARG3 - number of bytes of the complete data
     133 *
     134 */
     135UDEBUG_M_AREAS_READ,
     136
     137/** Read the debugged tasks's memory.
     138 *
     139 * - ARG2 - destination address in the caller's address space
     140 * - ARG3 - source address in the recipient's address space
     141 * - ARG4 - size of receiving buffer in bytes
     142 *
     143 */
     144UDEBUG_M_MEM_READ,
     145
    154146} udebug_method_t;
    155147
     148
    156149typedef enum {
    157         UDEBUG_EVENT_FINISHED = 1,  /**< Debuging session has finished */
    158         UDEBUG_EVENT_STOP,          /**< Stopped on DEBUG_STOP request */
    159         UDEBUG_EVENT_SYSCALL_B,     /**< Before beginning syscall execution */
    160         UDEBUG_EVENT_SYSCALL_E,     /**< After finishing syscall execution */
    161         UDEBUG_EVENT_THREAD_B,      /**< The task created a new thread */
    162         UDEBUG_EVENT_THREAD_E       /**< A thread exited */
     150        UDEBUG_EVENT_FINISHED = 1,      /**< Debuging session has finished */
     151        UDEBUG_EVENT_STOP,              /**< Stopped on DEBUG_STOP request */
     152        UDEBUG_EVENT_SYSCALL_B,         /**< Before beginning syscall execution */
     153        UDEBUG_EVENT_SYSCALL_E,         /**< After finishing syscall execution */
     154        UDEBUG_EVENT_THREAD_B,          /**< The task created a new thread */
     155        UDEBUG_EVENT_THREAD_E           /**< A thread exited */
    163156} udebug_event_t;
    164157
     158#define UDEBUG_EVMASK(event) (1 << ((event) - 1))
     159
    165160typedef enum {
    166         UDEBUG_EM_FINISHED = UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED),
    167         UDEBUG_EM_STOP = UDEBUG_EVMASK(UDEBUG_EVENT_STOP),
    168         UDEBUG_EM_SYSCALL_B = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B),
    169         UDEBUG_EM_SYSCALL_E = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E),
    170         UDEBUG_EM_THREAD_B = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B),
    171         UDEBUG_EM_THREAD_E = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E),
    172         UDEBUG_EM_ALL =
    173             (UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) |
    174             UDEBUG_EVMASK(UDEBUG_EVENT_STOP) |
    175             UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B) |
    176             UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) |
    177             UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B) |
    178             UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E))
     161        UDEBUG_EM_FINISHED      = UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED),
     162        UDEBUG_EM_STOP          = UDEBUG_EVMASK(UDEBUG_EVENT_STOP),
     163        UDEBUG_EM_SYSCALL_B     = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B),
     164        UDEBUG_EM_SYSCALL_E     = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E),
     165        UDEBUG_EM_THREAD_B      = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B),
     166        UDEBUG_EM_THREAD_E      = UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E),
     167        UDEBUG_EM_ALL           =
     168                UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) |
     169                UDEBUG_EVMASK(UDEBUG_EVENT_STOP) |
     170                UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B) |
     171                UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) |
     172                UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_B) |
     173                UDEBUG_EVMASK(UDEBUG_EVENT_THREAD_E)
    179174} udebug_evmask_t;
    180175
    181176#ifdef KERNEL
    182177
    183 #include <ipc/ipc.h>
    184178#include <synch/mutex.h>
    185179#include <synch/condvar.h>
     
    202196        mutex_t lock;
    203197        char *lock_owner;
    204        
     198
    205199        udebug_task_state_t dt_state;
    206200        call_t *begin_call;
     
    215209        /** Synchronize debug ops on this thread / access to this structure. */
    216210        mutex_t lock;
    217        
     211
    218212        waitq_t go_wq;
    219213        call_t *go_call;
    220         sysarg_t syscall_args[6];
     214        unative_t syscall_args[6];
    221215        istate_t *uspace_state;
    222        
     216
    223217        /** What type of event are we stopped in or 0 if none. */
    224218        udebug_event_t cur_event;
    225         bool go;         /**< Thread is GO */
    226         bool stoppable;  /**< Thread is stoppable */
    227         bool active;     /**< Thread is in a debugging session */
     219        bool go;                /**< thread is GO */
     220        bool stoppable;         /**< thread is stoppable */
     221        bool active;            /**< thread is in a debugging session */
    228222        condvar_t active_cv;
    229223} udebug_thread_t;
     
    232226struct thread;
    233227
    234 void udebug_task_init(udebug_task_t *);
    235 void udebug_thread_initialize(udebug_thread_t *);
    236 
    237 void udebug_syscall_event(sysarg_t, sysarg_t, sysarg_t, sysarg_t, sysarg_t,
    238     sysarg_t, sysarg_t, sysarg_t, bool);
    239 
    240 void udebug_thread_b_event_attach(struct thread *, struct task *);
     228void udebug_task_init(udebug_task_t *ut);
     229void udebug_thread_initialize(udebug_thread_t *ut);
     230
     231void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3,
     232    unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc,
     233    bool end_variant);
     234
     235void udebug_thread_b_event_attach(struct thread *t, struct task *ta);
    241236void udebug_thread_e_event(void);
    242237
     
    246241void udebug_before_thread_runs(void);
    247242
    248 int udebug_task_cleanup(struct task *);
     243int udebug_task_cleanup(struct task *ta);
    249244void udebug_thread_fault(void);
    250245
Note: See TracChangeset for help on using the changeset viewer.