LCOV - code coverage report
Current view: top level - include/linux - kallsyms.h (source / functions) Hit Total Coverage
Test: combined.info Lines: 9 9 100.0 %
Date: 2022-04-01 14:58:12 Functions: 1 1 100.0 %
Branches: 6 14 42.9 %

           Branch data     Line data    Source code
       1                 :            : /* SPDX-License-Identifier: GPL-2.0 */
       2                 :            : /* Rewritten and vastly simplified by Rusty Russell for in-kernel
       3                 :            :  * module loader:
       4                 :            :  *   Copyright 2002 Rusty Russell <rusty@rustcorp.com.au> IBM Corporation
       5                 :            :  */
       6                 :            : #ifndef _LINUX_KALLSYMS_H
       7                 :            : #define _LINUX_KALLSYMS_H
       8                 :            : 
       9                 :            : #include <linux/errno.h>
      10                 :            : #include <linux/kernel.h>
      11                 :            : #include <linux/stddef.h>
      12                 :            : #include <linux/mm.h>
      13                 :            : #include <linux/module.h>
      14                 :            : 
      15                 :            : #include <asm/sections.h>
      16                 :            : 
      17                 :            : #define KSYM_NAME_LEN 128
      18                 :            : #define KSYM_SYMBOL_LEN (sizeof("%s+%#lx/%#lx [%s]") + (KSYM_NAME_LEN - 1) + \
      19                 :            :                          2*(BITS_PER_LONG*3/10) + (MODULE_NAME_LEN - 1) + 1)
      20                 :            : 
      21                 :            : struct module;
      22                 :            : 
      23                 :         18 : static inline int is_kernel_inittext(unsigned long addr)
      24                 :            : {
      25   [ -  -  +  - ]:         18 :         if (addr >= (unsigned long)_sinittext
      26   [ -  -  +  - ]:         18 :             && addr <= (unsigned long)_einittext)
      27                 :            :                 return 1;
      28                 :            :         return 0;
      29                 :            : }
      30                 :            : 
      31                 :       3462 : static inline int is_kernel_text(unsigned long addr)
      32                 :            : {
      33         [ +  + ]:       3462 :         if ((addr >= (unsigned long)_stext && addr <= (unsigned long)_etext) ||
      34                 :            :             arch_is_kernel_text(addr))
      35                 :            :                 return 1;
      36                 :         18 :         return in_gate_area_no_mm(addr);
      37                 :            : }
      38                 :            : 
      39                 :            : static inline int is_kernel(unsigned long addr)
      40                 :            : {
      41                 :            :         if (addr >= (unsigned long)_stext && addr <= (unsigned long)_end)
      42                 :            :                 return 1;
      43                 :            :         return in_gate_area_no_mm(addr);
      44                 :            : }
      45                 :            : 
      46                 :       3462 : static inline int is_ksym_addr(unsigned long addr)
      47                 :            : {
      48                 :       3462 :         if (IS_ENABLED(CONFIG_KALLSYMS_ALL))
      49                 :            :                 return is_kernel(addr);
      50                 :            : 
      51   [ +  -  +  - ]:       3480 :         return is_kernel_text(addr) || is_kernel_inittext(addr);
      52                 :            : }
      53                 :            : 
      54                 :            : static inline void *dereference_symbol_descriptor(void *ptr)
      55                 :            : {
      56                 :            : #ifdef HAVE_DEREFERENCE_FUNCTION_DESCRIPTOR
      57                 :            :         struct module *mod;
      58                 :            : 
      59                 :            :         ptr = dereference_kernel_function_descriptor(ptr);
      60                 :            :         if (is_ksym_addr((unsigned long)ptr))
      61                 :            :                 return ptr;
      62                 :            : 
      63                 :            :         preempt_disable();
      64                 :            :         mod = __module_address((unsigned long)ptr);
      65                 :            :         preempt_enable();
      66                 :            : 
      67                 :            :         if (mod)
      68                 :            :                 ptr = dereference_module_function_descriptor(mod, ptr);
      69                 :            : #endif
      70                 :            :         return ptr;
      71                 :            : }
      72                 :            : 
      73                 :            : #ifdef CONFIG_KALLSYMS
      74                 :            : /* Lookup the address for a symbol. Returns 0 if not found. */
      75                 :            : unsigned long kallsyms_lookup_name(const char *name);
      76                 :            : 
      77                 :            : /* Call a function on each kallsyms symbol in the core kernel */
      78                 :            : int kallsyms_on_each_symbol(int (*fn)(void *, const char *, struct module *,
      79                 :            :                                       unsigned long),
      80                 :            :                             void *data);
      81                 :            : 
      82                 :            : extern int kallsyms_lookup_size_offset(unsigned long addr,
      83                 :            :                                   unsigned long *symbolsize,
      84                 :            :                                   unsigned long *offset);
      85                 :            : 
      86                 :            : /* Lookup an address.  modname is set to NULL if it's in the kernel. */
      87                 :            : const char *kallsyms_lookup(unsigned long addr,
      88                 :            :                             unsigned long *symbolsize,
      89                 :            :                             unsigned long *offset,
      90                 :            :                             char **modname, char *namebuf);
      91                 :            : 
      92                 :            : /* Look up a kernel symbol and return it in a text buffer. */
      93                 :            : extern int sprint_symbol(char *buffer, unsigned long address);
      94                 :            : extern int sprint_symbol_no_offset(char *buffer, unsigned long address);
      95                 :            : extern int sprint_backtrace(char *buffer, unsigned long address);
      96                 :            : 
      97                 :            : int lookup_symbol_name(unsigned long addr, char *symname);
      98                 :            : int lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name);
      99                 :            : 
     100                 :            : /* How and when do we show kallsyms values? */
     101                 :            : extern int kallsyms_show_value(void);
     102                 :            : 
     103                 :            : #else /* !CONFIG_KALLSYMS */
     104                 :            : 
     105                 :            : static inline unsigned long kallsyms_lookup_name(const char *name)
     106                 :            : {
     107                 :            :         return 0;
     108                 :            : }
     109                 :            : 
     110                 :            : static inline int kallsyms_on_each_symbol(int (*fn)(void *, const char *,
     111                 :            :                                                     struct module *,
     112                 :            :                                                     unsigned long),
     113                 :            :                                           void *data)
     114                 :            : {
     115                 :            :         return 0;
     116                 :            : }
     117                 :            : 
     118                 :            : static inline int kallsyms_lookup_size_offset(unsigned long addr,
     119                 :            :                                               unsigned long *symbolsize,
     120                 :            :                                               unsigned long *offset)
     121                 :            : {
     122                 :            :         return 0;
     123                 :            : }
     124                 :            : 
     125                 :            : static inline const char *kallsyms_lookup(unsigned long addr,
     126                 :            :                                           unsigned long *symbolsize,
     127                 :            :                                           unsigned long *offset,
     128                 :            :                                           char **modname, char *namebuf)
     129                 :            : {
     130                 :            :         return NULL;
     131                 :            : }
     132                 :            : 
     133                 :            : static inline int sprint_symbol(char *buffer, unsigned long addr)
     134                 :            : {
     135                 :            :         *buffer = '\0';
     136                 :            :         return 0;
     137                 :            : }
     138                 :            : 
     139                 :            : static inline int sprint_symbol_no_offset(char *buffer, unsigned long addr)
     140                 :            : {
     141                 :            :         *buffer = '\0';
     142                 :            :         return 0;
     143                 :            : }
     144                 :            : 
     145                 :            : static inline int sprint_backtrace(char *buffer, unsigned long addr)
     146                 :            : {
     147                 :            :         *buffer = '\0';
     148                 :            :         return 0;
     149                 :            : }
     150                 :            : 
     151                 :            : static inline int lookup_symbol_name(unsigned long addr, char *symname)
     152                 :            : {
     153                 :            :         return -ERANGE;
     154                 :            : }
     155                 :            : 
     156                 :            : static inline int lookup_symbol_attrs(unsigned long addr, unsigned long *size, unsigned long *offset, char *modname, char *name)
     157                 :            : {
     158                 :            :         return -ERANGE;
     159                 :            : }
     160                 :            : 
     161                 :            : static inline int kallsyms_show_value(void)
     162                 :            : {
     163                 :            :         return false;
     164                 :            : }
     165                 :            : 
     166                 :            : #endif /*CONFIG_KALLSYMS*/
     167                 :            : 
     168                 :            : static inline void print_ip_sym(unsigned long ip)
     169                 :            : {
     170                 :            :         printk("[<%px>] %pS\n", (void *) ip, (void *) ip);
     171                 :            : }
     172                 :            : 
     173                 :            : #endif /*_LINUX_KALLSYMS_H*/

Generated by: LCOV version 1.14