Commit 154a5720 authored by Anton Blanchard's avatar Anton Blanchard

ppc64: sort exception table

parent 16c017bb
......@@ -539,6 +539,7 @@ void __init setup_arch(char **cmdline_p)
ppc_md.setup_arch();
paging_init();
sort_exception_table();
ppc_md.progress("setup_arch: exit", 0x3eab);
}
......
......@@ -9,11 +9,47 @@
* 2 of the License, or (at your option) any later version.
*/
#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[];
extern struct exception_table_entry __start___ex_table[];
extern struct exception_table_entry __stop___ex_table[];
/*
* The exception table needs to be sorted because we use the macros
* which put things into the exception table in a variety of segments
* such as the prep, pmac, chrp, etc. segments as well as the init
* segment and the main kernel text segment.
*/
static inline void
sort_ex_table(struct exception_table_entry *start,
struct exception_table_entry *finish)
{
struct exception_table_entry el, *p, *q;
/* insertion sort */
for (p = start + 1; p < finish; ++p) {
/* start .. p-1 is sorted */
if (p[0].insn < p[-1].insn) {
/* move element p down to its right place */
el = *p;
q = p;
do {
/* el comes before q[-1], move q[-1] up one */
q[0] = q[-1];
--q;
} while (q > start && el.insn < q[-1].insn);
*q = el;
}
}
}
void
sort_exception_table(void)
{
sort_ex_table(__start___ex_table, __stop___ex_table);
}
static inline unsigned long
search_one_table(const struct exception_table_entry *first,
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment