diff options
Diffstat (limited to 'cpukit/include/rtems/debugger/rtems-debugger-server.h')
-rw-r--r-- | cpukit/include/rtems/debugger/rtems-debugger-server.h | 217 |
1 files changed, 217 insertions, 0 deletions
diff --git a/cpukit/include/rtems/debugger/rtems-debugger-server.h b/cpukit/include/rtems/debugger/rtems-debugger-server.h new file mode 100644 index 0000000000..a345d7649e --- /dev/null +++ b/cpukit/include/rtems/debugger/rtems-debugger-server.h @@ -0,0 +1,217 @@ +/* + * 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 |