[BZ #1253]
2005-10-16 Roland McGrath <roland@frob.com> [BZ #1253] * sysdeps/mach/hurd/i386/init-first.c (init): Make cast kosher. (_hurd_stack_setup): Don't declare with arguments and ellipsis. Use __builtin_frame_address and __builtin_return_address. (_dl_init_first): Likewise. * sysdeps/mach/hurd/i386/init-first.c (_cthread_init_routine): Declare as weak extern. (init): Check for it being undefined.
This commit is contained in:
parent
fc8e9f0027
commit
133bf22efa
12
ChangeLog
12
ChangeLog
|
@ -1,3 +1,15 @@
|
||||||
|
2005-10-16 Roland McGrath <roland@frob.com>
|
||||||
|
|
||||||
|
[BZ #1253]
|
||||||
|
* sysdeps/mach/hurd/i386/init-first.c (init): Make cast kosher.
|
||||||
|
(_hurd_stack_setup): Don't declare with arguments and ellipsis.
|
||||||
|
Use __builtin_frame_address and __builtin_return_address.
|
||||||
|
(_dl_init_first): Likewise.
|
||||||
|
|
||||||
|
* sysdeps/mach/hurd/i386/init-first.c (_cthread_init_routine): Declare
|
||||||
|
as weak extern.
|
||||||
|
(init): Check for it being undefined.
|
||||||
|
|
||||||
2005-10-16 Daniel Jacobowitz <dan@codesourcery.com>
|
2005-10-16 Daniel Jacobowitz <dan@codesourcery.com>
|
||||||
Roland McGrath <roland@redhat.com>
|
Roland McGrath <roland@redhat.com>
|
||||||
|
|
||||||
|
|
|
@ -1,5 +1,6 @@
|
||||||
/* Initialization code run first thing by the ELF startup code. For i386/Hurd.
|
/* Initialization code run first thing by the ELF startup code. For i386/Hurd.
|
||||||
Copyright (C) 1995,96,97,98,99,2000,01,02,03,04 Free Software Foundation, Inc.
|
Copyright (C) 1995,96,97,98,99,2000,01,02,03,04,05
|
||||||
|
Free Software Foundation, Inc.
|
||||||
This file is part of the GNU C Library.
|
This file is part of the GNU C Library.
|
||||||
|
|
||||||
The GNU C Library is free software; you can redistribute it and/or
|
The GNU C Library is free software; you can redistribute it and/or
|
||||||
|
@ -54,7 +55,7 @@ extern int __libc_argc attribute_hidden;
|
||||||
extern char **__libc_argv attribute_hidden;
|
extern char **__libc_argv attribute_hidden;
|
||||||
extern char **_dl_argv;
|
extern char **_dl_argv;
|
||||||
|
|
||||||
void *(*_cthread_init_routine) (void); /* Returns new SP to use. */
|
extern void *(*_cthread_init_routine) (void) __attribute__ ((weak));
|
||||||
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
void (*_cthread_exit_routine) (int status) __attribute__ ((__noreturn__));
|
||||||
|
|
||||||
/* Things that want to be run before _hurd_init or much anything else.
|
/* Things that want to be run before _hurd_init or much anything else.
|
||||||
|
@ -203,7 +204,7 @@ init (int *data)
|
||||||
code as the return address, and the argument data immediately above
|
code as the return address, and the argument data immediately above
|
||||||
that on the stack. */
|
that on the stack. */
|
||||||
|
|
||||||
if (_cthread_init_routine)
|
if (&_cthread_init_routine && _cthread_init_routine)
|
||||||
{
|
{
|
||||||
/* Initialize cthreads, which will allocate us a new stack to run on. */
|
/* Initialize cthreads, which will allocate us a new stack to run on. */
|
||||||
int *newsp = (*_cthread_init_routine) ();
|
int *newsp = (*_cthread_init_routine) ();
|
||||||
|
@ -271,7 +272,7 @@ init (int *data)
|
||||||
/* The argument data is just above the stack frame we will unwind by
|
/* The argument data is just above the stack frame we will unwind by
|
||||||
returning. Mutate our own return address to run the code below. */
|
returning. Mutate our own return address to run the code below. */
|
||||||
usercode = data[-1];
|
usercode = data[-1];
|
||||||
((void **) data)[-1] = call_init1;
|
data[-1] = (int) &call_init1;
|
||||||
/* Force USERCODE into %eax and &init1 into %ecx, which are not
|
/* Force USERCODE into %eax and &init1 into %ecx, which are not
|
||||||
restored by function return. */
|
restored by function return. */
|
||||||
asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1));
|
asm volatile ("# a %0 c %1" : : "a" (usercode), "c" (&init1));
|
||||||
|
@ -319,11 +320,11 @@ first_init (void)
|
||||||
stack set up just as the user will see it, so it can switch stacks. */
|
stack set up just as the user will see it, so it can switch stacks. */
|
||||||
|
|
||||||
void
|
void
|
||||||
_dl_init_first (int argc, ...)
|
_dl_init_first (void)
|
||||||
{
|
{
|
||||||
first_init ();
|
first_init ();
|
||||||
|
|
||||||
init (&argc);
|
init ((int *) __builtin_frame_address (0) + 2);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -350,21 +351,23 @@ strong_alias (posixland_init, __libc_init_first);
|
||||||
This poorly-named function is called by static-start.S,
|
This poorly-named function is called by static-start.S,
|
||||||
which should not exist at all. */
|
which should not exist at all. */
|
||||||
void
|
void
|
||||||
_hurd_stack_setup (volatile int argc, ...)
|
_hurd_stack_setup (void)
|
||||||
{
|
{
|
||||||
|
intptr_t caller = (intptr_t) __builtin_return_address (0);
|
||||||
|
|
||||||
void doinit (intptr_t *data)
|
void doinit (intptr_t *data)
|
||||||
{
|
{
|
||||||
/* This function gets called with the argument data at TOS. */
|
/* This function gets called with the argument data at TOS. */
|
||||||
void doinit1 (volatile int argc, ...)
|
void doinit1 (void)
|
||||||
{
|
{
|
||||||
init ((int *) &argc);
|
init ((int *) __builtin_frame_address (0) + 2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Push the user return address after the argument data, and then
|
/* Push the user return address after the argument data, and then
|
||||||
jump to `doinit1' (above), so it is as if __libc_init_first's
|
jump to `doinit1' (above), so it is as if __libc_init_first's
|
||||||
caller had called `doinit1' with the argument data already on the
|
caller had called `doinit1' with the argument data already on the
|
||||||
stack. */
|
stack. */
|
||||||
*--data = (&argc)[-1];
|
*--data = caller;
|
||||||
asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack. */
|
asm volatile ("movl %0, %%esp\n" /* Switch to new outermost stack. */
|
||||||
"movl $0, %%ebp\n" /* Clear outermost frame pointer. */
|
"movl $0, %%ebp\n" /* Clear outermost frame pointer. */
|
||||||
"jmp *%1" : : "r" (data), "r" (&doinit1) : "sp");
|
"jmp *%1" : : "r" (data), "r" (&doinit1) : "sp");
|
||||||
|
@ -373,7 +376,7 @@ _hurd_stack_setup (volatile int argc, ...)
|
||||||
|
|
||||||
first_init ();
|
first_init ();
|
||||||
|
|
||||||
_hurd_startup ((void **) &argc, &doinit);
|
_hurd_startup ((void **) __builtin_frame_address (0) + 2, &doinit);
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
Loading…
Reference in New Issue