Re: [PATCH] Add noinline attribute

From: Andi Kleen
Date: Fri Jan 16 2004 - 05:13:51 EST


> Ugh. Can't we just make this be generic code (and that means calling it in
> the module loading code too..)?

Ok, here is a new patch that does the whole thing in generic code and for
modules too. I didn't bother to change the sort algorithm because the
existing one works well enough.

-Andi

------------------------------------------------------------------

Sort exception tables at runtime. This avoids problems with out of
order sections like __init. Needed for gcc 3.4 or 3.3-hammer with
-funit-at-a-time.

diff -u linux-34/init/main.c-o linux-34/init/main.c
--- linux-34/init/main.c-o 2004-01-09 09:27:20.000000000 +0100
+++ linux-34/init/main.c 2004-01-16 10:07:00.699618728 +0100
@@ -289,6 +289,32 @@
}
__setup("init=", init_setup);

+extern struct exception_table_entry __start___ex_table[];
+extern struct exception_table_entry __stop___ex_table[];
+
+/* When an exception handler is in an non standard section (like __init)
+ the fixup table can end up unordered. Fix that here. */
+__init void sort_extable(struct exception_table_entry *start,
+ struct exception_table_entry *end)
+{
+ struct exception_table_entry *e;
+ int change;
+
+ /* The input is near completely presorted, which makes bubble sort the
+ best (and simplest) sort algorithm. */
+ do {
+ change = 0;
+ for (e = start+1; e < end; e++) {
+ if (e->insn < e[-1].insn) {
+ struct exception_table_entry tmp = e[-1];
+ e[-1] = e[0];
+ e[0] = tmp;
+ change = 1;
+ }
+ }
+ } while (change != 0);
+}
+
extern void setup_arch(char **);
extern void cpu_idle(void);

@@ -394,6 +420,7 @@
lock_kernel();
printk(linux_banner);
setup_arch(&command_line);
+ sort_extable(__start___ex_table, __stop___ex_table);
setup_per_cpu_areas();

/*
diff -u linux-34/kernel/module.c-o linux-34/kernel/module.c
--- linux-34/kernel/module.c-o 2004-01-09 09:27:20.000000000 +0100
+++ linux-34/kernel/module.c 2004-01-16 10:06:14.945574400 +0100
@@ -37,6 +37,9 @@
#include <asm/pgalloc.h>
#include <asm/cacheflush.h>

+extern void sort_extable(const struct exception_table_entry *start,
+ const struct exception_table_entry *end);
+
#if 0
#define DEBUGP printk
#else
@@ -1614,6 +1617,7 @@
/* Set up exception table */
mod->num_exentries = sechdrs[exindex].sh_size / sizeof(*mod->extable);
mod->extable = (void *)sechdrs[exindex].sh_addr;
+ sort_extable(mod->extable, mod->extable+mod->num_exentries);

/* Now do relocations. */
for (i = 1; i < hdr->e_shnum; i++) {
-
To unsubscribe from this list: send the line "unsubscribe linux-kernel" in
the body of a message to majordomo@xxxxxxxxxxxxxxx
More majordomo info at http://vger.kernel.org/majordomo-info.html
Please read the FAQ at http://www.tux.org/lkml/