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