From: Matt Mackall Switch IA64 exception tables to lib/sort. Signed-off-by: Matt Mackall Signed-off-by: Andrew Morton --- 25-akpm/arch/ia64/mm/extable.c | 44 ++++++++++++++++------------------------- 1 files changed, 18 insertions(+), 26 deletions(-) diff -puN arch/ia64/mm/extable.c~lib-sort-replace-insertion-sort-in-ia64-exception-tables arch/ia64/mm/extable.c --- 25/arch/ia64/mm/extable.c~lib-sort-replace-insertion-sort-in-ia64-exception-tables 2005-02-02 15:44:08.721918328 -0800 +++ 25-akpm/arch/ia64/mm/extable.c 2005-02-02 15:44:08.724917872 -0800 @@ -6,29 +6,24 @@ */ #include +#include #include #include -static inline int -compare_entries (struct exception_table_entry *l, struct exception_table_entry *r) +static int cmp_ex(const void *a, const void *b) { + const struct exception_table_entry *l = a, *r = b; u64 lip = (u64) &l->addr + l->addr; u64 rip = (u64) &r->addr + r->addr; - if (lip < rip) - return -1; - if (lip == rip) - return 0; - else - return 1; + return lip - rip; } -static inline void -swap_entries (struct exception_table_entry *l, struct exception_table_entry *r) +static void swap_ex(void *a, void *b) { + struct exception_table_entry *l = a, *r = b, tmp; u64 delta = (u64) r - (u64) l; - struct exception_table_entry tmp; tmp = *l; l->addr = r->addr + delta; @@ -38,23 +33,20 @@ swap_entries (struct exception_table_ent } /* - * Sort the exception table. It's usually already sorted, but there may be unordered - * entries due to multiple text sections (such as the .init text section). Note that the - * exception-table-entries contain location-relative addresses, which requires a bit of - * care during sorting to avoid overflows in the offset members (e.g., it would not be - * safe to make a temporary copy of an exception-table entry on the stack, because the - * stack may be more than 2GB away from the exception-table). + * Sort the exception table. It's usually already sorted, but there + * may be unordered entries due to multiple text sections (such as the + * .init text section). Note that the exception-table-entries contain + * location-relative addresses, which requires a bit of care during + * sorting to avoid overflows in the offset members (e.g., it would + * not be safe to make a temporary copy of an exception-table entry on + * the stack, because the stack may be more than 2GB away from the + * exception-table). */ -void -sort_extable (struct exception_table_entry *start, struct exception_table_entry *finish) +void sort_extable (struct exception_table_entry *start, + struct exception_table_entry *finish) { - struct exception_table_entry *p, *q; - - /* insertion sort */ - for (p = start + 1; p < finish; ++p) - /* start .. p-1 is sorted; push p down to it's proper place */ - for (q = p; q > start && compare_entries(&q[0], &q[-1]) < 0; --q) - swap_entries(&q[0], &q[-1]); + sort(start, finish - start, sizeof(struct exception_table_entry), + cmp_ex, swap_ex); } const struct exception_table_entry * _