The new is_kernel() check the kernel address ranges, and the new is_kernel_text() check the kernel text section ranges. Then use them to make some code clear. Cc: Arnd Bergmann <arnd@xxxxxxxx> Cc: Andrey Ryabinin <ryabinin.a.a@xxxxxxxxx> Signed-off-by: Kefeng Wang <wangkefeng.wang@xxxxxxxxxx> --- include/asm-generic/sections.h | 27 +++++++++++++++++++++++++++ include/linux/kallsyms.h | 4 ++-- kernel/extable.c | 3 +-- mm/kasan/report.c | 2 +- 4 files changed, 31 insertions(+), 5 deletions(-) diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h index 9d622416a59c..06066d89137d 100644 --- a/include/asm-generic/sections.h +++ b/include/asm-generic/sections.h @@ -170,6 +170,20 @@ static inline bool is_kernel_rodata(unsigned long addr) addr < (unsigned long)__end_rodata; } +/** + * is_kernel_text - checks if the pointer address is located in the + * .text section + * + * @addr: address to check + * + * Returns: true if the address is located in .text, false otherwise. + */ +static inline bool is_kernel_text(unsigned long addr) +{ + return addr >= (unsigned long)_stext && + addr < (unsigned long)_etext; +} + /** * is_kernel_inittext - checks if the pointer address is located in the * .init.text section @@ -184,4 +198,17 @@ static inline bool is_kernel_inittext(unsigned long addr) addr < (unsigned long)_einittext; } +/** + * is_kernel - checks if the pointer address is located in the kernel range + * + * @addr: address to check + * + * Returns: true if the address is located in kernel range, false otherwise. + */ +static inline bool is_kernel(unsigned long addr) +{ + return addr >= (unsigned long)_stext && + addr < (unsigned long)_end; +} + #endif /* _ASM_GENERIC_SECTIONS_H_ */ diff --git a/include/linux/kallsyms.h b/include/linux/kallsyms.h index 814e1cc8eabf..60460df66e83 100644 --- a/include/linux/kallsyms.h +++ b/include/linux/kallsyms.h @@ -25,14 +25,14 @@ struct module; static inline int is_kernel_text_or_gate_area(unsigned long addr) { - if ((addr >= (unsigned long)_stext && addr < (unsigned long)_etext)) + if (is_kernel_text(addr)) return 1; return in_gate_area_no_mm(addr); } static inline int is_kernel_or_gate_area(unsigned long addr) { - if (addr >= (unsigned long)_stext && addr < (unsigned long)_end) + if (is_kernel(addr)) return 1; return in_gate_area_no_mm(addr); } diff --git a/kernel/extable.c b/kernel/extable.c index 98ca627ac5ef..0ba383d850ff 100644 --- a/kernel/extable.c +++ b/kernel/extable.c @@ -64,8 +64,7 @@ const struct exception_table_entry *search_exception_tables(unsigned long addr) int notrace core_kernel_text(unsigned long addr) { - if (addr >= (unsigned long)_stext && - addr < (unsigned long)_etext) + if (is_kernel_text(addr)) return 1; if (system_state < SYSTEM_RUNNING && diff --git a/mm/kasan/report.c b/mm/kasan/report.c index 8fff1825b22c..3971917c73c5 100644 --- a/mm/kasan/report.c +++ b/mm/kasan/report.c @@ -212,7 +212,7 @@ static void describe_object(struct kmem_cache *cache, void *object, static inline bool kernel_or_module_addr(const void *addr) { - if (addr >= (void *)_stext && addr < (void *)_end) + if (is_kernel((unsigned long)addr)) return true; if (is_module_address((unsigned long)addr)) return true; -- 2.26.2