Welcome to mirror list, hosted at ThFree Co, Russian Federation.

crt0_cygmon.S « mips « libgloss - cygwin.com/git/newlib-cygwin.git - Unnamed repository; edit this file 'description' to name the repository.
summaryrefslogtreecommitdiff
blob: ae0a9e3732fe92fea130a81c0be3d366aaf5416c (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
/*
 * crt0_cygmon.S -- Minimal startup file for MIPS targets running Cygmon.
 *
 * Copyright (c) 1995, 1996, 1997, 2000 Red Hat, Inc.
 *
 * 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.
 */

/*
 * This file contains the minimal startup code necessary.
 * This will not do any hardware initialization.  It is assumed that we are talking to Cygmon
 * and therefore the hardware will be initialized properly.
 */

#ifdef __mips16
/* This file contains 32 bit assembly code.  */
	.set nomips16
#endif

#include "regs.S"

/*
 * Set up some room for a stack. We just grab a chunk of memory.
 */
#define STACK_SIZE  0x4000
#define GLOBAL_SIZE 0x2000

#define STARTUP_STACK_SIZE	0x0100

	.comm	__memsize, 12
	.comm	__lstack, STARTUP_STACK_SIZE
	.comm   __stackbase,4

	.text
	.align	4
    /*
     * Without the following nop, GDB thinks _start is a data variable.
     * This is probably a bug in GDB in handling a symbol that is at the
     * start of the .text section.
     */
	nop

	.globl	_start
	.ent	_start
_start:
	.set	noreorder
	la		gp, _gp					# set the global data pointer, defined in the linker script
	.end	_start

    /*
     * zero out the bss section.
     */
	.globl	__memsize
	.globl	get_mem_info .text
	.globl	zerobss
	.ent	zerobss
zerobss:
	la		v0, _fbss				# These variables are defined in the linker script
	la		v1, _end

3:
	sw		zero, 0(v0)
	bltu	v0, v1, 3b
	addiu	v0, v0, 4				# executed in delay slot

    /*
     * Setup a small stack so we can run some C code,
     * and get the usable memory size.
     */
	la		t0, __lstack
	addiu	sp, t0, STARTUP_STACK_SIZE
	la		a0, __memsize
	jal		get_mem_info
	nop

	/*
     * Setup the stack pointer -- 
     *    get_mem_info returns the top of memory, so just use that In
     *    addition, we must subtract 24 bytes for the 3 8 byte
     *    arguments to main, in case main wants to write them back to
     *    the stack.  The caller is supposed to allocate stack space
     *    for parameters in registers in the old MIPS ABIs.  We must
     *    do this even though we aren't passing arguments, because
     *    main might be declared to have them.
	 *    Some ports need a larger alignment for the stack, so we
	 *    subtract 32, which satisifes the stack for the arguments and
	 *    keeps the stack pointer better aligned.
     */
	subu	v0, v0, 32
	move	sp, v0

	sw		sp, __stackbase			# keep this for future ref
	.end	zerobss

    /*
     * initialize target specific stuff. Only execute these
     * functions it they exist.
     */
	.globl	hardware_init_hook .text
	.globl	software_init_hook .text
	.globl	__do_global_dtors .text
	.globl	atexit .text
	.globl	exit .text
	.globl	init
	.ent	init
init:
	la		t9, hardware_init_hook	# init the hardware if needed
	beq		t9, zero, 6f
	nop
	jal		t9
	nop
6:
	la		t9, software_init_hook	# init the software if needed
	beq		t9, zero, 7f
	nop
	jal		t9
	nop
7:
	la		a0, __do_global_dtors
	jal		atexit
	nop

#ifdef GCRT0
	.globl	_ftext
	.globl	_extext
	la		a0, _ftext
	la		a1, _etext
	jal		monstartup
	nop
#endif

	move	a0,zero					# set argc to 0
	jal		main					# call the program start function
	nop

	# fall through to the "exit" routine
	jal		exit					# call libc exit to run the G++
									# destructors
	move	a0, v0					# pass through the exit code
	.end	init
	
/*
 * _exit -- Exit from the application. Normally we cause a user trap
 *          to return to the ROM monitor for another run. NOTE: This is
 *          the only other routine we provide in the crt0.o object, since
 *          it may be tied to the "_start" routine. It also allows
 *          executables that contain a complete world to be linked with
 *          just the crt0.o object.
 */
	.globl	_exit
	.ent	_exit
_exit:
7:
#ifdef GCRT0
	jal		_mcleanup
	nop
#endif
	# Cygmon expects a break 5
	break	5
	nop
	b		7b						# loop back just in-case
	nop
	.end	_exit

/* EOF crt0.S */