The Design and Implementation of the FreeBSD Operating System, Second Edition
Now available: The Design and Implementation of the FreeBSD Operating System (Second Edition)


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]

FreeBSD/Linux Kernel Cross Reference
sys/kernel/extable.c

Version: -  FREEBSD  -  FREEBSD-13-STABLE  -  FREEBSD-13-0  -  FREEBSD-12-STABLE  -  FREEBSD-12-0  -  FREEBSD-11-STABLE  -  FREEBSD-11-0  -  FREEBSD-10-STABLE  -  FREEBSD-10-0  -  FREEBSD-9-STABLE  -  FREEBSD-9-0  -  FREEBSD-8-STABLE  -  FREEBSD-8-0  -  FREEBSD-7-STABLE  -  FREEBSD-7-0  -  FREEBSD-6-STABLE  -  FREEBSD-6-0  -  FREEBSD-5-STABLE  -  FREEBSD-5-0  -  FREEBSD-4-STABLE  -  FREEBSD-3-STABLE  -  FREEBSD22  -  l41  -  OPENBSD  -  linux-2.6  -  MK84  -  PLAN9  -  xnu-8792 
SearchContext: -  none  -  3  -  10 

    1 /* Rewritten by Rusty Russell, on the backs of many others...
    2    Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM.
    3 
    4     This program is free software; you can redistribute it and/or modify
    5     it under the terms of the GNU General Public License as published by
    6     the Free Software Foundation; either version 2 of the License, or
    7     (at your option) any later version.
    8 
    9     This program is distributed in the hope that it will be useful,
   10     but WITHOUT ANY WARRANTY; without even the implied warranty of
   11     MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
   12     GNU General Public License for more details.
   13 
   14     You should have received a copy of the GNU General Public License
   15     along with this program; if not, write to the Free Software
   16     Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
   17 */
   18 #include <linux/ftrace.h>
   19 #include <linux/memory.h>
   20 #include <linux/module.h>
   21 #include <linux/mutex.h>
   22 #include <linux/init.h>
   23 
   24 #include <asm/sections.h>
   25 #include <asm/uaccess.h>
   26 
   27 /*
   28  * mutex protecting text section modification (dynamic code patching).
   29  * some users need to sleep (allocating memory...) while they hold this lock.
   30  *
   31  * NOT exported to modules - patching kernel text is a really delicate matter.
   32  */
   33 DEFINE_MUTEX(text_mutex);
   34 
   35 extern struct exception_table_entry __start___ex_table[];
   36 extern struct exception_table_entry __stop___ex_table[];
   37 
   38 /* Cleared by build time tools if the table is already sorted. */
   39 u32 __initdata main_extable_sort_needed = 1;
   40 
   41 /* Sort the kernel's built-in exception table */
   42 void __init sort_main_extable(void)
   43 {
   44         if (main_extable_sort_needed)
   45                 sort_extable(__start___ex_table, __stop___ex_table);
   46         else
   47                 pr_notice("__ex_table already sorted, skipping sort\n");
   48 }
   49 
   50 /* Given an address, look for it in the exception tables. */
   51 const struct exception_table_entry *search_exception_tables(unsigned long addr)
   52 {
   53         const struct exception_table_entry *e;
   54 
   55         e = search_extable(__start___ex_table, __stop___ex_table-1, addr);
   56         if (!e)
   57                 e = search_module_extables(addr);
   58         return e;
   59 }
   60 
   61 static inline int init_kernel_text(unsigned long addr)
   62 {
   63         if (addr >= (unsigned long)_sinittext &&
   64             addr <= (unsigned long)_einittext)
   65                 return 1;
   66         return 0;
   67 }
   68 
   69 int core_kernel_text(unsigned long addr)
   70 {
   71         if (addr >= (unsigned long)_stext &&
   72             addr <= (unsigned long)_etext)
   73                 return 1;
   74 
   75         if (system_state == SYSTEM_BOOTING &&
   76             init_kernel_text(addr))
   77                 return 1;
   78         return 0;
   79 }
   80 
   81 /**
   82  * core_kernel_data - tell if addr points to kernel data
   83  * @addr: address to test
   84  *
   85  * Returns true if @addr passed in is from the core kernel data
   86  * section.
   87  *
   88  * Note: On some archs it may return true for core RODATA, and false
   89  *  for others. But will always be true for core RW data.
   90  */
   91 int core_kernel_data(unsigned long addr)
   92 {
   93         if (addr >= (unsigned long)_sdata &&
   94             addr < (unsigned long)_edata)
   95                 return 1;
   96         return 0;
   97 }
   98 
   99 int __kernel_text_address(unsigned long addr)
  100 {
  101         if (core_kernel_text(addr))
  102                 return 1;
  103         if (is_module_text_address(addr))
  104                 return 1;
  105         /*
  106          * There might be init symbols in saved stacktraces.
  107          * Give those symbols a chance to be printed in
  108          * backtraces (such as lockdep traces).
  109          *
  110          * Since we are after the module-symbols check, there's
  111          * no danger of address overlap:
  112          */
  113         if (init_kernel_text(addr))
  114                 return 1;
  115         return 0;
  116 }
  117 
  118 int kernel_text_address(unsigned long addr)
  119 {
  120         if (core_kernel_text(addr))
  121                 return 1;
  122         return is_module_text_address(addr);
  123 }
  124 
  125 /*
  126  * On some architectures (PPC64, IA64) function pointers
  127  * are actually only tokens to some data that then holds the
  128  * real function address. As a result, to find if a function
  129  * pointer is part of the kernel text, we need to do some
  130  * special dereferencing first.
  131  */
  132 int func_ptr_is_kernel_text(void *ptr)
  133 {
  134         unsigned long addr;
  135         addr = (unsigned long) dereference_function_descriptor(ptr);
  136         if (core_kernel_text(addr))
  137                 return 1;
  138         return is_module_text_address(addr);
  139 }

Cache object: 0fbb1bf87af35342cd97715f2fc3776e


[ source navigation ] [ diff markup ] [ identifier search ] [ freetext search ] [ file search ] [ list types ] [ track identifier ]


This page is part of the FreeBSD/Linux Linux Kernel Cross-Reference, and was automatically generated using a modified version of the LXR engine.