Line data Source code
1 1 : /*
2 : * Copyright Meta Platforms, Inc. and its affiliates.
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Public APIs for coredump pseudo-device driver
10 : */
11 :
12 : #ifndef INCLUDE_ZEPHYR_DRIVERS_COREDUMP_H_
13 : #define INCLUDE_ZEPHYR_DRIVERS_COREDUMP_H_
14 :
15 : #include <zephyr/device.h>
16 : #include <zephyr/sys/slist.h>
17 :
18 : #ifdef __cplusplus
19 : extern "C" {
20 : #endif
21 :
22 : /**
23 : * @brief Coredump pseudo-device driver APIs
24 : * @defgroup coredump_device_interface Coredump pseudo-device driver APIs
25 : * @ingroup io_interfaces
26 : * @{
27 : */
28 :
29 : /**
30 : * @brief Structure describing a region in memory that may be
31 : * stored in core dump at the time it is generated
32 : *
33 : * Instances of this are passed to the coredump_device_register_memory() and
34 : * coredump_device_unregister_memory() functions to indicate addition and removal
35 : * of memory regions to be captured
36 : */
37 1 : struct coredump_mem_region_node {
38 : /** Node of single-linked list, do not modify */
39 1 : sys_snode_t node;
40 :
41 : /** Address of start of memory region */
42 1 : uintptr_t start;
43 :
44 : /** Size of memory region */
45 1 : size_t size;
46 : };
47 :
48 : /**
49 : * @brief Callback that occurs at dump time, data copied into dump_area will
50 : * be included in the dump that is generated
51 : *
52 : * @param dump_area Pointer to area to copy data into for inclusion in dump
53 : * @param dump_area_size Size of available memory at dump_area
54 : */
55 1 : typedef void (*coredump_dump_callback_t)(uintptr_t dump_area, size_t dump_area_size);
56 :
57 : /**
58 : * @cond INTERNAL_HIDDEN
59 : *
60 : * For internal use only, skip these in public documentation.
61 : */
62 :
63 : /*
64 : * Type definition of coredump API function for adding specified
65 : * data into coredump
66 : */
67 : typedef void (*coredump_device_dump_t)(const struct device *dev);
68 :
69 : /*
70 : * Type definition of coredump API function for registering a memory
71 : * region
72 : */
73 : typedef bool (*coredump_device_register_memory_t)(const struct device *dev,
74 : struct coredump_mem_region_node *region);
75 :
76 : /*
77 : * Type definition of coredump API function for unregistering a memory
78 : * region
79 : */
80 : typedef bool (*coredump_device_unregister_memory_t)(const struct device *dev,
81 : struct coredump_mem_region_node *region);
82 :
83 : /*
84 : * Type definition of coredump API function for registering a dump
85 : * callback
86 : */
87 : typedef bool (*coredump_device_register_callback_t)(const struct device *dev,
88 : coredump_dump_callback_t callback);
89 :
90 : /*
91 : * API which a coredump pseudo-device driver should expose
92 : */
93 : __subsystem struct coredump_driver_api {
94 : coredump_device_dump_t dump;
95 : coredump_device_register_memory_t register_memory;
96 : coredump_device_unregister_memory_t unregister_memory;
97 : coredump_device_register_callback_t register_callback;
98 : };
99 :
100 : /**
101 : * @endcond
102 : */
103 :
104 : /**
105 : * @brief Register a region of memory to be stored in core dump at the
106 : * time it is generated
107 : *
108 : * @param dev Pointer to the device structure for the driver instance.
109 : * @param region Struct describing memory to be collected
110 : *
111 : * @return true if registration succeeded
112 : * @return false if registration failed
113 : */
114 1 : static inline bool coredump_device_register_memory(const struct device *dev,
115 : struct coredump_mem_region_node *region)
116 : {
117 : const struct coredump_driver_api *api =
118 : (const struct coredump_driver_api *)dev->api;
119 :
120 : return api->register_memory(dev, region);
121 : }
122 :
123 : /**
124 : * @brief Unregister a region of memory to be stored in core dump at the
125 : * time it is generated
126 : *
127 : * @param dev Pointer to the device structure for the driver instance.
128 : * @param region Struct describing memory to be collected
129 : *
130 : * @return true if unregistration succeeded
131 : * @return false if unregistration failed
132 : */
133 1 : static inline bool coredump_device_unregister_memory(const struct device *dev,
134 : struct coredump_mem_region_node *region)
135 : {
136 : const struct coredump_driver_api *api =
137 : (const struct coredump_driver_api *)dev->api;
138 :
139 : return api->unregister_memory(dev, region);
140 : }
141 :
142 : /**
143 : * @brief Register a callback to be invoked at dump time
144 : *
145 : * @param dev Pointer to the device structure for the driver instance.
146 : * @param callback Callback to be invoked at dump time
147 : *
148 : * @return true if registration succeeded
149 : * @return false if registration failed
150 : */
151 1 : static inline bool coredump_device_register_callback(const struct device *dev,
152 : coredump_dump_callback_t callback)
153 : {
154 : const struct coredump_driver_api *api =
155 : (const struct coredump_driver_api *)dev->api;
156 :
157 : return api->register_callback(dev, callback);
158 : }
159 :
160 : /**
161 : * @}
162 : */
163 :
164 : #ifdef __cplusplus
165 : }
166 : #endif
167 :
168 : #endif /* INCLUDE_ZEPHYR_DRIVERS_COREDUMP_H_ */
|