Blame view

include/asm-generic/sections.h 4.76 KB
b24413180   Greg Kroah-Hartman   License cleanup: ...
1
  /* SPDX-License-Identifier: GPL-2.0 */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
2
3
4
5
  #ifndef _ASM_GENERIC_SECTIONS_H_
  #define _ASM_GENERIC_SECTIONS_H_
  
  /* References to section boundaries */
7f8998c7a   Geert Uytterhoeven   nosave: consolida...
6
  #include <linux/compiler.h>
979559362   Thierry Reding   asm/sections: add...
7
  #include <linux/types.h>
7f8998c7a   Geert Uytterhoeven   nosave: consolida...
8

1622d1abd   Jiang Liu   vmlinux.lds: add ...
9
10
11
12
13
14
15
16
  /*
   * Usage guidelines:
   * _text, _data: architecture specific, don't use them in arch-independent code
   * [_stext, _etext]: contains .text.* sections, may also contain .rodata.*
   *                   and/or .init.* sections
   * [_sdata, _edata]: contains .data.* sections, may also contain .rodata.*
   *                   and/or .init.* sections.
   * [__start_rodata, __end_rodata]: contains .rodata.* sections
906f2a51c   Kees Cook   mm: fix section n...
17
18
   * [__start_ro_after_init, __end_ro_after_init]:
   *		     contains .data..ro_after_init section
1622d1abd   Jiang Liu   vmlinux.lds: add ...
19
20
21
22
23
24
25
26
27
28
29
   * [__init_begin, __init_end]: contains .init.* sections, but .init.text.*
   *                   may be out of this range on some architectures.
   * [_sinittext, _einittext]: contains .init.text.* sections
   * [__bss_start, __bss_stop]: contains BSS sections
   *
   * Following global variables are optional and may be unavailable on some
   * architectures and/or kernel configurations.
   *	_text, _data
   *	__kprobes_text_start, __kprobes_text_end
   *	__entry_text_start, __entry_text_end
   *	__ctors_start, __ctors_end
229a71860   Masami Hiramatsu   irq: Make the irq...
30
31
   *	__irqentry_text_start, __irqentry_text_end
   *	__softirqentry_text_start, __softirqentry_text_end
1622d1abd   Jiang Liu   vmlinux.lds: add ...
32
   */
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
33
34
35
36
37
  extern char _text[], _stext[], _etext[];
  extern char _data[], _sdata[], _edata[];
  extern char __bss_start[], __bss_stop[];
  extern char __init_begin[], __init_end[];
  extern char _sinittext[], _einittext[];
906f2a51c   Kees Cook   mm: fix section n...
38
  extern char __start_ro_after_init[], __end_ro_after_init[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
39
  extern char _end[];
3e5d8f978   Tejun Heo   x86: make percpu ...
40
  extern char __per_cpu_load[], __per_cpu_start[], __per_cpu_end[];
d0aaff979   Prasanna S Panchamukhi   [PATCH] Kprobes: ...
41
  extern char __kprobes_text_start[], __kprobes_text_end[];
ea7145477   Jiri Olsa   x86: Separate out...
42
  extern char __entry_text_start[], __entry_text_end[];
a581c2a46   Heiko Carstens   [PATCH] add __[st...
43
  extern char __start_rodata[], __end_rodata[];
229a71860   Masami Hiramatsu   irq: Make the irq...
44
45
  extern char __irqentry_text_start[], __irqentry_text_end[];
  extern char __softirqentry_text_start[], __softirqentry_text_end[];
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
46

b99b87f70   Peter Oberparleiter   kernel: construct...
47
48
  /* Start and end of .ctors section - used for constructor calls. */
  extern char __ctors_start[], __ctors_end[];
7f8998c7a   Geert Uytterhoeven   nosave: consolida...
49
  extern __visible const void __nosave_begin, __nosave_end;
deac93df2   James Bottomley   lib: Correct prin...
50
51
52
53
54
  /* function descriptor handling (if any).  Override
   * in asm/sections.h */
  #ifndef dereference_function_descriptor
  #define dereference_function_descriptor(p) (p)
  #endif
00afe029a   Mike Frysinger   asm/sections: add...
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
  /* random extra sections (if any).  Override
   * in asm/sections.h */
  #ifndef arch_is_kernel_text
  static inline int arch_is_kernel_text(unsigned long addr)
  {
  	return 0;
  }
  #endif
  
  #ifndef arch_is_kernel_data
  static inline int arch_is_kernel_data(unsigned long addr)
  {
  	return 0;
  }
  #endif
979559362   Thierry Reding   asm/sections: add...
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
  /**
   * memory_contains - checks if an object is contained within a memory region
   * @begin: virtual address of the beginning of the memory region
   * @end: virtual address of the end of the memory region
   * @virt: virtual address of the memory object
   * @size: size of the memory object
   *
   * Returns: true if the object specified by @virt and @size is entirely
   * contained within the memory region defined by @begin and @end, false
   * otherwise.
   */
  static inline bool memory_contains(void *begin, void *end, void *virt,
  				   size_t size)
  {
  	return virt >= begin && virt + size <= end;
  }
  
  /**
   * memory_intersects - checks if the region occupied by an object intersects
   *                     with another memory region
   * @begin: virtual address of the beginning of the memory regien
   * @end: virtual address of the end of the memory region
   * @virt: virtual address of the memory object
   * @size: size of the memory object
   *
   * Returns: true if an object's memory region, specified by @virt and @size,
   * intersects with the region specified by @begin and @end, false otherwise.
   */
  static inline bool memory_intersects(void *begin, void *end, void *virt,
  				     size_t size)
  {
  	void *vend = virt + size;
  
  	return (virt >= begin && virt < end) || (vend >= begin && vend < end);
  }
  
  /**
   * init_section_contains - checks if an object is contained within the init
   *                         section
   * @virt: virtual address of the memory object
   * @size: size of the memory object
   *
   * Returns: true if the object specified by @virt and @size is entirely
   * contained within the init section, false otherwise.
   */
  static inline bool init_section_contains(void *virt, size_t size)
  {
  	return memory_contains(__init_begin, __init_end, virt, size);
  }
  
  /**
   * init_section_intersects - checks if the region occupied by an object
   *                           intersects with the init section
   * @virt: virtual address of the memory object
   * @size: size of the memory object
   *
   * Returns: true if an object's memory region, specified by @virt and @size,
   * intersects with the init section, false otherwise.
   */
  static inline bool init_section_intersects(void *virt, size_t size)
  {
  	return memory_intersects(__init_begin, __init_end, virt, size);
  }
1da177e4c   Linus Torvalds   Linux-2.6.12-rc2
133
  #endif /* _ASM_GENERIC_SECTIONS_H_ */