summaryrefslogtreecommitdiffstats
path: root/cpukit/libdebugger/rtems-debugger-server.h
blob: a345d7649ee535c9e8b9f4e6206440d586471e00 (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
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