Line data Source code
1 1 : /*
2 : * Copyright (c) 2023 Yonatan Schachter
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : /**
8 : * @file
9 : * @brief Header file for binary descriptors
10 : * @ingroup bindesc
11 : */
12 :
13 : #ifndef ZEPHYR_INCLUDE_ZEPHYR_BINDESC_H_
14 : #define ZEPHYR_INCLUDE_ZEPHYR_BINDESC_H_
15 :
16 : /**
17 : * @defgroup bindesc Binary Descriptors
18 : * @ingroup os_services
19 : * @{
20 : */
21 :
22 : #include <zephyr/sys/util_macro.h>
23 :
24 : #ifdef __cplusplus
25 : extern "C" {
26 : #endif /* __cplusplus */
27 :
28 : /*
29 : * Corresponds to the definitions in scripts/west_commands/bindesc.py.
30 : * Do not change without syncing the definitions in both files!
31 : */
32 :
33 : /** Magic number used to identify binary descriptor sections in firmware images */
34 1 : #define BINDESC_MAGIC 0xb9863e5a7ea46046
35 : /** Required memory alignment for binary descriptor entries */
36 1 : #define BINDESC_ALIGNMENT 4
37 :
38 : /** @name Binary Descriptor Types */
39 : /** @{ */
40 1 : #define BINDESC_TYPE_UINT 0x0 /**< Unsigned integer data */
41 1 : #define BINDESC_TYPE_STR 0x1 /**< String data */
42 1 : #define BINDESC_TYPE_BYTES 0x2 /**< Byte array data */
43 1 : #define BINDESC_TYPE_DESCRIPTORS_END 0xf /**< Marks the end of binary descriptor section */
44 : /** @} */
45 :
46 : /** Size of the header of a binary descriptor entry */
47 : /* Needed as sizeof ignores the data as it's a flexible array */
48 1 : #define BINDESC_ENTRY_HEADER_SIZE (sizeof(struct bindesc_entry))
49 :
50 : /**
51 : * @brief Macros for defining binary descriptors in firmware images
52 : * @defgroup bindesc_define Binary Descriptor Definition
53 : * @ingroup bindesc
54 : * @{
55 : */
56 :
57 : /*
58 : * Corresponds to the definitions in scripts/west_commands/bindesc.py.
59 : * Do not change without syncing the definitions in both files!
60 : */
61 :
62 : /** The app version string such as "1.2.3" */
63 1 : #define BINDESC_ID_APP_VERSION_STRING 0x800
64 :
65 : /** The app version major such as 1 */
66 1 : #define BINDESC_ID_APP_VERSION_MAJOR 0x801
67 :
68 : /** The app version minor such as 2 */
69 1 : #define BINDESC_ID_APP_VERSION_MINOR 0x802
70 :
71 : /** The app version patchlevel such as 3 */
72 1 : #define BINDESC_ID_APP_VERSION_PATCHLEVEL 0x803
73 :
74 : /** The app version number such as 0x10203 */
75 1 : #define BINDESC_ID_APP_VERSION_NUMBER 0x804
76 :
77 : /** The app git reference such as "v3.3.0-18-g2c85d9224fca" */
78 1 : #define BINDESC_ID_APP_BUILD_VERSION 0x805
79 :
80 : /** The kernel version string such as "3.4.0" */
81 1 : #define BINDESC_ID_KERNEL_VERSION_STRING 0x900
82 :
83 : /** The kernel version major such as 3 */
84 1 : #define BINDESC_ID_KERNEL_VERSION_MAJOR 0x901
85 :
86 : /** The kernel version minor such as 4 */
87 1 : #define BINDESC_ID_KERNEL_VERSION_MINOR 0x902
88 :
89 : /** The kernel version patchlevel such as 0 */
90 1 : #define BINDESC_ID_KERNEL_VERSION_PATCHLEVEL 0x903
91 :
92 : /** The kernel version number such as 0x30400 */
93 1 : #define BINDESC_ID_KERNEL_VERSION_NUMBER 0x904
94 :
95 : /** The kernel git reference such as "v3.3.0-18-g2c85d9224fca" */
96 1 : #define BINDESC_ID_KERNEL_BUILD_VERSION 0x905
97 :
98 : /** The year the image was compiled in */
99 1 : #define BINDESC_ID_BUILD_TIME_YEAR 0xa00
100 :
101 : /** The month of the year the image was compiled in */
102 1 : #define BINDESC_ID_BUILD_TIME_MONTH 0xa01
103 :
104 : /** The day of the month the image was compiled in */
105 1 : #define BINDESC_ID_BUILD_TIME_DAY 0xa02
106 :
107 : /** The hour of the day the image was compiled in */
108 1 : #define BINDESC_ID_BUILD_TIME_HOUR 0xa03
109 :
110 : /** The minute the image was compiled in */
111 1 : #define BINDESC_ID_BUILD_TIME_MINUTE 0xa04
112 :
113 : /** The second the image was compiled in */
114 1 : #define BINDESC_ID_BUILD_TIME_SECOND 0xa05
115 :
116 : /** The UNIX time (seconds since midnight of 1970/01/01) the image was compiled in */
117 1 : #define BINDESC_ID_BUILD_TIME_UNIX 0xa06
118 :
119 : /** The date and time of compilation such as "2023/02/05 00:07:04" */
120 1 : #define BINDESC_ID_BUILD_DATE_TIME_STRING 0xa07
121 :
122 : /** The date of compilation such as "2023/02/05" */
123 1 : #define BINDESC_ID_BUILD_DATE_STRING 0xa08
124 :
125 : /** The time of compilation such as "00:07:04" */
126 1 : #define BINDESC_ID_BUILD_TIME_STRING 0xa09
127 :
128 : /** The name of the host that compiled the image */
129 1 : #define BINDESC_ID_HOST_NAME 0xb00
130 :
131 : /** The C compiler name */
132 1 : #define BINDESC_ID_C_COMPILER_NAME 0xb01
133 :
134 : /** The C compiler version */
135 1 : #define BINDESC_ID_C_COMPILER_VERSION 0xb02
136 :
137 : /** The C++ compiler name */
138 1 : #define BINDESC_ID_CXX_COMPILER_NAME 0xb03
139 :
140 : /** The C++ compiler version */
141 1 : #define BINDESC_ID_CXX_COMPILER_VERSION 0xb04
142 :
143 : /** The end of binary descriptor section */
144 1 : #define BINDESC_TAG_DESCRIPTORS_END BINDESC_TAG(DESCRIPTORS_END, 0x0fff)
145 :
146 : /**
147 : * @cond INTERNAL_HIDDEN
148 : */
149 :
150 : /*
151 : * Utility macro to generate a tag from a type and an ID
152 : *
153 : * type - Type of the descriptor, UINT, STR or BYTES
154 : * id - Unique ID for the descriptor, must fit in 12 bits
155 : */
156 : #define BINDESC_TAG(type, id) ((BINDESC_TYPE_##type & 0xf) << 12 | (id & 0x0fff))
157 :
158 : /**
159 : * @brief Utility macro to get the type of a bindesc tag
160 : *
161 : * @param tag Tag to get the type of
162 : */
163 : #define BINDESC_GET_TAG_TYPE(tag) ((tag >> 12) & 0xf)
164 :
165 : /**
166 : * @endcond
167 : */
168 :
169 : #if !defined(_LINKER) || defined(__DOXYGEN__)
170 :
171 : #include <zephyr/sys/byteorder.h>
172 : #include <zephyr/device.h>
173 :
174 : /**
175 : * @cond INTERNAL_HIDDEN
176 : */
177 :
178 : /*
179 : * Utility macro to get the name of a bindesc entry
180 : */
181 : #define BINDESC_NAME(name) bindesc_entry_##name
182 :
183 : /* Convenience helper for declaring a binary descriptor entry. */
184 : #define __BINDESC_ENTRY_DEFINE(name) \
185 : __aligned(BINDESC_ALIGNMENT) const struct bindesc_entry BINDESC_NAME(name) \
186 : __in_section(_bindesc_entry, static, name) __used __noasan
187 :
188 : /**
189 : * @endcond
190 : */
191 :
192 : /**
193 : * @brief Define a binary descriptor of type string.
194 : *
195 : * @details
196 : * Define a string that is registered in the binary descriptor header.
197 : * The defined string can be accessed using @ref BINDESC_GET_STR
198 : *
199 : * @note The defined string is not static, so its name must not collide with
200 : * any other symbol in the executable.
201 : *
202 : * @param name Name of the descriptor
203 : * @param id Unique ID of the descriptor
204 : * @param value A string value for the descriptor
205 : */
206 1 : #define BINDESC_STR_DEFINE(name, id, value) \
207 : __BINDESC_ENTRY_DEFINE(name) = { \
208 : .tag = BINDESC_TAG(STR, id), \
209 : .len = (uint16_t)sizeof(value), \
210 : .data = value, \
211 : }; \
212 : BUILD_ASSERT(sizeof(value) <= CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE, \
213 : "Bindesc " STRINGIFY(name) " exceeded maximum size, consider reducing the" \
214 : " size or changing CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE. ")
215 :
216 : /**
217 : * @brief Define a binary descriptor of type uint.
218 : *
219 : * @details
220 : * Define an integer that is registered in the binary descriptor header.
221 : * The defined integer can be accessed using @ref BINDESC_GET_UINT
222 : *
223 : * @note The defined integer is not static, so its name must not collide with
224 : * any other symbol in the executable.
225 : *
226 : * @param name Name of the descriptor
227 : * @param id Unique ID of the descriptor
228 : * @param value An integer value for the descriptor
229 : */
230 1 : #define BINDESC_UINT_DEFINE(name, id, value) \
231 : __BINDESC_ENTRY_DEFINE(name) = { \
232 : .tag = BINDESC_TAG(UINT, id), \
233 : .len = (uint16_t)sizeof(uint32_t), \
234 : .data = sys_uint32_to_array(value), \
235 : }
236 :
237 : /**
238 : * @brief Define a binary descriptor of type bytes.
239 : *
240 : * @details
241 : * Define a uint8_t array that is registered in the binary descriptor header.
242 : * The defined array can be accessed using @ref BINDESC_GET_BYTES.
243 : * The value should be given as an array literal, wrapped in parentheses, for
244 : * example:
245 : *
246 : * BINDESC_BYTES_DEFINE(name, id, ({1, 2, 3, 4}));
247 : *
248 : * @note The defined array is not static, so its name must not collide with
249 : * any other symbol in the executable.
250 : *
251 : * @param name Name of the descriptor
252 : * @param id Unique ID of the descriptor
253 : * @param value A uint8_t array as data for the descriptor
254 : */
255 1 : #define BINDESC_BYTES_DEFINE(name, id, value) \
256 : __BINDESC_ENTRY_DEFINE(name) = { \
257 : .tag = BINDESC_TAG(BYTES, id), \
258 : .len = (uint16_t)sizeof((uint8_t [])__DEBRACKET value), \
259 : .data = __DEBRACKET value, \
260 : }; \
261 : BUILD_ASSERT(sizeof((uint8_t [])__DEBRACKET value) <= \
262 : CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE, \
263 : "Bindesc " STRINGIFY(name) " exceeded maximum size, consider reducing the" \
264 : " size or changing CONFIG_BINDESC_DEFINE_MAX_DATA_SIZE. ")
265 :
266 : /**
267 : * @brief Get the value of a string binary descriptor
268 : *
269 : * @details
270 : * Get the value of a string binary descriptor, previously defined by
271 : * BINDESC_STR_DEFINE.
272 : *
273 : * @param name Name of the descriptor
274 : */
275 1 : #define BINDESC_GET_STR(name) BINDESC_NAME(name).data
276 :
277 : /**
278 : * @brief Get the value of a uint binary descriptor
279 : *
280 : * @details
281 : * Get the value of a uint binary descriptor, previously defined by
282 : * BINDESC_UINT_DEFINE.
283 : *
284 : * @param name Name of the descriptor
285 : */
286 1 : #define BINDESC_GET_UINT(name) *(uint32_t *)&(BINDESC_NAME(name).data)
287 :
288 : /**
289 : * @brief Get the value of a bytes binary descriptor
290 : *
291 : * @details
292 : * Get the value of a string binary descriptor, previously defined by
293 : * BINDESC_BYTES_DEFINE. The returned value can be accessed as an array:
294 : *
295 : * for (size_t i = 0; i < BINDESC_GET_SIZE(name); i++)
296 : * BINDESC_GET_BYTES(name)[i];
297 : *
298 : * @param name Name of the descriptor
299 : */
300 1 : #define BINDESC_GET_BYTES(name) BINDESC_NAME(name).data
301 :
302 : /**
303 : * @brief Get the size of a binary descriptor
304 : *
305 : * @details
306 : * Get the size of a binary descriptor. This is particularly useful for
307 : * bytes binary descriptors where there's no null terminator.
308 : *
309 : * @param name Name of the descriptor
310 : */
311 1 : #define BINDESC_GET_SIZE(name) BINDESC_NAME(name).len
312 :
313 : /**
314 : * @}
315 : */
316 :
317 : /**
318 : * @brief Functions for reading binary descriptors from firmware images
319 : * @defgroup bindesc_read Binary Descriptor Reading
320 : * @ingroup bindesc
321 : * @{
322 : */
323 :
324 : /**
325 : * @brief Structure for a binary descriptor entry
326 : */
327 1 : struct bindesc_entry {
328 : /** Tag of the entry */
329 1 : uint16_t tag;
330 : /** Length of the descriptor data */
331 1 : uint16_t len;
332 : /** Value of the entry. This is either an integer or a string */
333 1 : uint8_t data[];
334 : } __packed;
335 :
336 : /** @cond INTERNAL_HIDDEN */
337 : /*
338 : * We're assuming that `struct bindesc_entry` has a specific layout in
339 : * memory, so it's worth making sure that the layout is really what we
340 : * think it is. If these assertions fail for your toolchain/platform,
341 : * please open a bug report.
342 : */
343 : BUILD_ASSERT(offsetof(struct bindesc_entry, tag) == 0, "Incorrect memory layout");
344 : BUILD_ASSERT(offsetof(struct bindesc_entry, len) == 2, "Incorrect memory layout");
345 : BUILD_ASSERT(offsetof(struct bindesc_entry, data) == 4, "Incorrect memory layout");
346 : /** @endcond */
347 :
348 : /**
349 : * @brief Handle for reading binary descriptors from firmware images
350 : */
351 1 : struct bindesc_handle {
352 : /** @cond INTERNAL_HIDDEN */
353 : const uint8_t *address;
354 : enum {
355 : BINDESC_HANDLE_TYPE_RAM,
356 : BINDESC_HANDLE_TYPE_MEMORY_MAPPED_FLASH,
357 : BINDESC_HANDLE_TYPE_FLASH,
358 : } type;
359 : size_t size_limit;
360 : #if IS_ENABLED(CONFIG_BINDESC_READ_FLASH)
361 : const struct device *flash_device;
362 : uint8_t buffer[sizeof(struct bindesc_entry) +
363 : CONFIG_BINDESC_READ_FLASH_MAX_DATA_SIZE] __aligned(BINDESC_ALIGNMENT);
364 : #endif /* IS_ENABLED(CONFIG_BINDESC_READ_FLASH) */
365 : /** @endcond */
366 : };
367 :
368 : /**
369 : * @brief Callback type to be called on descriptors found during a walk
370 : *
371 : * @param entry Current descriptor
372 : * @param user_data The user_data given to @ref bindesc_foreach
373 : *
374 : * @return Any non zero value will halt the walk
375 : */
376 1 : typedef int (*bindesc_callback_t)(const struct bindesc_entry *entry, void *user_data);
377 :
378 : /**
379 : * @brief Open an image's binary descriptors for reading, from a memory mapped flash
380 : *
381 : * @details
382 : * Initializes a bindesc handle for subsequent calls to bindesc API.
383 : * Memory mapped flash is any flash that can be directly accessed by the CPU,
384 : * without needing to use the flash API for copying the data to RAM.
385 : *
386 : * @param[out] handle Bindesc handle to be given to subsequent calls
387 : * @param offset The offset from the beginning of the flash that the bindesc magic can be found at
388 : *
389 : * @retval 0 On success
390 : * @retval -ENOENT If no bindesc magic was found at the given offset
391 : */
392 1 : int bindesc_open_memory_mapped_flash(struct bindesc_handle *handle, size_t offset);
393 :
394 : /**
395 : * @brief Open an image's binary descriptors for reading, from RAM
396 : *
397 : * @details
398 : * Initializes a bindesc handle for subsequent calls to bindesc API.
399 : * It's assumed that the whole bindesc context was copied to RAM prior to calling
400 : * this function, either by the user or by a bootloader.
401 : *
402 : * @note The given address must be aligned to @ref BINDESC_ALIGNMENT
403 : *
404 : * @param[out] handle Bindesc handle to be given to subsequent calls
405 : * @param address The address that the bindesc magic can be found at
406 : * @param max_size Maximum size of the given buffer
407 : *
408 : * @retval 0 On success
409 : * @retval -ENOENT If no bindesc magic was found at the given address
410 : * @retval -EINVAL If the given address is not aligned
411 : */
412 1 : int bindesc_open_ram(struct bindesc_handle *handle, const uint8_t *address, size_t max_size);
413 :
414 : /**
415 : * @brief Open an image's binary descriptors for reading, from flash
416 : *
417 : * @details
418 : * Initializes a bindesc handle for subsequent calls to bindesc API.
419 : * As opposed to reading bindesc from RAM or memory mapped flash, this
420 : * backend requires reading the data from flash to an internal buffer
421 : * using the flash API
422 : *
423 : * @param[out] handle Bindesc handle to be given to subsequent calls
424 : * @param offset The offset from the beginning of the flash that the bindesc magic can be found at
425 : * @param flash_device Flash device to read descriptors from
426 : *
427 : * @kconfig_dep{CONFIG_BINDESC_READ_FLASH}
428 : *
429 : * @retval 0 On success
430 : * @retval -ENOENT If no bindesc magic was found at the given offset
431 : */
432 1 : int bindesc_open_flash(struct bindesc_handle *handle, size_t offset,
433 : const struct device *flash_device);
434 :
435 : /**
436 : * @brief Walk the binary descriptors and run a user defined callback on each of them
437 : *
438 : * @note
439 : * If the callback returns a non zero value, the walk stops.
440 : *
441 : * @param handle An initialized bindesc handle
442 : * @param callback A user defined callback to be called on each descriptor
443 : * @param user_data User defined data to be given to the callback
444 : *
445 : * @return If the walk was finished prematurely by the callback,
446 : * return the callback's retval, zero otherwise
447 : */
448 1 : int bindesc_foreach(struct bindesc_handle *handle, bindesc_callback_t callback, void *user_data);
449 :
450 : /**
451 : * @brief Find a specific descriptor of type string
452 : *
453 : * @warning
454 : * When using the flash backend, result will be invalidated by the next call to any bindesc API.
455 : * Use the value immediately or copy it elsewhere.
456 : *
457 : * @param handle An initialized bindesc handle
458 : * @param id ID to search for
459 : * @param result Pointer to the found string
460 : *
461 : * @retval 0 If the descriptor was found
462 : * @retval -ENOENT If the descriptor was not found
463 : */
464 1 : int bindesc_find_str(struct bindesc_handle *handle, uint16_t id, const char **result);
465 :
466 : /**
467 : * @brief Find a specific descriptor of type uint
468 : *
469 : * @warning
470 : * When using the flash backend, result will be invalidated by the next call to any bindesc API.
471 : * Use the value immediately or copy it elsewhere.
472 : *
473 : * @param handle An initialized bindesc handle
474 : * @param id ID to search for
475 : * @param result Pointer to the found uint
476 : *
477 : * @retval 0 If the descriptor was found
478 : * @retval -ENOENT If the descriptor was not found
479 : */
480 1 : int bindesc_find_uint(struct bindesc_handle *handle, uint16_t id, const uint32_t **result);
481 :
482 : /**
483 : * @brief Find a specific descriptor of type bytes
484 : *
485 : * @warning
486 : * When using the flash backend, result will be invalidated by the next call to any bindesc API.
487 : * Use the value immediately or copy it elsewhere.
488 : *
489 : * @param handle An initialized bindesc handle
490 : * @param id ID to search for
491 : * @param result Pointer to the found bytes
492 : * @param result_size Size of the found bytes
493 : *
494 : * @retval 0 If the descriptor was found
495 : * @retval -ENOENT If the descriptor was not found
496 : */
497 1 : int bindesc_find_bytes(struct bindesc_handle *handle, uint16_t id, const uint8_t **result,
498 : size_t *result_size);
499 :
500 : /**
501 : * @brief Get the size of an image's binary descriptors
502 : *
503 : * @details
504 : * Walks the binary descriptor structure to caluculate the total size of the structure
505 : * in bytes. This is useful, for instance, if the whole structure is to be copied to RAM.
506 : *
507 : * @param handle An initialized bindesc handle
508 : * @param result Pointer to write result to
509 : *
510 : * @return 0 On success, negative errno otherwise
511 : */
512 1 : int bindesc_get_size(struct bindesc_handle *handle, size_t *result);
513 :
514 : /**
515 : * @}
516 : */
517 :
518 : #if defined(CONFIG_BINDESC_KERNEL_VERSION_STRING)
519 : extern const struct bindesc_entry BINDESC_NAME(kernel_version_string);
520 : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_STRING) */
521 :
522 : #if defined(CONFIG_BINDESC_KERNEL_VERSION_MAJOR)
523 : extern const struct bindesc_entry BINDESC_NAME(kernel_version_major);
524 : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_MAJOR) */
525 :
526 : #if defined(CONFIG_BINDESC_KERNEL_VERSION_MINOR)
527 : extern const struct bindesc_entry BINDESC_NAME(kernel_version_minor);
528 : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_MINOR) */
529 :
530 : #if defined(CONFIG_BINDESC_KERNEL_VERSION_PATCHLEVEL)
531 : extern const struct bindesc_entry BINDESC_NAME(kernel_version_patchlevel);
532 : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_PATCHLEVEL) */
533 :
534 : #if defined(CONFIG_BINDESC_KERNEL_VERSION_NUMBER)
535 : extern const struct bindesc_entry BINDESC_NAME(kernel_version_number);
536 : #endif /* defined(CONFIG_BINDESC_KERNEL_VERSION_NUMBER) */
537 :
538 : #if defined(CONFIG_BINDESC_KERNEL_BUILD_VERSION)
539 : extern const struct bindesc_entry BINDESC_NAME(kernel_build_version);
540 : #endif /* defined(CONFIG_BINDESC_KERNEL_BUILD_VERSION) */
541 :
542 : #if defined(CONFIG_BINDESC_APP_VERSION_STRING)
543 : extern const struct bindesc_entry BINDESC_NAME(app_version_string);
544 : #endif /* defined(CONFIG_BINDESC_APP_VERSION_STRING) */
545 :
546 : #if defined(CONFIG_BINDESC_APP_VERSION_MAJOR)
547 : extern const struct bindesc_entry BINDESC_NAME(app_version_major);
548 : #endif /* defined(CONFIG_BINDESC_APP_VERSION_MAJOR) */
549 :
550 : #if defined(CONFIG_BINDESC_APP_VERSION_MINOR)
551 : extern const struct bindesc_entry BINDESC_NAME(app_version_minor);
552 : #endif /* defined(CONFIG_BINDESC_APP_VERSION_MINOR) */
553 :
554 : #if defined(CONFIG_BINDESC_APP_VERSION_PATCHLEVEL)
555 : extern const struct bindesc_entry BINDESC_NAME(app_version_patchlevel);
556 : #endif /* defined(CONFIG_BINDESC_APP_VERSION_PATCHLEVEL) */
557 :
558 : #if defined(CONFIG_BINDESC_APP_VERSION_NUMBER)
559 : extern const struct bindesc_entry BINDESC_NAME(app_version_number);
560 : #endif /* defined(CONFIG_BINDESC_APP_VERSION_NUMBER) */
561 :
562 : #if defined(CONFIG_BINDESC_APP_BUILD_VERSION)
563 : extern const struct bindesc_entry BINDESC_NAME(app_build_version);
564 : #endif /* defined(CONFIG_BINDESC_APP_BUILD_VERSION) */
565 :
566 : #if defined(CONFIG_BINDESC_BUILD_TIME_YEAR)
567 : extern const struct bindesc_entry BINDESC_NAME(build_time_year);
568 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_YEAR) */
569 :
570 : #if defined(CONFIG_BINDESC_BUILD_TIME_MONTH)
571 : extern const struct bindesc_entry BINDESC_NAME(build_time_month);
572 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_MONTH) */
573 :
574 : #if defined(CONFIG_BINDESC_BUILD_TIME_DAY)
575 : extern const struct bindesc_entry BINDESC_NAME(build_time_day);
576 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_DAY) */
577 :
578 : #if defined(CONFIG_BINDESC_BUILD_TIME_HOUR)
579 : extern const struct bindesc_entry BINDESC_NAME(build_time_hour);
580 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_HOUR) */
581 :
582 : #if defined(CONFIG_BINDESC_BUILD_TIME_MINUTE)
583 : extern const struct bindesc_entry BINDESC_NAME(build_time_minute);
584 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_MINUTE) */
585 :
586 : #if defined(CONFIG_BINDESC_BUILD_TIME_SECOND)
587 : extern const struct bindesc_entry BINDESC_NAME(build_time_second);
588 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_SECOND) */
589 :
590 : #if defined(CONFIG_BINDESC_BUILD_TIME_UNIX)
591 : extern const struct bindesc_entry BINDESC_NAME(build_time_unix);
592 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_UNIX) */
593 :
594 : #if defined(CONFIG_BINDESC_BUILD_DATE_TIME_STRING)
595 : extern const struct bindesc_entry BINDESC_NAME(build_date_time_string);
596 : #endif /* defined(CONFIG_BINDESC_BUILD_DATE_TIME_STRING) */
597 :
598 : #if defined(CONFIG_BINDESC_BUILD_DATE_STRING)
599 : extern const struct bindesc_entry BINDESC_NAME(build_date_string);
600 : #endif /* defined(CONFIG_BINDESC_BUILD_DATE_STRING) */
601 :
602 : #if defined(CONFIG_BINDESC_BUILD_TIME_STRING)
603 : extern const struct bindesc_entry BINDESC_NAME(build_time_string);
604 : #endif /* defined(CONFIG_BINDESC_BUILD_TIME_STRING) */
605 :
606 : #if defined(CONFIG_BINDESC_HOST_NAME)
607 : extern const struct bindesc_entry BINDESC_NAME(host_name);
608 : #endif /* defined(CONFIG_BINDESC_HOST_NAME) */
609 :
610 : #if defined(CONFIG_BINDESC_C_COMPILER_NAME)
611 : extern const struct bindesc_entry BINDESC_NAME(c_compiler_name);
612 : #endif /* defined(CONFIG_BINDESC_C_COMPILER_NAME) */
613 :
614 : #if defined(CONFIG_BINDESC_C_COMPILER_VERSION)
615 : extern const struct bindesc_entry BINDESC_NAME(c_compiler_version);
616 : #endif /* defined(CONFIG_BINDESC_C_COMPILER_VERSION) */
617 :
618 : #if defined(CONFIG_BINDESC_CXX_COMPILER_NAME)
619 : extern const struct bindesc_entry BINDESC_NAME(cxx_compiler_name);
620 : #endif /* defined(CONFIG_BINDESC_CXX_COMPILER_NAME) */
621 :
622 : #if defined(CONFIG_BINDESC_CXX_COMPILER_VERSION)
623 : extern const struct bindesc_entry BINDESC_NAME(cxx_compiler_version);
624 : #endif /* defined(CONFIG_BINDESC_CXX_COMPILER_VERSION) */
625 :
626 : #endif /* !defined(_LINKER) */
627 :
628 : #ifdef __cplusplus
629 : }
630 : #endif
631 :
632 : /**
633 : * @}
634 : */
635 :
636 : #endif /* ZEPHYR_INCLUDE_ZEPHYR_BINDESC_H_ */
|