[patch 1/1] uml: fix oops related to exception table [for 2.6.12, urgent]

From: blaisorblade
Date: Mon Apr 25 2005 - 13:38:57 EST

From: Jeff Dike <jdike@xxxxxxxxxxx>, Paolo 'Blaisorblade' Giarrusso <blaisorblade@xxxxxxxx>

In short: avoid that the kernel oopses during the extable sorting, as it can
do now, because the extable is in the readonly section of the binary.

>From Jeff: The exception table turned RO in 2.6.11-rc3-mm1 for some reason.
Moving it causes it to land in the writable data section of the binary.

>From Paolo: This patch fixes a oops on startup, which can be easily triggered
by compiling with CONFIG_MODE_TT disabled, and STATIC_LINK either disabled or
enabled. The resulting kernel will always Oops on startup, after printing this
simple output:

Checking for /proc/mm...found
Checking for the skas3 patch in the host...found
Checking PROT_EXEC mmap in /tmp...OK

Debugging shows that it's a SIGSEGV during the extable sorting, which is
caused by the fact that the table is in the read-only section of the binary.

The oops is a 2.6.11-bk7 (more or less) regression, which I already reported
on uml-devel. In fact, the original patch had already been totally dropped
because it seemed useless. Also, I don't know why the moved section becomes
writable, actually. And on i386 the current layout is like the one we have
*before* this patch. Still, it does fix the problem for me.

I've verified, by binary search on the BitKeeper repository (synced up as of
2.6.12-rc2), starting from the range 2.6.11-2.6.12-rc1, that this bug shows up
on BitKeeper revisions in the range [@1.1994.11.168,+inf), i.e. starting from

[PATCH] lib/sort: Replace insertion sort in exception tables

Since UML does not use the exception table, it's likely that insertion sort
didn't happen to write anything on the table.

$ bk prs -d':KEY: :MD5KEY:\n' -r@xxxxxxxxxxxxx ChangeSet
======== ChangeSet 1.1994.11.168 ========

(the 2nd thing ought to be the unique hex key for the changeset).

Signed-off-by: Paolo 'Blaisorblade' Giarrusso <blaisorblade@xxxxxxxx>

linux-2.6.12-paolo/include/asm-um/common.lds.S | 9 ++++-----
1 files changed, 4 insertions(+), 5 deletions(-)

diff -puN include/asm-um/common.lds.S~uml-exception-table-oops-fix include/asm-um/common.lds.S
--- linux-2.6.12/include/asm-um/common.lds.S~uml-exception-table-oops-fix 2005-04-25 20:22:38.000000000 +0200
+++ linux-2.6.12-paolo/include/asm-um/common.lds.S 2005-04-25 20:22:38.000000000 +0200
@@ -8,11 +8,6 @@
_sdata = .;
PROVIDE (sdata = .);

- . = ALIGN(16); /* Exception table */
- __start___ex_table = .;
- __ex_table : { *(__ex_table) }
- __stop___ex_table = .;

.unprotected : { *(.unprotected) }
@@ -20,6 +15,10 @@
PROVIDE (_unprotected_end = .);

. = ALIGN(4096);
+ __start___ex_table = .;
+ __ex_table : { *(__ex_table) }
+ __stop___ex_table = .;
__uml_setup_start = .;
.uml.setup.init : { *(.uml.setup.init) }
__uml_setup_end = .;
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/