^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 1) /* SPDX-License-Identifier: GPL-2.0 */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 2) #ifndef _ASM_GENERIC_SECTIONS_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 3) #define _ASM_GENERIC_SECTIONS_H_
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 4)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 5) /* References to section boundaries */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 6)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 7) #include <linux/compiler.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 8) #include <linux/types.h>
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 9)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 10) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 11) * Usage guidelines:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 12) * _text, _data: architecture specific, don't use them in arch-independent code
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 13) * [_stext, _etext]: contains .text.* sections, may also contain .rodata.*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 14) * and/or .init.* sections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 15) * [_sdata, _edata]: contains .data.* sections, may also contain .rodata.*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 16) * and/or .init.* sections.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 17) * [__start_rodata, __end_rodata]: contains .rodata.* sections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 18) * [__start_ro_after_init, __end_ro_after_init]:
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 19) * contains .data..ro_after_init section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 20) * [__init_begin, __init_end]: contains .init.* sections, but .init.text.*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 21) * may be out of this range on some architectures.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 22) * [_sinittext, _einittext]: contains .init.text.* sections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 23) * [__bss_start, __bss_stop]: contains BSS sections
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 24) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 25) * Following global variables are optional and may be unavailable on some
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 26) * architectures and/or kernel configurations.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 27) * _text, _data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 28) * __kprobes_text_start, __kprobes_text_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 29) * __entry_text_start, __entry_text_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 30) * __ctors_start, __ctors_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 31) * __irqentry_text_start, __irqentry_text_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 32) * __softirqentry_text_start, __softirqentry_text_end
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 33) * __start_opd, __end_opd
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 34) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 35) extern char _text[], _stext[], _etext[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 36) extern char _data[], _sdata[], _edata[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 37) extern char __bss_start[], __bss_stop[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 38) extern char __init_begin[], __init_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 39) extern char _sinittext[], _einittext[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 40) extern char __start_ro_after_init[], __end_ro_after_init[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 41) extern char _end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 42) extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 43) extern char __kprobes_text_start[], __kprobes_text_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 44) extern char __entry_text_start[], __entry_text_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 45) extern char __start_rodata[], __end_rodata[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 46) extern char __irqentry_text_start[], __irqentry_text_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 47) extern char __softirqentry_text_start[], __softirqentry_text_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 48) extern char __start_once[], __end_once[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 49)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 50) /* Start and end of .ctors section - used for constructor calls. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 51) extern char __ctors_start[], __ctors_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 52)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 53) /* Start and end of .opd section - used for function descriptors. */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 54) extern char __start_opd[], __end_opd[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 55)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 56) /* Start and end of instrumentation protected text section */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 57) extern char __noinstr_text_start[], __noinstr_text_end[];
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 58)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 59) extern __visible const void __nosave_begin, __nosave_end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 60)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 61) /* Function descriptor handling (if any). Override in asm/sections.h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 62) #ifndef dereference_function_descriptor
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 63) #define dereference_function_descriptor(p) ((void *)(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 64) #define dereference_kernel_function_descriptor(p) ((void *)(p))
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 65) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 66)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 67) /* random extra sections (if any). Override
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 68) * in asm/sections.h */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 69) #ifndef arch_is_kernel_text
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 70) static inline int arch_is_kernel_text(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 71) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 72) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 73) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 74) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 75)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 76) #ifndef arch_is_kernel_data
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 77) static inline int arch_is_kernel_data(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 78) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 79) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 80) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 81) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 82)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 83) /*
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 84) * Check if an address is part of freed initmem. This is needed on architectures
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 85) * with virt == phys kernel mapping, for code that wants to check if an address
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 86) * is part of a static object within [_stext, _end]. After initmem is freed,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 87) * memory can be allocated from it, and such allocations would then have
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 88) * addresses within the range [_stext, _end].
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 89) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 90) #ifndef arch_is_kernel_initmem_freed
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 91) static inline int arch_is_kernel_initmem_freed(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 92) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 93) return 0;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 94) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 95) #endif
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 96)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 97) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 98) * memory_contains - checks if an object is contained within a memory region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 99) * @begin: virtual address of the beginning of the memory region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 100) * @end: virtual address of the end of the memory region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 101) * @virt: virtual address of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 102) * @size: size of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 103) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 104) * Returns: true if the object specified by @virt and @size is entirely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 105) * contained within the memory region defined by @begin and @end, false
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 106) * otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 107) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 108) static inline bool memory_contains(void *begin, void *end, void *virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 109) size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 110) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 111) return virt >= begin && virt + size <= end;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 112) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 113)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 114) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 115) * memory_intersects - checks if the region occupied by an object intersects
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 116) * with another memory region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 117) * @begin: virtual address of the beginning of the memory regien
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 118) * @end: virtual address of the end of the memory region
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 119) * @virt: virtual address of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 120) * @size: size of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 121) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 122) * Returns: true if an object's memory region, specified by @virt and @size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 123) * intersects with the region specified by @begin and @end, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 124) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 125) static inline bool memory_intersects(void *begin, void *end, void *virt,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 126) size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 127) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 128) void *vend = virt + size;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 129)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 130) return (virt >= begin && virt < end) || (vend >= begin && vend < end);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 131) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 132)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 133) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 134) * init_section_contains - checks if an object is contained within the init
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 135) * section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 136) * @virt: virtual address of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 137) * @size: size of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 138) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 139) * Returns: true if the object specified by @virt and @size is entirely
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 140) * contained within the init section, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 141) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 142) static inline bool init_section_contains(void *virt, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 143) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 144) return memory_contains(__init_begin, __init_end, virt, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 145) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 146)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 147) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 148) * init_section_intersects - checks if the region occupied by an object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 149) * intersects with the init section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 150) * @virt: virtual address of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 151) * @size: size of the memory object
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 152) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 153) * Returns: true if an object's memory region, specified by @virt and @size,
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 154) * intersects with the init section, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 155) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 156) static inline bool init_section_intersects(void *virt, size_t size)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 157) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 158) return memory_intersects(__init_begin, __init_end, virt, size);
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 159) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 160)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 161) /**
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 162) * is_kernel_rodata - checks if the pointer address is located in the
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 163) * .rodata section
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 164) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 165) * @addr: address to check
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 166) *
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 167) * Returns: true if the address is located in .rodata, false otherwise.
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 168) */
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 169) static inline bool is_kernel_rodata(unsigned long addr)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 170) {
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 171) return addr >= (unsigned long)__start_rodata &&
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 172) addr < (unsigned long)__end_rodata;
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 173) }
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 174)
^8f3ce5b39 (kx 2023-10-28 12:00:06 +0300 175) #endif /* _ASM_GENERIC_SECTIONS_H_ */