source: trunk/libs/newlib/src/libgloss/hp74x/crt0.s @ 546

Last change on this file since 546 was 444, checked in by satin@…, 6 years ago

add newlib,libalmos-mkh, restructure shared_syscalls.h and mini-libc

File size: 4.5 KB
Line 
1/*
2 * crt0.S -- startup file for hppa.
3 *              rob@cygnus.com (Rob Savoye)
4 */
5        .VERSION "0.2"
6        .COPYRIGHT "crt0.S for hppa"
7
8;sp      .equ    %r30                   ; stack pointer
9;dp      .equ    %r27                   ; global data pointer
10;arg0    .equ    %r26                   ; argument
11;arg1    .equ    %r25                   ; argument or high part of double argument
12;arg2    .equ    %r24                   ; argument
13;arg3    .equ    %r23                   ; argument or high part of double argument
14
15#define         IMM(a,b)        ldil L%a,b  ! ldo  R%a(b),b
16#define         imm(i,t)        ldil LS%i,t ! addi RS%i,t,t
17
18        .DATA
19
20/****
21 * FIXME: these are just a gross hack so this will assemble
22 ****/
23_bss_start      .WORD
24_bss_end        .WORD
25_foobar
26                .STRINGZ "Foo Bar...\r\n"
27
28;;_SYSTEM_ID    .WORD
29;;              .EXPORT _SYSTEM_ID      ; FIXME this is only so it'll
30                                        ; link
31       
32/*
33 * Set up the standard spaces (sections) These definitions come
34 * from /lib/pcc_prefix.s.
35 */
36        .space  $TEXT$,0
37       
38        .SUBSPA $BOOT$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=4
39        .IMPORT _start
40
41/*
42 * stuff we need that's defined elsewhere.
43 */
44        .IMPORT main, CODE
45        .IMPORT _bss_start, DATA
46        .IMPORT _bss_end, DATA
47        .IMPORT environ, DATA
48
49/*
50 * start -- set things up so the application will run.
51 *
52 */
53        .PROC
54        .CALLINFO SAVE_SP, FRAME=48
55        .EXPORT $START$,ENTRY
56$START$
57
58        /* FIXME: this writes to page zero */
59        ;; setup the %30 (stack pointer) with some memory
60        ldil    L%_stack+48,%r30
61        ldo     R%_stack+48(%r30),%r30          ; should be %r30 (sp) but then
62                                                ; we'd kill our test program :-)
63        ;; we need to set %r27 (global data pointer) here too
64        ldil    L%$global$,%r27
65        ldo     R%$global$(%r27),%r27           ; same problem as above
66
67/*
68 * zerobss -- zero out the bss section
69 */
70        ; load the start of bss
71        ldil    L%_bss_start,%r4
72        ldo     R%_bss_start(%r4),%r4
73
74        ;  load the end of bss
75        ldil    L%_bss_end,%r5
76        ldo     R%_bss_end(%r5),%r5
77
78
79bssloop
80        addi    -1,%r5,%r5                      ; decrement _bss_end
81        stb     %r0,0(0,%r5)                    ; we do this by bytes for now even
82                                                ; though it's slower, it's safer
83        combf,= %r4,%r5, bssloop       
84        nop
85       
86        ldi     1,%ret0
87
88/*
89 * Call the main routine from the application to get it going.
90 * main (argc, argv, environ)
91 * We pass argv as a pointer to NULL.
92 */
93
94        bl      main,%r2
95        nop
96
97        .PROCEND
98/*
99 * _exit -- Exit from the application. Normally we cause a user trap
100 *          to return to the ROM monitor for another run, but with
101 *          this monitor we can't. Still, "C" wants this symbol, it
102 *          should be here. Jumping to 0xF0000004 jumps back into the
103 *          firmware, while writing a 5 to 0xFFFE0030 causes a reset.
104 */
105        .EXPORT _exit, ENTRY
106_exit
107        .PROC
108        .CALLINFO
109        .ENTRY
110;;      ldil    L%0xf0000004,%r1
111;;      bl      %r1, %r2
112       
113        ldil    L'4026531844,%r19
114        ldo     R'4026531844(%r19),%r19
115        blr     %r19, %r2
116        nop
117       
118        ;; This just causes a breakpoint exception
119;;      break   0x0e,0xa5a
120;;      bv,n    (%rp)
121        nop
122        .EXIT
123        .PROCEND
124
125        .subspa $UNWIND_START$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=56
126        .export $UNWIND_START
127$UNWIND_START
128        .subspa $UNWIND$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=64
129        .subspa $UNWIND_END$,QUAD=0,ALIGN=8,ACCESS=0x2c,SORT=72
130        .export $UNWIND_END
131$UNWIND_END
132        .subspa $RECOVER_START$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=73
133        .export $RECOVER_START
134$RECOVER_START
135        .subspa $RECOVER$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=80
136        .subspa $RECOVER_END$,QUAD=0,ALIGN=4,ACCESS=0x2c,SORT=88
137        .export $RECOVER_END
138$RECOVER_END
139
140; The following declarations are, by default in the data space ($PRIVATE$)
141
142;;        .space  $PRIVATE$,1
143
144/*
145 * Here we set up the standard date sub spaces.
146 * _dp is for the WinBond board.
147 *
148 * Set up some room for a stack. We just grab a chunk of memory.
149 * We also setup some space for the global variable space, which
150 * must be done using the reserved name "$global$" so "C" code
151 * can find it. The stack grows towards the higher addresses.
152 */
153
154        .subspa $DATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=16
155        .subspa $SHORTDATA$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=24
156        .subspa $GLOBAL$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=40
157        .export $global$
158        .export _dp
159$global$
160_dp
161        .subspa $SHORTBSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=80,ZERO
162        .subspa $BSS$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=82,ZERO
163
164       .subspa $STACK$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=88,ZERO
165        .export _stack
166_stack
167        .BLOCK          0x2000
168
169/*
170 * The heap follows the stack. To use dynamic memory routines in an
171 * application, some space MUST be assigned to the stack.
172 */
173
174        .subspa $HEAP$,QUAD=1,ALIGN=8,ACCESS=0x1f,SORT=96,ZERO
175        .export _heap
176_heap
177        .end
Note: See TracBrowser for help on using the repository browser.