[HURD, PATCH] Fix stack switching at initialization time
Thomas Schwinge
thomas@schwinge.name
Fri Sep 16 19:08:00 GMT 2011
Hi!
Is this beast ever going to die...
On Fri, 22 Jul 2011 17:53:12 +0200, ludo@gnu.org wrote:
> Pushed a slightly different version, thanks!
>
> http://git.savannah.gnu.org/cgit/hurd/glibc.git/commit/?h=t/init-first.c&id=53b56b1101fc9bb4f295f23f54e7e19f8da8da16
Just a heads-up, and I'm afraid, but with this patch I get:
$ ./testrun.sh ./libc.so
Segmentation fault
Undoing it (see below), I'm back in service:
$ ./testrun.sh ./libc.so
GNU C Library development release version 2.11.90, by Roland McGrath et al.
[...]
This is still based on 2010-04 glibc sources, GCC 4.4, and old binutils
2.20.1.
Perhaps it'd really be best to write this in a few lines of assembly?
Undo patch:
diff --git a/sysdeps/mach/hurd/i386/init-first.c b/sysdeps/mach/hurd/i386/init-first.c
index caf65bb..7d93638 100644
--- a/sysdeps/mach/hurd/i386/init-first.c
+++ b/sysdeps/mach/hurd/i386/init-first.c
@@ -257,8 +257,8 @@ init (int *data)
/* Push the user code address on the top of the new stack. It will
be the return address for `init1'; we will jump there with NEWSP
as the stack pointer. */
- *--newsp = __builtin_return_address (0);
- * ((void **) __builtin_frame_address (0) + 1) = &switch_stacks;
+ *--newsp = data[-1];
+ data[-1] = (int) &switch_stacks;
/* Force NEWSP into %eax and &init1 into %ecx, which are not restored
by function return. */
asm volatile ("# a %0 c %1" : : "a" (newsp), "c" (&init1));
@@ -286,8 +286,8 @@ init (int *data)
/* The argument data is just above the stack frame we will unwind by
returning. Mutate our own return address to run the code below. */
- usercode = __builtin_return_address (0);
- * ((void **) __builtin_frame_address (0) + 1) = &call_init1;
+ usercode = data[-1];
+ data[-1] = (int) &call_init1;
/* Force USERCODE into %eax and &init1 into %ecx, which are not
restored by function return. */
asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1));
Grüße,
Thomas
-------------- next part --------------
A non-text attachment was scrubbed...
Name: not available
Type: application/pgp-signature
Size: 489 bytes
Desc: not available
URL: <http://sourceware.org/pipermail/libc-alpha/attachments/20110916/29c069e2/attachment.sig>
More information about the Libc-alpha
mailing list