Line data Source code
1 0 : /*
2 : * Copyright (c) 2022 Intel Corporation
3 : *
4 : * SPDX-License-Identifier: Apache-2.0
5 : */
6 :
7 : #ifndef ZEPHYR_INCLUDE_LINKER_UTILS_H_
8 : #define ZEPHYR_INCLUDE_LINKER_UTILS_H_
9 :
10 : #include <stdbool.h>
11 :
12 : /**
13 : * @brief Check if address is in read only section.
14 : *
15 : * Note that this may return false if the address lies outside
16 : * the compiler's default read only sections (e.g. .rodata
17 : * section), depending on the linker script used. This also
18 : * applies to constants with explicit section attributes.
19 : *
20 : * @param addr Address.
21 : *
22 : * @return True if address identified within read only section.
23 : */
24 1 : static inline bool linker_is_in_rodata(const void *addr)
25 : {
26 : #if defined(CONFIG_LINKER_USE_PINNED_SECTION)
27 : extern char lnkr_pinned_rodata_start[];
28 : extern char lnkr_pinned_rodata_end[];
29 :
30 : if (((const char *)addr >= (const char *)lnkr_pinned_rodata_start) &&
31 : ((const char *)addr < (const char *)lnkr_pinned_rodata_end)) {
32 : return true;
33 : }
34 : #endif
35 :
36 : #if defined(CONFIG_ARM) || defined(CONFIG_ARC) || defined(CONFIG_X86) || \
37 : defined(CONFIG_ARM64) || defined(CONFIG_NIOS2) || \
38 : defined(CONFIG_RISCV) || defined(CONFIG_SPARC) || \
39 : defined(CONFIG_MIPS) || defined(CONFIG_XTENSA)
40 : extern char __rodata_region_start[];
41 : extern char __rodata_region_end[];
42 : #define RO_START __rodata_region_start
43 : #define RO_END __rodata_region_end
44 : #else
45 0 : #define RO_START 0
46 0 : #define RO_END 0
47 : #endif
48 :
49 : return (((const char *)addr >= (const char *)RO_START) &&
50 : ((const char *)addr < (const char *)RO_END));
51 :
52 : #undef RO_START
53 : #undef RO_END
54 : }
55 :
56 : #endif /* ZEPHYR_INCLUDE_LINKER_UTILS_H_ */
|