1 /* SPDX-License-Identifier: GPL-2.0 */ !! 1 #ifndef _ASM_M68K_SECTIONS_H 2 #ifndef _ASM_GENERIC_SECTIONS_H_ !! 2 #define _ASM_M68K_SECTIONS_H 3 #define _ASM_GENERIC_SECTIONS_H_ << 4 3 5 /* References to section boundaries */ !! 4 #include <asm-generic/sections.h> 6 5 7 #include <linux/compiler.h> !! 6 #endif /* _ASM_M68K_SECTIONS_H */ 8 #include <linux/types.h> << 9 << 10 /* << 11 * Usage guidelines: << 12 * _text, _data: architecture specific, don't << 13 * [_stext, _etext]: contains .text.* sections << 14 * and/or .init.* sections << 15 * [_sdata, _edata]: contains .data.* sections << 16 * and/or .init.* sections. << 17 * [__start_rodata, __end_rodata]: contains .r << 18 * [__start_ro_after_init, __end_ro_after_init << 19 * contains .data..ro_after_ << 20 * [__init_begin, __init_end]: contains .init. << 21 * may be out of this range << 22 * [_sinittext, _einittext]: contains .init.te << 23 * [__bss_start, __bss_stop]: contains BSS sec << 24 * << 25 * Following global variables are optional and << 26 * architectures and/or kernel configurations. << 27 * _text, _data << 28 * __kprobes_text_start, __kprobes_text_e << 29 * __entry_text_start, __entry_text_end << 30 * __ctors_start, __ctors_end << 31 * __irqentry_text_start, __irqentry_text << 32 * __softirqentry_text_start, __softirqen << 33 * __start_opd, __end_opd << 34 */ << 35 extern char _text[], _stext[], _etext[]; << 36 extern char _data[], _sdata[], _edata[]; << 37 extern char __bss_start[], __bss_stop[]; << 38 extern char __init_begin[], __init_end[]; << 39 extern char _sinittext[], _einittext[]; << 40 extern char __start_ro_after_init[], __end_ro_ << 41 extern char _end[]; << 42 extern char __per_cpu_load[], __per_cpu_start[ << 43 extern char __kprobes_text_start[], __kprobes_ << 44 extern char __entry_text_start[], __entry_text << 45 extern char __start_rodata[], __end_rodata[]; << 46 extern char __irqentry_text_start[], __irqentr << 47 extern char __softirqentry_text_start[], __sof << 48 extern char __start_once[], __end_once[]; << 49 << 50 /* Start and end of .ctors section - used for << 51 extern char __ctors_start[], __ctors_end[]; << 52 << 53 /* Start and end of .opd section - used for fu << 54 extern char __start_opd[], __end_opd[]; << 55 << 56 /* Start and end of instrumentation protected << 57 extern char __noinstr_text_start[], __noinstr_ << 58 << 59 extern __visible const void __nosave_begin, __ << 60 << 61 /* Function descriptor handling (if any). Ove << 62 #ifdef CONFIG_HAVE_FUNCTION_DESCRIPTORS << 63 void *dereference_function_descriptor(void *pt << 64 void *dereference_kernel_function_descriptor(v << 65 #else << 66 #define dereference_function_descriptor(p) ((v << 67 #define dereference_kernel_function_descriptor << 68 << 69 /* An address is simply the address of the fun << 70 typedef struct { << 71 unsigned long addr; << 72 } func_desc_t; << 73 #endif << 74 << 75 static inline bool have_function_descriptors(v << 76 { << 77 return IS_ENABLED(CONFIG_HAVE_FUNCTION << 78 } << 79 << 80 /** << 81 * memory_contains - checks if an object is co << 82 * @begin: virtual address of the beginning of << 83 * @end: virtual address of the end of the mem << 84 * @virt: virtual address of the memory object << 85 * @size: size of the memory object << 86 * << 87 * Returns: true if the object specified by @v << 88 * contained within the memory region defined << 89 * otherwise. << 90 */ << 91 static inline bool memory_contains(void *begin << 92 size_t size << 93 { << 94 return virt >= begin && virt + size <= << 95 } << 96 << 97 /** << 98 * memory_intersects - checks if the region oc << 99 * with another memory reg << 100 * @begin: virtual address of the beginning of << 101 * @end: virtual address of the end of the mem << 102 * @virt: virtual address of the memory object << 103 * @size: size of the memory object << 104 * << 105 * Returns: true if an object's memory region, << 106 * intersects with the region specified by @be << 107 */ << 108 static inline bool memory_intersects(void *beg << 109 size_t si << 110 { << 111 void *vend = virt + size; << 112 << 113 if (virt < end && vend > begin) << 114 return true; << 115 << 116 return false; << 117 } << 118 << 119 /** << 120 * init_section_contains - checks if an object << 121 * section << 122 * @virt: virtual address of the memory object << 123 * @size: size of the memory object << 124 * << 125 * Returns: true if the object specified by @v << 126 * contained within the init section, false ot << 127 */ << 128 static inline bool init_section_contains(void << 129 { << 130 return memory_contains(__init_begin, _ << 131 } << 132 << 133 /** << 134 * init_section_intersects - checks if the reg << 135 * intersects with t << 136 * @virt: virtual address of the memory object << 137 * @size: size of the memory object << 138 * << 139 * Returns: true if an object's memory region, << 140 * intersects with the init section, false oth << 141 */ << 142 static inline bool init_section_intersects(voi << 143 { << 144 return memory_intersects(__init_begin, << 145 } << 146 << 147 /** << 148 * is_kernel_core_data - checks if the pointer << 149 * .data or .bss section << 150 * << 151 * @addr: address to check << 152 * << 153 * Returns: true if the address is located in << 154 * Note: On some archs it may return true for << 155 * for others. But will always be true f << 156 */ << 157 static inline bool is_kernel_core_data(unsigne << 158 { << 159 if (addr >= (unsigned long)_sdata && a << 160 return true; << 161 << 162 if (addr >= (unsigned long)__bss_start << 163 addr < (unsigned long)__bss_stop) << 164 return true; << 165 << 166 return false; << 167 } << 168 << 169 /** << 170 * is_kernel_rodata - checks if the pointer ad << 171 * .rodata section << 172 * << 173 * @addr: address to check << 174 * << 175 * Returns: true if the address is located in << 176 */ << 177 static inline bool is_kernel_rodata(unsigned l << 178 { << 179 return addr >= (unsigned long)__start_ << 180 addr < (unsigned long)__end_rod << 181 } << 182 << 183 static inline bool is_kernel_ro_after_init(uns << 184 { << 185 return addr >= (unsigned long)__start_ << 186 addr < (unsigned long)__end_ro_ << 187 } << 188 /** << 189 * is_kernel_inittext - checks if the pointer << 190 * .init.text section << 191 * << 192 * @addr: address to check << 193 * << 194 * Returns: true if the address is located in << 195 */ << 196 static inline bool is_kernel_inittext(unsigned << 197 { << 198 return addr >= (unsigned long)_sinitte << 199 addr < (unsigned long)_einittex << 200 } << 201 << 202 /** << 203 * __is_kernel_text - checks if the pointer ad << 204 * .text section << 205 * << 206 * @addr: address to check << 207 * << 208 * Returns: true if the address is located in << 209 * Note: an internal helper, only check the ra << 210 */ << 211 static inline bool __is_kernel_text(unsigned l << 212 { << 213 return addr >= (unsigned long)_stext & << 214 addr < (unsigned long)_etext; << 215 } << 216 << 217 /** << 218 * __is_kernel - checks if the pointer address << 219 * << 220 * @addr: address to check << 221 * << 222 * Returns: true if the address is located in << 223 * Note: an internal helper, check the range o << 224 * and range from __init_begin to __init << 225 * of the _stext to _end range. << 226 */ << 227 static inline bool __is_kernel(unsigned long a << 228 { << 229 return ((addr >= (unsigned long)_stext << 230 addr < (unsigned long)_end) | << 231 (addr >= (unsigned long)__init << 232 addr < (unsigned long)__init_ << 233 } << 234 << 235 #endif /* _ASM_GENERIC_SECTIONS_H_ */ << 236 7
Linux® is a registered trademark of Linus Torvalds in the United States and other countries.
TOMOYO® is a registered trademark of NTT DATA CORPORATION.