OSDN Git Service

2007-06-20 Patrick Mansfield <patmans@us.ibm.com>
[pf3gnuchains/pf3gnuchains3x.git] / libgloss / pa / crt0.S
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
65 L$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