2000-03-18 06:48:54 +08:00
|
|
|
/*
|
|
|
|
* crt0 startup code for user programs running under Cygmon
|
|
|
|
*
|
2002-10-26 03:18:46 +08:00
|
|
|
* Copyright (c) 1998, 2000 Cygnus Support
|
2000-03-18 06:48:54 +08:00
|
|
|
*
|
|
|
|
* 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.
|
|
|
|
*/
|
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
#define _S2(P,X) P ## X
|
|
|
|
#define _S1(P,X) _S2(P,X)
|
|
|
|
#define SYM(X) _S1(__USER_LABEL_PREFIX__,X)
|
2000-03-18 06:48:54 +08:00
|
|
|
|
|
|
|
.data
|
|
|
|
.align 8
|
|
|
|
SYM(environ):
|
|
|
|
.long 0
|
|
|
|
|
|
|
|
SYM(argc):
|
|
|
|
.long 0
|
|
|
|
|
|
|
|
.text
|
|
|
|
.align 4
|
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
.globl __start
|
|
|
|
__start:
|
2000-03-18 06:48:54 +08:00
|
|
|
/* see if the stack is already setup. if not, then default
|
|
|
|
* to using the value of %sp as set by the ROM monitor
|
|
|
|
*/
|
2002-10-26 03:18:46 +08:00
|
|
|
movl $__stack, %eax
|
|
|
|
testl %eax, %eax
|
|
|
|
jz 1f
|
|
|
|
movl %eax, %esp
|
2000-03-18 06:48:54 +08:00
|
|
|
1:
|
|
|
|
mov $0, %ebp
|
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
movl $__bss_start, %edi
|
|
|
|
movl $__bss_end, %ecx
|
|
|
|
subl %edi, %ecx
|
|
|
|
xorl %eax, %eax
|
|
|
|
rep; stosb
|
2000-03-18 06:48:54 +08:00
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
pushl $SYM(__sigtramp)
|
|
|
|
pushl $0
|
|
|
|
call SYM(__install_signal_handler)
|
|
|
|
popl %eax
|
2000-03-18 06:48:54 +08:00
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
pushl $SYM(__do_global_dtors)
|
|
|
|
call SYM(atexit)
|
|
|
|
popl %eax
|
2000-03-18 06:48:54 +08:00
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
call SYM(__do_global_ctors)
|
2000-03-18 06:48:54 +08:00
|
|
|
|
2002-10-26 03:18:46 +08:00
|
|
|
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
|
2000-03-18 06:48:54 +08:00
|
|
|
|
|
|
|
/* 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.
|
|
|
|
*/
|
2002-10-26 03:18:46 +08:00
|
|
|
pushl %eax
|
2000-03-18 06:48:54 +08:00
|
|
|
call SYM(exit)
|
|
|
|
3:
|
2002-10-26 03:18:46 +08:00
|
|
|
jmp 3b
|