summaryrefslogblamecommitdiffstats
path: root/cpukit/libdebugger/rtems-debugger-server.h
blob: a345d7649ee535c9e8b9f4e6206440d586471e00 (plain) (tree)
1
2
3
  

                                                          



































































































                                                                             

                                                 








                                                             





                                                       






                                   
                               

                                      
                                      













                                                             
                                            












                                                                                 


                                                                                       



                     
                                      



                       
                                        



                               
                                                



                                           
                                                                 



                             
                                           



                                         
                                                       

   
                                                   
   
                                                      



















                                                            
/*
 * Copyright (c) 2016-2017 Chris Johns <chrisj@rtems.org>.
 * All rights reserved.
 *
 * Redistribution and use in source and binary forms, with or without
 * modification, are permitted provided that the following conditions
 * are met:
 * 1. Redistributions of source code must retain the above copyright
 *    notice, this list of conditions and the following disclaimer.
 * 2. Redistributions in binary form must reproduce the above copyright
 *    notice, this list of conditions and the following disclaimer in the
 *    documentation and/or other materials provided with the distribution.
 *
 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
 * SUCH DAMAGE.
 */

/*
 * Debugger for RTEMS.
 */

#ifndef _RTEMS_DEBUGGER_SERVER_h
#define _RTEMS_DEBUGGER_SERVER_h

#include <rtems.h>
#include <rtems/printer.h>

#include <rtems/rtems-debugger.h>

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/**
 * Debugger NUMOF macro.
 */
#define RTEMS_DEBUGGER_NUMOF(_d) (sizeof(_d) / sizeof(_d[0]))

/**
 * Machine specific size. Here for 64bit support.
 */
#define DB_UINT uint32_t

/*
 * Debugger signals.
 */
#define RTEMS_DEBUGGER_SIGNAL_HUP   1     /* Hangup */
#define RTEMS_DEBUGGER_SIGNAL_INT   2     /* Interrupt */
#define RTEMS_DEBUGGER_SIGNAL_QUIT  3     /* Quit */
#define RTEMS_DEBUGGER_SIGNAL_ILL   4     /* Illegal instruction */
#define RTEMS_DEBUGGER_SIGNAL_TRAP  5     /* Trace/breakpoint trap */
#define RTEMS_DEBUGGER_SIGNAL_ABRT  6     /* Aborted */
#define RTEMS_DEBUGGER_SIGNAL_EMT   7     /* Emulation trap */
#define RTEMS_DEBUGGER_SIGNAL_FPE   8     /* Arithmetic exception */
#define RTEMS_DEBUGGER_SIGNAL_KILL  9     /* Killed */
#define RTEMS_DEBUGGER_SIGNAL_BUS   10    /* Bus error */
#define RTEMS_DEBUGGER_SIGNAL_SEGV  11    /* Segmentation fault */
#define RTEMS_DEBUGGER_SIGNAL_SYS   12    /* Bad system call */
#define RTEMS_DEBUGGER_SIGNAL_PIPE  13    /* Broken pipe */
#define RTEMS_DEBUGGER_SIGNAL_ALRM  14    /* Alarm clock */
#define RTEMS_DEBUGGER_SIGNAL_TERM  15    /* Terminated */
#define RTEMS_DEBUGGER_SIGNAL_URG   16    /* Urgent I/O condition */
#define RTEMS_DEBUGGER_SIGNAL_STOP  17    /* Stopped (signal) */
#define RTEMS_DEBUGGER_SIGNAL_TSTP  18    /* Stopped (user) */
#define RTEMS_DEBUGGER_SIGNAL_CONT  19    /* Continued */

/**
 * Timeout period for the Debugger task to stop in usecs.
 */
#define RTEMS_DEBUGGER_TIMEOUT_STOP (5 * 1000 * 1000)

/**
 * Debugger poll wait timeout in usecs.
 */
#define RTEMS_DEBUGGER_POLL_WAIT (10000)

/**
 * Debugger task stack size.
 */
