diff options
author | Ralf Baechle <ralf@linux-mips.org> | 1999-08-18 23:37:42 +0000 |
---|---|---|
committer | Ralf Baechle <ralf@linux-mips.org> | 1999-08-18 23:37:42 +0000 |
commit | 794ff4dc959a8dfef4f704ef6a5bb7334e421623 (patch) | |
tree | 9ea4d7f31e69420a29819a7e4c88e4097aa4380f /arch/mips64/mm/extable.c | |
parent | 8b92ed51419c907aa453c063b0afaefaef268c02 (diff) |
- Drop support for 32/32 fp register model
- Fix siginfo structure definition
- Ptrace fixes, one of them was an uninitialized pointer.
- Header file fixes.
- Fixes to linker scripts required for new binutils.
- MIPS64. Chainsaw edition.
Btw, Harald, why does the kernel no longer compile ...
Diffstat (limited to 'arch/mips64/mm/extable.c')
-rw-r--r-- | arch/mips64/mm/extable.c | 60 |
1 files changed, 60 insertions, 0 deletions
diff --git a/arch/mips64/mm/extable.c b/arch/mips64/mm/extable.c new file mode 100644 index 000000000..7a7ab27ea --- /dev/null +++ b/arch/mips64/mm/extable.c @@ -0,0 +1,60 @@ +/* $Id$ + * + * This file is subject to the terms and conditions of the GNU General Public + * License. See the file "COPYING" in the main directory of this archive + * for more details. + * + * Copyright (C) 1994, 1995, 1996, 1999 by Ralf Baechle + * Copyright (C) 1999 by Silicon Graphics + */ +#include <linux/config.h> +#include <linux/module.h> +#include <asm/uaccess.h> + +extern const struct exception_table_entry __start___ex_table[]; +extern const struct exception_table_entry __stop___ex_table[]; + +static inline unsigned +search_one_table(const struct exception_table_entry *first, + const struct exception_table_entry *last, + unsigned long value) +{ + while (first <= last) { + const struct exception_table_entry *mid; + long diff; + + mid = (last - first) / 2 + first; + diff = mid->insn - value; + if (diff == 0) + return mid->nextinsn; + else if (diff < 0) + first = mid+1; + else + last = mid-1; + } + return 0; +} + +unsigned long +search_exception_table(unsigned long addr) +{ + unsigned long ret; + +#ifndef CONFIG_MODULES + /* There is only the kernel to search. */ + ret = search_one_table(__start___ex_table, __stop___ex_table-1, addr); + if (ret) return ret; +#else + /* The kernel is the last "module" -- no need to treat it special. */ + struct module *mp; + for (mp = module_list; mp != NULL; mp = mp->next) { + if (mp->ex_table_start == NULL) + continue; + ret = search_one_table(mp->ex_table_start, + mp->ex_table_end - 1, addr); + if (ret) return ret; + } +#endif + + return 0; +} |