diff options
Diffstat (limited to 'libgloss/i386/cygmon-crt0.S')
-rw-r--r-- | libgloss/i386/cygmon-crt0.S | 73 |
1 files changed, 38 insertions, 35 deletions
diff --git a/libgloss/i386/cygmon-crt0.S b/libgloss/i386/cygmon-crt0.S index 1c4535e07..9be020917 100644 --- a/libgloss/i386/cygmon-crt0.S +++ b/libgloss/i386/cygmon-crt0.S @@ -1,7 +1,7 @@ /* * crt0 startup code for user programs running under Cygmon * - * Copyright (c) 1998, 2000 Cygnus Support + * Copyright (c) 1998 Cygnus Support * * The authors hereby grant permission to use, copy, modify, distribute, * and license this software and its documentation for any purpose, provided @@ -14,9 +14,11 @@ * they apply. */ -#define _S2(P,X) P ## X -#define _S1(P,X) _S2(P,X) -#define SYM(X) _S1(__USER_LABEL_PREFIX__,X) +#ifndef NEED_UNDERSCORE +#define SYM(X) X +#else +#define SYM(X) _ ## X +#endif .data .align 8 @@ -29,51 +31,52 @@ SYM(argc): .text .align 4 - .globl __start -__start: + .globl SYM(_start) +SYM(_start): /* see if the stack is already setup. if not, then default * to using the value of %sp as set by the ROM monitor */ - movl $__stack, %eax - testl %eax, %eax - jz 1f - movl %eax, %esp + lea __stack,%eax + cmpl $0,%eax + jz 1f + mov %eax, %esp 1: mov $0, %ebp - movl $__bss_start, %edi - movl $__bss_end, %ecx - subl %edi, %ecx - xorl %eax, %eax - rep; stosb + lea __bss_start, %eax +2: + movb $0,(%eax) + inc %eax + cmp $__bss_end,%eax + jl 2b + +2: + pushl $SYM(__sigtramp) + pushl $0 + call SYM(__install_signal_handler) + add $4, %esp - pushl $SYM(__sigtramp) - pushl $0 - call SYM(__install_signal_handler) - popl %eax + pushl $SYM(__do_global_dtors) + call SYM(atexit) + add $4, %esp - pushl $SYM(__do_global_dtors) - call SYM(atexit) - popl %eax + call SYM(__do_global_ctors) - call SYM(__do_global_ctors) + pushl $SYM(argc) + call SYM(__get_program_arguments) + add $4, %esp - pushl $SYM(argc) - call SYM(__get_program_arguments) - popl %ecx - - movl SYM(argc), %ecx - pushl %eax - pushl %ecx - call SYM(main) - popl %ecx - popl %edx + pushl %eax + lea SYM(argc), %ebx + pushl (%ebx) + call SYM(main) + add $8, %esp /* call exit from the C library so atexit gets called, and the * C++ destructors get run. This calls our exit routine below * when it's done. */ - pushl %eax + pushl %eax call SYM(exit) 3: - jmp 3b + jmp 3b |