1/* crt0.S -- startup file for hppa.
2 *
3 * Copyright (c) 1995 Cygnus Support
4 *
5 * The authors hereby grant permission to use, copy, modify, distribute,
6 * and license this software and its documentation for any purpose, provided
7 * that existing copyright notices are retained in all copies and that this
8 * notice is included verbatim in any distributions. No written agreement,
9 * license, or royalty fee is required for any of the authorized uses.
10 * Modifications to this software may be copyrighted by their authors
11 * and need not follow the licensing terms described here, provided that
12 * the new terms are clearly indicated on the first page of each file where
13 * they apply.
14 */
15	.VERSION "1.0"
16	.COPYRIGHT "crt0.o for the PA"
17
18	.DATA
19
20/*
21 * Set up the standard spaces (sections) These definitions come
22 * from /lib/pcc_prefix.s.
23 */
24	.TEXT
25
26/*
27 * stuff we need that's defined elsewhere.
28 */
29	.IMPORT main, CODE
30	.IMPORT exit, CODE
31	.IMPORT _bss_start, DATA
32	.IMPORT _end, DATA
33	.IMPORT environ, DATA
34
35/*
36 * start -- set things up so the application will run.
37 *
38 */
39        .PROC
40        .CALLINFO SAVE_SP, FRAME=48
41        .EXPORT $START$,ENTRY
42$START$
43
44	/* FIXME: this writes to page zero */
45	;; setup the %30 (stack pointer) with some memory
46	ldil 	L%_stack,%r30
47        ldo 	R%_stack(%r30),%r30
48
49	;; we need to set %r27 (global data pointer) here too
50	ldil 	L%$global$,%r27
51        ldo 	R%$global$(%r27),%r27		; same problem as above
52
53/*
54 * zerobss -- zero out the bss section
55 */
56	; load the start of bss
57	ldil 	L%_bss_start,%r4
58        ldo 	R%_bss_start(%r4),%r4
59
60	;  load the end of bss
61	ldil 	L%_end,%r5
62        ldo 	R%_end(%r5),%r5
63
64
65L$bssloop
66	addi	-1,%r5,%r5			; decrement _bss_end
67	stb	%r0,0(0,%r5)			; we do this by bytes for now even
68						; though it's slower, it's safer
69	combf,=	%r4,%r5, L$bssloop
70	nop
71
72	ldi	1,%ret0
73
74/*
75 * Call the main routine from the application to get it going.
76 * main (argc, argv, environ)
77 * We pass argv as a pointer to NULL.
78 */
79
80	ldil	L%main,%r22
81	ble 	R%main(%sr4,%r22)
82	copy	%r31,%r2
83/*
84 * Call exit() from the C library with the return value from main()
85 */
86	copy	%r28,%r26
87	ldil	L%exit,%r22
88	ble	R%exit(%sr4,%r22)
89	copy	%r31,%r2
90
91        .PROCEND
92/*
93 * _exit -- Exit from the application. Normally we cause a user trap
94 * 	    to return to the ROM monitor for another run.
95 */
96	.EXPORT _exit, ENTRY
97_exit
98	.PROC
99	.CALLINFO
100	.ENTRY
101
102	;; This just causes a breakpoint exception
103	break	0x0,0x0
104        bv,n    (%rp)
105	nop
106	.EXIT
107	.PROCEND
108
109/*
110 * _sr4export -- support for called functions. (mostly for GDB)
111 */
112	.EXPORT _sr4export, ENTRY
113_sr4export:
114	.PROC
115	.CALLINFO
116	.ENTRY
117
118	ble	0(%sr4,%r22)
119	copy	%r31,%rp
120	ldw	-24(%sr0,%sp),%rp
121	ldsid	(%sr0,%rp),%r1
122	mtsp	%r1,%sr0
123	be,n	0(%sr0,%rp)
124	nop
125	.EXIT
126	.PROCEND
127
128
129