Quellcodebibliothek Statistik Leitseite products/sources/formale Sprachen/C/LibreOffice/sw/source/core/fields/   (Office von Apache Version 25.8.3.2©)  Datei vom 5.10.2025 mit Größe 9 kB image not shown  

Quelle  extable.c   Sprache: C

 
// SPDX-License-Identifier: GPL-2.0-or-later
/*
 * Derived from arch/ppc/mm/extable.c and arch/i386/mm/extable.c.
 *
 * Copyright (C) 2004 Paul Mackerras, IBM Corp.
 */


#include <linux/bsearch.h>
#include <linux/module.h>
#include <linux/init.h>
#include <linux/sort.h>
#include <linux/uaccess.h>
#include <linux/extable.h>

#ifndef ARCH_HAS_RELATIVE_EXTABLE
#define ex_to_insn(x) ((x)->insn)
#else
static inline unsigned long ex_to_insn(const struct exception_table_entry *x)
{
 return (unsigned long)&x->insn + x->insn;
}
#endif

#ifndef ARCH_HAS_RELATIVE_EXTABLE
#define swap_ex  NULL
#else
static void swap_ex(void *a, void *b, int size)
{
 struct exception_table_entry *x = a, *y = b, tmp;
 int delta = b - a;

 tmp = *x;
 x->insn = y->insn + delta;
 y->insn = tmp.insn - delta;

#ifdef swap_ex_entry_fixup
 swap_ex_entry_fixup(x, y, tmp, delta);
#else
 x->fixup = y->fixup + delta;
 y->fixup = tmp.fixup - delta;
#endif
}
#endif /* ARCH_HAS_RELATIVE_EXTABLE */

/*
 * The exception table needs to be sorted so that the binary
 * search that we use to find entries in it works properly.
 * This is used both for the kernel exception table and for
 * the exception tables of modules that get loaded.
 */

static int cmp_ex_sort(const void *a, const void *b)
{
 const struct exception_table_entry *x = a, *y = b;

 /* avoid overflow */
 if (ex_to_insn(x) > ex_to_insn(y))
  return 1;
 if (ex_to_insn(x) < ex_to_insn(y))
  return -1;
 return 0;
}

void sort_extable(struct exception_table_entry *start,
    struct exception_table_entry *finish)
{
 sort(start, finish - start, sizeof(struct exception_table_entry),
      cmp_ex_sort, swap_ex);
}

#ifdef CONFIG_MODULES
/*
 * If the exception table is sorted, any referring to the module init
 * will be at the beginning or the end.
 */

void trim_init_extable(struct module *m)
{
 /*trim the beginning*/
 while (m->num_exentries &&
        within_module_init(ex_to_insn(&m->extable[0]), m)) {
  m->extable++;
  m->num_exentries--;
 }
 /*trim the end*/
 while (m->num_exentries &&
        within_module_init(ex_to_insn(&m->extable[m->num_exentries - 1]),
      m))
  m->num_exentries--;
}
#endif /* CONFIG_MODULES */

static int cmp_ex_search(const void *key, const void *elt)
{
 const struct exception_table_entry *_elt = elt;
 unsigned long _key = *(unsigned long *)key;

 /* avoid overflow */
 if (_key > ex_to_insn(_elt))
  return 1;
 if (_key < ex_to_insn(_elt))
  return -1;
 return 0;
}

/*
 * Search one exception table for an entry corresponding to the
 * given instruction address, and return the address of the entry,
 * or NULL if none is found.
 * We use a binary search, and thus we assume that the table is
 * already sorted.
 */

const struct exception_table_entry *
search_extable(const struct exception_table_entry *base,
        const size_t num,
        unsigned long value)
{
 return bsearch(&value, base, num,
         sizeof(struct exception_table_entry), cmp_ex_search);
}

Messung V0.5
C=95 H=95 G=94

¤ Dauer der Verarbeitung: 0.25 Sekunden  (vorverarbeitet)  ¤

*© Formatika GbR, Deutschland






Wurzel

Suchen

Beweissystem der NASA

Beweissystem Isabelle

NIST Cobol Testsuite

Cephes Mathematical Library

Wiener Entwicklungsmethode

Haftungshinweis

Die Informationen auf dieser Webseite wurden nach bestem Wissen sorgfältig zusammengestellt. Es wird jedoch weder Vollständigkeit, noch Richtigkeit, noch Qualität der bereit gestellten Informationen zugesichert.

Bemerkung:

Die farbliche Syntaxdarstellung und die Messung sind noch experimentell.