Zephyr API Documentation 4.3.99
A Scalable Open Source RTOS
Loading...
Searching...
No Matches
coredump.h
Go to the documentation of this file.
1/*
2 * Copyright (c) 2020 Intel Corporation.
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 */
6
7#ifndef ZEPHYR_INCLUDE_DEBUG_COREDUMP_H_
8#define ZEPHYR_INCLUDE_DEBUG_COREDUMP_H_
9
10#include <stddef.h>
11#include <stdint.h>
12#include <sys/types.h>
13
14#ifdef __cplusplus
15extern "C" {
16#endif
17
18/*
19 * Define COREDUMP_*_STR as public to allow coredump_backend_other to re-use
20 * these strings if necessary
21 */
22#define COREDUMP_BEGIN_STR "BEGIN#"
23#define COREDUMP_END_STR "END#"
24#define COREDUMP_ERROR_STR "ERROR CANNOT DUMP#"
25
26/*
27 * Need to prefix coredump strings to make it easier to parse
28 * as log module adds its own prefixes.
29 */
30#define COREDUMP_PREFIX_STR "#CD:"
31
40
41
72
130
142
143#ifdef CONFIG_DEBUG_COREDUMP
144
145#include <zephyr/toolchain.h>
146#include <zephyr/arch/cpu.h>
147#include <zephyr/sys/byteorder.h>
148
149#define COREDUMP_HDR_VER 2
150
151#define COREDUMP_ARCH_HDR_ID 'A'
152
153#define THREADS_META_HDR_ID 'T'
154#define THREADS_META_HDR_VER 1
155
156#define COREDUMP_MEM_HDR_ID 'M'
157#define COREDUMP_MEM_HDR_VER 1
158
159/* Target code */
160enum coredump_tgt_code {
161 COREDUMP_TGT_UNKNOWN = 0,
162 COREDUMP_TGT_X86,
163 COREDUMP_TGT_X86_64,
164 COREDUMP_TGT_ARM_CORTEX_M,
165 COREDUMP_TGT_RISC_V,
166 COREDUMP_TGT_XTENSA,
167 COREDUMP_TGT_ARM64,
168};
169
170/* Coredump header */
171struct coredump_hdr_t {
172 /* 'Z', 'E' */
173 char id[2];
174
175 /* Header version */
176 uint16_t hdr_version;
177
178 /* Target code */
179 uint16_t tgt_code;
180
181 /* Pointer size in Log2 */
182 uint8_t ptr_size_bits;
183
184 uint8_t flag;
185
186 /* Coredump Reason given */
187 unsigned int reason;
188} __packed;
189
190/* Architecture-specific block header */
191struct coredump_arch_hdr_t {
192 /* COREDUMP_ARCH_HDR_ID */
193 char id;
194
195 /* Header version */
196 uint16_t hdr_version;
197
198 /* Number of bytes in this block (excluding header) */
199 uint16_t num_bytes;
200} __packed;
201
202/* Threads metadata header */
203struct coredump_threads_meta_hdr_t {
204 /* THREADS_META_HDR_ID */
205 char id;
206
207 /* Header version */
208 uint16_t hdr_version;
209
210 /* Number of bytes in this block (excluding header) */
211 uint16_t num_bytes;
212} __packed;
213
214/* Memory block header */
215struct coredump_mem_hdr_t {
216 /* COREDUMP_MEM_HDR_ID */
217 char id;
218
219 /* Header version */
220 uint16_t hdr_version;
221
222 /* Address of start of memory region */
223 uintptr_t start;
224
225 /* Address of end of memory region */
226 uintptr_t end;
227} __packed;
228
229typedef void (*coredump_backend_start_t)(void);
230typedef void (*coredump_backend_end_t)(void);
231typedef void (*coredump_backend_buffer_output_t)(uint8_t *buf, size_t buflen);
232typedef int (*coredump_backend_query_t)(enum coredump_query_id query_id,
233 void *arg);
234typedef int (*coredump_backend_cmd_t)(enum coredump_cmd_id cmd_id,
235 void *arg);
236
237struct coredump_backend_api {
238 /* Signal to backend of the start of coredump. */
239 coredump_backend_start_t start;
240
241 /* Signal to backend of the end of coredump. */
242 coredump_backend_end_t end;
243
244 /* Raw buffer output */
245 coredump_backend_buffer_output_t buffer_output;
246
247 /* Perform query on backend */
248 coredump_backend_query_t query;
249
250 /* Perform command on backend */
251 coredump_backend_cmd_t cmd;
252};
253
254void coredump(unsigned int reason, const struct arch_esf *esf,
255 struct k_thread *thread);
256void coredump_memory_dump(uintptr_t start_addr, uintptr_t end_addr);
257void coredump_buffer_output(uint8_t *buf, size_t buflen);
258
259int coredump_query(enum coredump_query_id query_id, void *arg);
260int coredump_cmd(enum coredump_cmd_id cmd_id, void *arg);
261
262#else
263
264static inline void coredump(unsigned int reason, const struct arch_esf *esf,
265 struct k_thread *thread)
266{
267 ARG_UNUSED(reason);
268 ARG_UNUSED(esf);
269 ARG_UNUSED(thread);
270}
271
272static inline void coredump_memory_dump(uintptr_t start_addr, uintptr_t end_addr)
273{
274 ARG_UNUSED(start_addr);
275 ARG_UNUSED(end_addr);
276}
277
278static inline void coredump_buffer_output(uint8_t *buf, size_t buflen)
279{
280 ARG_UNUSED(buf);
281 ARG_UNUSED(buflen);
282}
283
284static inline int coredump_query(enum coredump_query_id query_id, void *arg)
285{
286 ARG_UNUSED(query_id);
287 ARG_UNUSED(arg);
288 return -ENOTSUP;
289}
290
291static inline int coredump_cmd(enum coredump_cmd_id query_id, void *arg)
292{
293 ARG_UNUSED(query_id);
294 ARG_UNUSED(arg);
295 return -ENOTSUP;
296}
297
298#endif /* CONFIG_DEBUG_COREDUMP */
299
312
320
332
344
356
360
361#ifdef __cplusplus
362}
363#endif
364
365#endif /* ZEPHYR_INCLUDE_DEBUG_COREDUMP_H_ */
coredump_query_id
Query ID.
Definition coredump.h:43
coredump_cmd_id
Command ID.
Definition coredump.h:74
static int coredump_cmd(enum coredump_cmd_id query_id, void *arg)
Perform command on coredump subsystem.
Definition coredump.h:291
static int coredump_query(enum coredump_query_id query_id, void *arg)
Perform query on coredump subsystem.
Definition coredump.h:284
static void coredump_memory_dump(uintptr_t start_addr, uintptr_t end_addr)
Dump memory region.
Definition coredump.h:272
static void coredump(unsigned int reason, const struct arch_esf *esf, struct k_thread *thread)
Perform coredump.
Definition coredump.h:264
static void coredump_buffer_output(uint8_t *buf, size_t buflen)
Output the buffer via coredump.
Definition coredump.h:278
@ COREDUMP_QUERY_HAS_STORED_DUMP
Check if there is a stored coredump from backend.
Definition coredump.h:57
@ COREDUMP_QUERY_GET_STORED_DUMP_SIZE
Returns:
Definition coredump.h:65
@ COREDUMP_QUERY_MAX
Max value for query ID.
Definition coredump.h:70
@ COREDUMP_QUERY_GET_ERROR
Returns error code from backend.
Definition coredump.h:47
@ COREDUMP_CMD_COPY_STORED_DUMP
Copy the raw stored coredump.
Definition coredump.h:112
@ COREDUMP_CMD_MAX
Max value for command ID.
Definition coredump.h:128
@ COREDUMP_CMD_INVALIDATE_STORED_DUMP
Invalidate the stored coredump.
Definition coredump.h:123
@ COREDUMP_CMD_ERASE_STORED_DUMP
Erase the stored coredump.
Definition coredump.h:101
@ COREDUMP_CMD_VERIFY_STORED_DUMP
Verify that the stored coredump is valid.
Definition coredump.h:91
@ COREDUMP_CMD_CLEAR_ERROR
Clear error code from backend.
Definition coredump.h:80
static void cmd(uint32_t command)
Execute a display list command by co-processor engine.
Definition ft8xx_reference_api.h:153
#define ENOTSUP
Unsupported value.
Definition errno.h:114
__INTPTR_TYPE__ off_t
Definition types.h:36
__UINT8_TYPE__ uint8_t
Definition stdint.h:88
__UINTPTR_TYPE__ uintptr_t
Definition stdint.h:105
__UINT16_TYPE__ uint16_t
Definition stdint.h:89
Exception Stack Frame.
Definition exception.h:60
Coredump copy command (COREDUMP_CMD_COPY_STORED_DUMP) argument definition.
Definition coredump.h:132
off_t offset
Copy offset.
Definition coredump.h:134
uint8_t * buffer
Copy destination buffer.
Definition coredump.h:137
size_t length
Copy length.
Definition coredump.h:140
Thread Structure.
Definition thread.h:263
Byte order helpers.
Macros to abstract toolchain specific capabilities.