cregit-Linux how code gets into the kernel

Release 4.7 kernel/extable.c

Directory: kernel
/* Rewritten by Rusty Russell, on the backs of many others...
   Copyright (C) 2001 Rusty Russell, 2002 Rusty Russell IBM.

    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation; either version 2 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program; if not, write to the Free Software
    Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA  02111-1307  USA
*/
#include <linux/ftrace.h>
#include <linux/memory.h>
#include <linux/module.h>
#include <linux/mutex.h>
#include <linux/init.h>

#include <asm/sections.h>
#include <asm/uaccess.h>

/*
 * mutex protecting text section modification (dynamic code patching).
 * some users need to sleep (allocating memory...) while they hold this lock.
 *
 * NOT exported to modules - patching kernel text is a really delicate matter.
 */

DEFINE_MUTEX(text_mutex);

extern struct exception_table_entry __start___ex_table[];
extern struct exception_table_entry __stop___ex_table[];

/* Cleared by build time tools if the table is already sorted. */

u32 __initdata __visible main_extable_sort_needed = 1;

/* Sort the kernel's built-in exception table */

void __init sort_main_extable(void) { if (main_extable_sort_needed && __stop___ex_table > __start___ex_table) { pr_notice("Sorting __ex_table...\n"); sort_extable(__start___ex_table, __stop___ex_table); } }

Contributors

PersonTokensPropCommitsCommitProp
paul mackerraspaul mackerras1550.00%125.00%
borislav petkovborislav petkov723.33%125.00%
david daneydavid daney413.33%125.00%
uwe kleine-koeniguwe kleine-koenig413.33%125.00%
Total30100.00%4100.00%

/* Given an address, look for it in the exception tables. */
const struct exception_table_entry *search_exception_tables(unsigned long addr) { const struct exception_table_entry *e; e = search_extable(__start___ex_table, __stop___ex_table-1, addr); if (!e) e = search_module_extables(addr); return e; }

Contributors

PersonTokensPropCommitsCommitProp
rusty russellrusty russell3678.26%266.67%
linus torvaldslinus torvalds1021.74%133.33%
Total46100.00%3100.00%


static inline int init_kernel_text(unsigned long addr) { if (addr >= (unsigned long)_sinittext && addr < (unsigned long)_einittext) return 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
rusty russellrusty russell2571.43%133.33%
ingo molnaringo molnar925.71%133.33%
helge dellerhelge deller12.86%133.33%
Total35100.00%3100.00%


int core_kernel_text(unsigned long addr) { if (addr >= (unsigned long)_stext && addr < (unsigned long)_etext) return 1; if (system_state == SYSTEM_BOOTING && init_kernel_text(addr)) return 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
ingo molnaringo molnar2451.06%120.00%
andrew mortonandrew morton1838.30%120.00%
rusty russellrusty russell48.51%240.00%
helge dellerhelge deller12.13%120.00%
Total47100.00%5100.00%

/** * core_kernel_data - tell if addr points to kernel data * @addr: address to test * * Returns true if @addr passed in is from the core kernel data * section. * * Note: On some archs it may return true for core RODATA, and false * for others. But will always be true for core RW data. */
int core_kernel_data(unsigned long addr) { if (addr >= (unsigned long)_sdata && addr < (unsigned long)_edata) return 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
steven rostedtsteven rostedt33100.00%2100.00%
Total33100.00%2100.00%


int __kernel_text_address(unsigned long addr) { if (core_kernel_text(addr)) return 1; if (is_module_text_address(addr)) return 1; if (is_ftrace_trampoline(addr)) return 1; /* * There might be init symbols in saved stacktraces. * Give those symbols a chance to be printed in * backtraces (such as lockdep traces). * * Since we are after the module-symbols check, there's * no danger of address overlap: */ if (init_kernel_text(addr)) return 1; return 0; }

Contributors

PersonTokensPropCommitsCommitProp
rusty russellrusty russell2445.28%250.00%
ingo molnaringo molnar1935.85%125.00%
steven rostedtsteven rostedt1018.87%125.00%
Total53100.00%4100.00%


int kernel_text_address(unsigned long addr) { if (core_kernel_text(addr)) return 1; if (is_module_text_address(addr)) return 1; return is_ftrace_trampoline(addr); }

Contributors

PersonTokensPropCommitsCommitProp
rusty russellrusty russell2468.57%375.00%
steven rostedtsteven rostedt1131.43%125.00%
Total35100.00%4100.00%

/* * On some architectures (PPC64, IA64) function pointers * are actually only tokens to some data that then holds the * real function address. As a result, to find if a function * pointer is part of the kernel text, we need to do some * special dereferencing first. */
int func_ptr_is_kernel_text(void *ptr) { unsigned long addr; addr = (unsigned long) dereference_function_descriptor(ptr); if (core_kernel_text(addr)) return 1; return is_module_text_address(addr); }

Contributors

PersonTokensPropCommitsCommitProp
arjan van de venarjan van de ven3997.50%150.00%
rusty russellrusty russell12.50%150.00%
Total40100.00%2100.00%


Overall Contributors

PersonTokensPropCommitsCommitProp
rusty russellrusty russell12032.35%730.43%
ingo molnaringo molnar6517.52%28.70%
steven rostedtsteven rostedt5514.82%313.04%
arjan van de venarjan van de ven4010.78%14.35%
linus torvaldslinus torvalds256.74%14.35%
andrew mortonandrew morton184.85%14.35%
paul mackerraspaul mackerras184.85%14.35%
david daneydavid daney112.96%14.35%
borislav petkovborislav petkov71.89%14.35%
uwe kleine-koeniguwe kleine-koenig41.08%14.35%
frederic weisbeckerfrederic weisbecker41.08%14.35%
helge dellerhelge deller20.54%14.35%
dmitri vorobievdmitri vorobiev10.27%14.35%
andi kleenandi kleen10.27%14.35%
Total371100.00%23100.00%
Directory: kernel
Information contained on this website is for historical information purposes only and does not indicate or represent copyright ownership.
{% endraw %}