Subversion Repositories HelenOS

Rev

Rev 2899 | Rev 2903 | Go to most recent revision | Blame | Compare with Previous | Last modification | View Log | Download | RSS feed

  1. /*
  2.  * Copyright (c) 2008 Jiri Svoboda
  3.  * All rights reserved.
  4.  *
  5.  * Redistribution and use in source and binary forms, with or without
  6.  * modification, are permitted provided that the following conditions
  7.  * are met:
  8.  *
  9.  * - Redistributions of source code must retain the above copyright
  10.  *   notice, this list of conditions and the following disclaimer.
  11.  * - Redistributions in binary form must reproduce the above copyright
  12.  *   notice, this list of conditions and the following disclaimer in the
  13.  *   documentation and/or other materials provided with the distribution.
  14.  * - The name of the author may not be used to endorse or promote products
  15.  *   derived from this software without specific prior written permission.
  16.  *
  17.  * THIS SOFTWARE IS PROVIDED BY THE AUTHOR ``AS IS'' AND ANY EXPRESS OR
  18.  * IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES
  19.  * OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED.
  20.  * IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR ANY DIRECT, INDIRECT,
  21.  * INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT
  22.  * NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
  23.  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
  24.  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
  25.  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
  26.  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
  27.  */
  28.  
  29. /** @addtogroup generic
  30.  * @{
  31.  */
  32. /** @file
  33.  */
  34.  
  35. #ifndef KERN_UDEBUG_H_
  36. #define KERN_UDEBUG_H_
  37.  
  38. typedef enum { /* udebug_method_t */
  39.  
  40. /** Start debugging the recipient.
  41.  * Causes all threads in the receiving task to stop. When they
  42.  * are all stoped, an answer with retval 0 is generated.
  43.  */
  44. UDEBUG_M_BEGIN = 1,
  45.  
  46. /** Finish debugging the recipient.
  47.  * Answers all pending GO and GUARD messages.
  48.  */
  49. UDEBUG_M_END,
  50.  
  51. /** Set which events should be captured.
  52.  */
  53. UDEBUG_M_SET_EVMASK,
  54.  
  55. /** Make sure the debugged task is still there.
  56.  * This message is answered when the debugged task dies
  57.  * or the debugging session ends.
  58.  */
  59. UDEBUG_M_GUARD,
  60.  
  61. /** Run a thread until a debugging event occurs.
  62.  * This message is answered when the thread stops
  63.  * in a debugging event.
  64.  *
  65.  * - ARG2 - id of the thread to run
  66.  */
  67. UDEBUG_M_GO,
  68.  
  69. /** Stop a thread being debugged.
  70.  * Creates a special STOP event in the thread, causing
  71.  * it to answer a pending GO message (if any).
  72.  */
  73. UDEBUG_M_STOP,
  74.  
  75. /** Read arguments of a syscall.
  76.  *
  77.  * - ARG2 - thread identification
  78.  * - ARG3 - destination address in the caller's address space
  79.  *
  80.  */
  81. UDEBUG_M_ARGS_READ,
  82.  
  83. /** Read thread's userspace register state (istate_t).
  84.  *
  85.  * - ARG2 - thread identification
  86.  * - ARG3 - destination address in the caller's address space
  87.  * - ARG4 - size of receiving buffer in bytes
  88.  *
  89.  * on answer, the kernel will set:
  90.  *
  91.  * - ARG1 - actual size in bytes of data read
  92.  * - ARG2 - total size in bytes of data available
  93.  *
  94.  * or, on error, retval will be
  95.  * - ENOENT - thread does not exist
  96.  * - EBUSY - register state not available
  97.  */
  98. UDEBUG_M_REGS_READ,
  99.  
  100. /** Write thread's userspace register state (istate_t).
  101.  *
  102.  * - ARG2 - thread identification
  103.  * - ARG3 - source address in the caller's address space
  104.  * - ARG4 - size of source data in bytes
  105.  *
  106.  * on answer, the kernel will set:
  107.  *
  108.  * - ARG1 - actual size in bytes of data copied
  109.  * - ARG2 - max size in bytes that could have been copied
  110.  *
  111.  * or, on error, retval will be
  112.  * - ENOENT - thread does not exist
  113.  * - EBUSY - register state not available
  114.  */
  115. UDEBUG_M_REGS_WRITE,
  116.  
  117. /** Read the list of the debugged tasks's threads.
  118.  *
  119.  * - ARG2 - destination address in the caller's address space
  120.  * - ARG3 - size of receiving buffer in bytes
  121.  *
  122.  * The kernel fills the buffer with a series of sysarg_t values
  123.  * (thread ids). On answer, the kernel will set:
  124.  *
  125.  * - ARG2 - number of bytes that were actually copied
  126.  * - ARG3 - number of bytes of the complete data
  127.  *
  128.  */
  129. UDEBUG_M_THREAD_READ,
  130.  
  131. /** Read the debugged tasks's memory.
  132.  *
  133.  * - ARG2 - destination address in the caller's address space
  134.  * - ARG3 - source address in the recipient's address space
  135.  * - ARG4 - size of receiving buffer in bytes
  136.  *
  137.  */
  138. UDEBUG_M_MEM_READ,
  139.  
  140. /** Write the debugged tasks's memory.
  141.  *
  142.  * - ARG2 - source address in the caller's address space
  143.  * - ARG3 - destination address in the recipient's address space
  144.  * - ARG4 - size of receiving buffer in bytes
  145.  *
  146.  */
  147. UDEBUG_M_MEM_WRITE
  148.  
  149.  
  150. } udebug_method_t;
  151.  
  152.                
  153. typedef enum {
  154.     UDEBUG_EVENT_FINISHED = 1/**< Debuging session has finished */
  155.     UDEBUG_EVENT_STOP,      /**< Stopped on DEBUG_STOP request */
  156.     UDEBUG_EVENT_SYSCALL_B,     /**< Before beginning syscall execution */
  157.     UDEBUG_EVENT_SYSCALL_E,     /**< After finishing syscall execution */
  158.     UDEBUG_EVENT_NEW_THREAD     /**< The task created a new thread */
  159. } udebug_event_t;
  160.  
  161. #define UDEBUG_EVMASK(event) (1 << ((event) - 1))
  162.  
  163. typedef enum {
  164.     UDEBUG_EM_FINISHED  = UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED),
  165.     UDEBUG_EM_STOP      = UDEBUG_EVMASK(UDEBUG_EVENT_STOP),
  166.     UDEBUG_EM_SYSCALL_B = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B),
  167.     UDEBUG_EM_SYSCALL_E = UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E),
  168.     UDEBUG_EM_NEW_THREAD    = UDEBUG_EVMASK(UDEBUG_EVENT_NEW_THREAD),
  169.     UDEBUG_EM_ALL       =
  170.         UDEBUG_EVMASK(UDEBUG_EVENT_FINISHED) |
  171.         UDEBUG_EVMASK(UDEBUG_EVENT_STOP) |
  172.         UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_B) |
  173.         UDEBUG_EVMASK(UDEBUG_EVENT_SYSCALL_E) |
  174.         UDEBUG_EVMASK(UDEBUG_EVENT_NEW_THREAD)
  175. } udebug_evmask_t;
  176.  
  177. #ifdef KERNEL
  178.  
  179. typedef enum {
  180.     /** Task is not being debugged */
  181.     UDEBUG_TS_INACTIVE,
  182.     /** BEGIN operation in progress (waiting for threads to stop) */
  183.     UDEBUG_TS_BEGINNING,
  184.     /** Debugger fully connected */
  185.     UDEBUG_TS_ACTIVE,
  186.     /** Task is shutting down, no more debug activities allowed */
  187.     UDEBUG_TS_SHUTDOWN
  188. } udebug_task_state_t;
  189.  
  190. struct task;
  191. struct thread;
  192.  
  193. void udebug_syscall_event(unative_t a1, unative_t a2, unative_t a3,
  194.     unative_t a4, unative_t a5, unative_t a6, unative_t id, unative_t rc,
  195.     bool end_variant);
  196. void udebug_new_thread_event(struct thread *t);
  197.  
  198. void udebug_stoppable_begin(void);
  199. void udebug_stoppable_end(void);
  200.  
  201. int udebug_task_cleanup(struct task *ta);
  202.  
  203. #endif
  204.  
  205. #endif
  206.  
  207. /** @}
  208.  */
  209.