1/* 2 * crt0 startup code for user programs running under Cygmon 3 * 4 * Copyright (c) 1998, 2000 Cygnus Support 5 * 6 * The authors hereby grant permission to use, copy, modify, distribute, 7 * and license this software and its documentation for any purpose, provided 8 * that existing copyright notices are retained in all copies and that this 9 * notice is included verbatim in any distributions. No written agreement, 10 * license, or royalty fee is required for any of the authorized uses. 11 * Modifications to this software may be copyrighted by their authors 12 * and need not follow the licensing terms described here, provided that 13 * the new terms are clearly indicated on the first page of each file where 14 * they apply. 15 */ 16 17#define _S2(P,X) P ## X 18#define _S1(P,X) _S2(P,X) 19#define SYM(X) _S1(__USER_LABEL_PREFIX__,X) 20 21.data 22 .align 8 23SYM(environ): 24 .long 0 25 26SYM(argc): 27 .long 0 28 29 .text 30 .align 4 31 32 .globl __start 33__start: 34 /* see if the stack is already setup. if not, then default 35 * to using the value of %sp as set by the ROM monitor 36 */ 37 movl $__stack, %eax 38 testl %eax, %eax 39 jz 1f 40 movl %eax, %esp 411: 42 mov $0, %ebp 43 44 movl $__bss_start, %edi 45 movl $__bss_end, %ecx 46 subl %edi, %ecx 47 xorl %eax, %eax 48 rep; stosb 49 50 pushl $SYM(__sigtramp) 51 pushl $0 52 call SYM(__install_signal_handler) 53 popl %eax 54 55 pushl $SYM(__do_global_dtors) 56 call SYM(atexit) 57 popl %eax 58 59 call SYM(__do_global_ctors) 60 61 pushl $SYM(argc) 62 call SYM(__get_program_arguments) 63 popl %ecx 64 65 movl SYM(argc), %ecx 66 pushl %eax 67 pushl %ecx 68 call SYM(main) 69 popl %ecx 70 popl %edx 71 72 /* call exit from the C library so atexit gets called, and the 73 * C++ destructors get run. This calls our exit routine below 74 * when it's done. 75 */ 76 pushl %eax 77 call SYM(exit) 783: 79 jmp 3b 80