| /* |
| * crt0 startup code for user programs running under Cygmon |
| * |
| * Copyright (c) 1998, 2000 Cygnus Support |
| * |
| * The authors hereby grant permission to use, copy, modify, distribute, |
| * and license this software and its documentation for any purpose, provided |
| * that existing copyright notices are retained in all copies and that this |
| * notice is included verbatim in any distributions. No written agreement, |
| * license, or royalty fee is required for any of the authorized uses. |
| * Modifications to this software may be copyrighted by their authors |
| * and need not follow the licensing terms described here, provided that |
| * the new terms are clearly indicated on the first page of each file where |
| * they apply. |
| */ |
| |
| #define _S2(P,X) P ## X |
| #define _S1(P,X) _S2(P,X) |
| #define SYM(X) _S1(__USER_LABEL_PREFIX__,X) |
| |
| .data |
| .align 8 |
| SYM(environ): |
| .long 0 |
| |
| SYM(argc): |
| .long 0 |
| |
| .text |
| .align 4 |
| |
| .globl __start |
| __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 |
| 1: |
| mov $0, %ebp |
| |
| movl $__bss_start, %edi |
| movl $__bss_end, %ecx |
| subl %edi, %ecx |
| xorl %eax, %eax |
| rep; stosb |
| |
| pushl $SYM(__sigtramp) |
| pushl $0 |
| call SYM(__install_signal_handler) |
| popl %eax |
| |
| pushl $SYM(__do_global_dtors) |
| call SYM(atexit) |
| popl %eax |
| |
| call SYM(__do_global_ctors) |
| |
| 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 |
| |
| /* 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 |
| call SYM(exit) |
| 3: |
| jmp 3b |