#define RTEMS_DEBUGGER_STACKSIZE (16 * 1024)

/**
 * Debugger output buffer size.
 */
#define RTEMS_DEBUGGER_BUFFER_SIZE (4 * 1024)

/**
 * Debugger flags.
 */
#define RTEMS_DEBUGGER_FLAG_VERBOSE      (1 << 0)
#define RTEMS_DEBUGGER_FLAG_RESET        (1 << 1)
#define RTEMS_DEBUGGER_FLAG_NON_STOP     (1 << 2)
#define RTEMS_DEBUGGER_FLAG_VCONT        (1 << 3)
#define RTEMS_DEBUGGER_FLAG_MULTIPROCESS (1 << 4)
#define RTEMS_DEBUGGER_FLAG_VERBOSE_LOCK (1 << 5)
#define RTEMS_DEBUGGER_FLAG_VERBOSE_CMDS (1 << 6)

/**
 * Forward decl for the threads and targets.
 */
typedef struct rtems_debugger_remote  rtems_debugger_remote;
typedef struct rtems_debugger_threads rtems_debugger_threads;
typedef struct rtems_debugger_target  rtems_debugger_target;

/**
 * Local types for the RTEMS-X interface.
 */
typedef struct _Condition_Control       rtems_rx_cond;
typedef struct _Mutex_recursive_Control rtems_rx_mutex;

/**
 * Debugger data.
 */
typedef struct
{
  int                     port;
  int                     timeout;
  rtems_task_priority     priority;
  rtems_rx_mutex          lock;
  rtems_debugger_remote*  remote;
  rtems_id                server_task;
  rtems_rx_cond           server_cond;
  volatile bool           server_running;
  volatile bool           server_finished;
  rtems_id                events_task;
  volatile bool           events_running;
  volatile bool           events_finished;
  rtems_printer           printer;
  uint32_t                flags;
  pid_t                   pid;
  bool                    remote_debug;
  bool                    ack_pending;
  size_t                  output_level;
  uint8_t                 input[RTEMS_DEBUGGER_BUFFER_SIZE];
  uint8_t                 output[RTEMS_DEBUGGER_BUFFER_SIZE];
  rtems_debugger_threads* threads;
  rtems_chain_control     exception_threads;
  int                     signal;
  rtems_debugger_target*  target;
} rtems_debugger_server;

/**
 * Debugger global variable.
 */
extern rtems_debugger_server* rtems_debugger;

/**
 * Debug server printer.
 */
extern int rtems_debugger_printf(const char* format, ...) RTEMS_PRINTFLIKE(1, 2);
extern int rtems_debugger_clean_printf(const char* format, ...) RTEMS_PRINTFLIKE(1, 2);
extern void rtems_debugger_printk_lock(rtems_interrupt_lock_context* lock_context);
extern void rtems_debugger_printk_unlock(rtems_interrupt_lock_context* lock_context);

/**
 * Lock the Debugger.
 */
extern void rtems_debugger_lock(void);

/**
 * Unlock the Debugger.
 */
extern void rtems_debugger_unlock(void);

/**
 * Is the server still running?
 */
extern bool rtems_debugger_server_running(void);

/**
 * Get the remote handle from the debugger.
 */
extern rtems_debugger_remote* rtems_debugger_remote_handle(void);

/**
 * Is the debugger connected?
 */
extern bool rtems_debugger_connected(void);

/**
 * Is the debugger events thread runnins?
 */
extern bool rtems_debugger_server_events_running(void);

/**
 * Signal events thread in the debug server to run.
 */
extern void rtems_debugger_server_events_signal(void);

/**
 * Check if verbose is on.
 */
extern bool rtems_debugger_verbose(void);

/**
 * Check a flag.
 */
static inline bool rtems_debugger_server_flag(uint32_t mask)
{
  return (rtems_debugger->flags & mask) != 0;
}

#ifdef __cplusplus
}
#endif /* __cplusplus */


#endif