diff mbox series

[v2,6/7] sections: Add new is_kernel() and is_kernel_text()

Message ID 20210728081320.20394-7-wangkefeng.wang@huawei.com (mailing list archive)
State Handled Elsewhere
Headers show
Series sections: Unify kernel sections range check and use | expand

Commit Message

Kefeng Wang July 28, 2021, 8:13 a.m. UTC
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@arndb.de>
Cc: Andrey Ryabinin <ryabinin.a.a@gmail.com>
Signed-off-by: Kefeng Wang <wangkefeng.wang@huawei.com>
---
 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(-)

Comments

Steven Rostedt July 28, 2021, 3:32 p.m. UTC | #1
On Wed, 28 Jul 2021 16:13:19 +0800
Kefeng Wang <wangkefeng.wang@huawei.com> wrote:

> @@ -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))

Perhaps this was a bug, and these functions should be checking the gate
area as well, as that is part of kernel text.

-- Steve


>  		return 1;
>  
>  	if (system_state < SYSTEM_RUNNING &&
> diff --git a/mm/kasan/report.c b/mm/kasan/report.c
> index 884a950c7026..88f5b0c058b7 100644
> --- a/mm/kasan/report.c
> +++ b/mm/kasan/report.c
> @@ -235,7 +235,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;
> --
Kefeng Wang July 29, 2021, 2:02 a.m. UTC | #2
On 2021/7/28 23:32, Steven Rostedt wrote:
> On Wed, 28 Jul 2021 16:13:19 +0800
> Kefeng Wang <wangkefeng.wang@huawei.com> wrote:
>
>> @@ -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))
> Perhaps this was a bug, and these functions should be checking the gate
> area as well, as that is part of kernel text.
Ok, I would fix this if patch5 is reviewed well.
>
> -- Steve
>
>
>>   		return 1;
>>   
>>   	if (system_state < SYSTEM_RUNNING &&
>> diff --git a/mm/kasan/report.c b/mm/kasan/report.c
>> index 884a950c7026..88f5b0c058b7 100644
>> --- a/mm/kasan/report.c
>> +++ b/mm/kasan/report.c
>> @@ -235,7 +235,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;
>> -- 
> .
>
diff mbox series

Patch

diff --git a/include/asm-generic/sections.h b/include/asm-generic/sections.h
index 4f2f32aa2b7a..6b143637ab88 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 4f501ac9c2c2..897d5720884f 100644
--- a/include/linux/kallsyms.h
+++ b/include/linux/kallsyms.h
@@ -26,14 +26,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 884a950c7026..88f5b0c058b7 100644
--- a/mm/kasan/report.c
+++ b/mm/kasan/report.c
@@ -235,7 +235,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;