| From: Thierry Reding <treding@nvidia.com> |
| Date: Fri, 15 Jan 2016 16:58:18 -0800 |
| Subject: asm/sections: add helpers to check for section data |
| |
| commit 979559362516bb0f5424505c607210ac054e30ae upstream. |
| |
| Add a helper to check if an object (given an address and a size) is part |
| of a section (given beginning and end addresses). For convenience, also |
| provide a helper that performs this check for __init data using the |
| __init_begin and __init_end limits. |
| |
| Signed-off-by: Thierry Reding <treding@nvidia.com> |
| Cc: Arnd Bergmann <arnd@arndb.de> |
| Cc: Greg Kroah-Hartman <gregkh@linuxfoundation.org> |
| Cc: Joe Perches <joe@perches.com> |
| Signed-off-by: Andrew Morton <akpm@linux-foundation.org> |
| Signed-off-by: Linus Torvalds <torvalds@linux-foundation.org> |
| Signed-off-by: Ben Hutchings <ben@decadent.org.uk> |
| --- |
| include/asm-generic/sections.h | 65 ++++++++++++++++++++++++++++++++++++++++++ |
| 1 file changed, 65 insertions(+) |
| |
| --- a/include/asm-generic/sections.h |
| +++ b/include/asm-generic/sections.h |
| @@ -4,6 +4,7 @@ |
| /* References to section boundaries */ |
| |
| #include <linux/compiler.h> |
| +#include <linux/types.h> |
| |
| /* |
| * Usage guidelines: |
| @@ -63,4 +64,68 @@ static inline int arch_is_kernel_data(un |
| } |
| #endif |
| |
| +/** |
| + * 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); |
| +} |
| + |
| #endif /* _ASM_GENERIC_SECTIONS_H_ */ |