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 | |
---|