source: rtems/cpukit/libdebugger/rtems-debugger-target.h @ ea1a4fd2

Last change on this file since ea1a4fd2 was ea1a4fd2, checked in by Kinsey Moore <kinsey.moore@…>, on 02/10/22 at 16:03:01

cpukit/libdebugger: Add pure swbreak capability

Add a capability that allows for implementations that operate purely
using software breaks. Due to this implementation method, software
breaks must not be restored until just before returning control to the
thread itself and will be handled by the implementation through thread
switch and interrupt hooks.

  • Property mode set to 100644
File size: 8.4 KB
Line 
1/*
2 * Copyright (c) 2016-2017 Chris Johns <chrisj@rtems.org>.
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 * 1. Redistributions of source code must retain the above copyright
9 *    notice, this list of conditions and the following disclaimer.
10 * 2. Redistributions in binary form must reproduce the above copyright
11 *    notice, this list of conditions and the following disclaimer in the
12 *    documentation and/or other materials provided with the distribution.
13 *
14 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND
15 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
16 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
17 * ARE DISCLAIMED.  IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE
18 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
19 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
20 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
21 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
22 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
23 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
24 * SUCH DAMAGE.
25 */
26
27/*
28 * Debugger for RTEMS.
29 */
30
31#ifndef _RTEMS_DEBUGGER_TARGET_h
32#define _RTEMS_DEBUGGER_TARGET_h
33
34#include <setjmp.h>
35
36#include <rtems/rtems-debugger.h>
37
38#include "rtems-debugger-threads.h"
39
40#ifdef __cplusplus
41extern "C" {
42#endif /* __cplusplus */
43
44/*
45 * Software breakpoint block size.
46 */
47#define RTEMS_DEBUGGER_TARGET_SWBREAK_NUM 64
48
49/**
50 * Target capabilities mask.
51 */
52#define RTEMS_DEBUGGER_TARGET_CAP_SWBREAK      (1 << 0)
53#define RTEMS_DEBUGGER_TARGET_CAP_HWBREAK      (1 << 1)
54#define RTEMS_DEBUGGER_TARGET_CAP_HWWATCH      (1 << 2)
55/*
56 * This target capability indicates that the target implementation uses a pure
57 * software break implementation which must not allow breakpoints to be
58 * inserted before the actual switch to the thread, be it in interrupt context
59 * or otherwise. Such implementations must necessarily implement a thread
60 * switch hook and interrupt hooks to handle these situations.
61 */
62#define RTEMS_DEBUGGER_TARGET_CAP_PURE_SWBREAK (1 << 3)
63
64/**
65 * Types of hardware breakpoints.
66 */
67typedef enum rtems_debugger_target_watchpoint
68{
69  rtems_debugger_target_hw_read,
70  rtems_debugger_target_hw_write,
71  rtems_debugger_target_hw_read_write,
72  rtems_debugger_target_hw_execute
73} rtems_debugger_target_watchpoint;
74
75/**
76 * Target exception actions.
77 */
78typedef enum rtems_debugger_target_exc_action
79{
80  rtems_debugger_target_exc_consumed, /*<< The exception has been consumed. */
81  rtems_debugger_target_exc_cascade,  /*<< Cascade to a previous handler. */
82  rtems_debugger_target_exc_step,     /*<< Step an instruction. */
83} rtems_debugger_target_exc_action;
84
85/**
86 * Memory breakpoint. We use thumb mode BKPT which is 2 bytes.
87 */
88#define RTEMS_DEBUGGER_TARGET_SWBREAK_MAX_SIZE (4)
89typedef struct rtems_debugger_target_swbreak {
90  void*   address;
91  uint8_t contents[RTEMS_DEBUGGER_TARGET_SWBREAK_MAX_SIZE];
92} rtems_debugger_target_swbreak;
93
94/**
95 * The target data.
96 *
97 * reg_offset: Table of size_t offset of a register in the register
98 *             table. The table has one more entry than reg_num where
99 *             the last entry is the size of the register table.
100 */
101typedef struct rtems_debugger_target {
102  int                  capabilities;     /*<< The capabilities to report. */
103  size_t               reg_num;          /*<< The number of registers. */
104  const size_t*        reg_offset;       /*<< The reg offsettable, len = reg_num + 1. */
105  const uint8_t*       breakpoint;       /*<< The breakpoint instruction(s). */
106  size_t               breakpoint_size;  /*<< The breakpoint size. */
107  rtems_debugger_block swbreaks;         /*<< The software breakpoint block. */
108  bool                 memory_access;    /*<< Accessing target memory. */
109  jmp_buf              access_return;    /*<< Return from an access fault. */
110} rtems_debugger_target;
111
112/**
113 * Create the target.
114 */
115extern int rtems_debugger_target_create(void);
116
117/**
118 * Destroy the target.
119 */
120extern int rtems_debugger_target_destroy(void);
121
122/**
123 * Configure the target. This is architecture specific.
124 */
125extern int rtems_debugger_target_configure(rtems_debugger_target* target);
126
127/**
128 * Enable the target.
129 */
130extern int rtems_debugger_target_enable(void);
131
132/**
133 * Disable the target.
134 */
135extern int rtems_debugger_target_disable(void);
136
137/**
138 * Return the capabilities mask for the target.
139 */
140extern uint32_t rtems_debugger_target_capabilities(void);
141
142/**
143 * Return the number of regisers.
144 */
145extern size_t rtems_debugger_target_reg_num(void);
146
147/**
148 * Return the offset of a register in the register table.
149 */
150extern size_t rtems_debugger_target_reg_size(size_t reg);
151
152/**
153 * Return the offset of a register in the register table.
154 */
155extern size_t rtems_debugger_target_reg_offset(size_t reg);
156
157/**
158 * Return the size of register table.
159 */
160extern size_t rtems_debugger_target_reg_table_size(void);
161
162/**
163 * Read the regosters.
164 */
165extern int rtems_debugger_target_read_regs(rtems_debugger_thread* thread);
166
167/**
168 * Write the regosters.
169 */
170extern int rtems_debugger_target_write_regs(rtems_debugger_thread* thread);
171
172/**
173 * Return the thread's program counter (PC).
174 */
175extern uintptr_t rtems_debugger_target_reg_pc(rtems_debugger_thread* thread);
176
177/**
178 * Return the frame's program counter (PC).
179 */
180extern uintptr_t rtems_debugger_target_frame_pc(CPU_Exception_frame* frame);
181
182/**
183 * Return the thread's stack pointer (SP).
184 */
185extern uintptr_t rtems_debugger_target_reg_sp(rtems_debugger_thread* thread);
186
187/**
188 * Return the thread's TCB stack pointer (SP).
189 */
190extern uintptr_t rtems_debugger_target_tcb_sp(rtems_debugger_thread* thread);
191
192/**
193 * The thread is stepping. Setup the thread to step an instruction.
194 */
195extern int rtems_debugger_target_thread_stepping(rtems_debugger_thread* thread);
196
197/**
198 * Return the signal for the exception.
199 */
200extern int rtems_debugger_target_exception_to_signal(CPU_Exception_frame* frame);
201
202/**
203 * Print the target exception registers.
204 */
205extern void rtems_debugger_target_exception_print(CPU_Exception_frame* frame);
206
207/**
208 * Software breakpoints. These are also referred to as memory breakpoints.
209 */
210extern int rtems_debugger_target_swbreak_control(bool    insert,
211                                                 uintptr_t addr,
212                                                 DB_UINT kind);
213
214/**
215 * Insert software breakpoints into the memory.
216 */
217extern int rtems_debugger_target_swbreak_insert(void);
218
219/**
220 * Remove software breakpoints from the memory.
221 */
222extern int rtems_debugger_target_swbreak_remove(void);
223
224/**
225 * Insert hardware breakpoints into the hardware.
226 */
227extern int rtems_debugger_target_hwbreak_insert(void);
228
229/**
230 * Remove hardware breakpoints from the hardware.
231 */
232extern int rtems_debugger_target_hwbreak_remove(void);
233
234/**
235 * Hardware breakpoints.
236 */
237extern int rtems_debugger_target_hwbreak_control(rtems_debugger_target_watchpoint type,
238                                                 bool                             insert,
239                                                 uintptr_t                        addr,
240                                                 DB_UINT                          kind);
241
242/**
243 * Target exception processor.
244 */
245extern rtems_debugger_target_exc_action
246rtems_debugger_target_exception(CPU_Exception_frame* frame);
247
248/**
249 * See if the thread is an exception thread.
250 */
251extern void rtems_debugger_target_exception_thread(rtems_debugger_thread* thread);
252
253/**
254 * If the thread is an exception thread, resume it.
255 */
256extern void rtems_debugger_target_exception_thread_resume(rtems_debugger_thread* thread);
257
258/**
259 * Target instruction cache sync. This depends on the target but it normally
260 * means a data cache flush and an instruction cache invalidate.
261 */
262extern int rtems_debugger_target_cache_sync(rtems_debugger_target_swbreak* swbreak);
263
264/**
265 * Start a target memory access. If 0 is return the access can proceed and if
266 * -1 is return the access has failed.
267 */
268extern int rtems_debugger_target_start_memory_access(void);
269
270/**
271 * End a target memory access.
272 */
273extern void rtems_debugger_target_end_memory_access(void);
274
275/**
276 * Is this a target memory access?
277 */
278extern bool rtems_debugger_target_is_memory_access(void);
279
280#ifdef __cplusplus
281}
282#endif /* __cplusplus */
283
284
285#endif
Note: See TracBrowser for help on using the repository browser.