source: trunk/libs/newlib/src/libgloss/mt/crt0-64-001.S @ 684

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

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

File size: 3.4 KB
Line 
1; crt0_2.s - Startup code for the mrisc1. This code initializes the C
2;              run-time model.
3;
4; 12Nov01 (DJK) - The return code from main was not being passed to exit().
5;                   Now it is passed as a parameter in R1.
6;
7; 10Sep01 (DJK) - The function exit() does not return. However, in the
8;                   the case of device error (if the halt bit does not
9;                   function properly, for instance), then a catch loop
10;                   has been added.
11;
12;
13; Copyright 2001, 2002, 2003, 2004 Morpho Technologies, Inc.
14;
15
16        ; Create a label for the start of the eh_frame section.
17        .section .eh_frame
18__eh_frame_begin:
19
20        .equ    HALT_REG, 0x300
21        .section .text
22        .global _start
23_start:
24        ;; Initialize the stack pointer
25        ldui    sp, #%hi16(__stack)
26        addui   sp, sp, #%lo16(__stack)
27        or      fp, sp, sp
28
29        ;; Copy data from ROM to Frame Buffer (on-chip memory)
30        ldui    r9, #%hi16(_fbdata_start)
31        ori     r9, r9, #%lo16(_fbdata_start)
32        ldui    r10, #%hi16(_fbdata_end)
33        ori     r10, r10, #%lo16(_fbdata_end)
34        ldui    r11, #%hi16(__FRAME_BUFFER_START)
35        brle    r10, r9, .Lnext1
36        ori     r11, r11, #%lo16(__FRAME_BUFFER_START)
37.Lcpy0:
38        ldw     r5, r9, #$0
39        addi    r9, r9, #$4
40        stw     r5, r11, #$0
41        brlt    r9, r10, .Lcpy0
42        addi    r11, r11, #$4
43
44.Lnext1:
45        ;; Copy data from ROM to External Memory (off-chip memory)
46        ldui    r9, #%hi16(_extdata_start)
47        ori     r9, r9, #%lo16(_extdata_start)
48        ldui    r10, #%hi16(_extdata_end)
49        ori     r10, r10, #%lo16(_extdata_end)
50        ldui    r11, #%hi16(__EXTERNAL_MEMORY_START)
51        brle    r10, r9, .Lnext2
52        ori     r11, r11, #%lo16(__EXTERNAL_MEMORY_START)
53.Lcpy1:
54        ldw     r5, r9, #$0
55        addi    r9, r9, #$4
56        stw     r5, r11, #$0
57        brlt    r9, r10, .Lcpy1
58        addi    r11, r11, #$4
59
60
61.Lnext2:
62        ;; Zero the bss space
63        ldui    r9, #%hi16(__bss_start)
64        addui   r9, r9, #%lo16(__bss_start)
65        ldui    r10, #%hi16(__bss_end)
66        addui   r10, r10, #%lo16(__bss_end)
67        or      r0, r0, r0
68        brle    r10, r9, .Lnext3
69        or      r0, r0, r0
70.Lcpy2:
71        stw     r0, r9, #0
72        addi    r9, r9, #4
73        or      r0, r0, r0      ; nop
74        brle    r9, r10, .Lcpy2
75        or      r0, r0, r0      ; nop
76
77.Lnext3:
78        ;; Zero the external memory bss section
79        ldui    r9, #%hi16(_extbss_start)
80        ori     r9, r9, #%lo16(_extbss_start)
81        ldui    r10, #%hi16(_extbss_end)
82        ori     r10, r10, #%lo16(_extbss_end)
83        or      r0, r0, r0
84        brle    r10, r9, .Lnext4
85        or      r0, r0, r0
86.Lcpy3:
87        stw     r0, r9, #$0
88        addi    r9, r9, #$4
89        or      r0, r0, r0
90        brle    r9, r10, .Lcpy3
91        or      r0, r0, r0
92
93.Lnext4:
94        ;; Call global and static constructors
95        ldui    r10, #%hi16(_init)
96        ori     r10, r10, #%lo16(_init)
97        or      r0, r0, r0      ; nop
98        jal     r14, r10
99        or      r0, r0, r0      ; nop
100
101        ;;  Setup destructors to be called from exit.
102        ;;  (Just in case main never returns....)
103        ldui    r10, #%hi16(atexit)
104        ori     r10, r10, #%lo16(atexit)
105        ldui    r1, #%hi16(_fini)
106        ori     r1, r1, #%lo16(_fini)
107        or      r0, r0, r0      ; nop
108        jal     r14, r10
109        or      r0, r0, r0      ; nop
110
111        ;;  Initialise argc, argv and envp to empty
112        addi    r1, r0, #0
113        addi    r2, r0, #0
114        addi    r3, r0, #0
115
116        ;; Call main
117        ldui    r10, #%hi16(main)
118        ori     r10, r10, #%lo16(main)
119        or      r0, r0, r0      ; nop
120        jal     r14, r10
121        or      r0, r0, r0      ; nop
122
123        ;; DJK - Added 12Nov01. Pass main's return value to exit.
124        or      r1, r11, r0
125
126        ;; Jump to exit
127        ldui    r10, #%hi16(exit)
128        ori     r10, r10, #%lo16(exit)
129        or      r0, r0, r0      ; nop
130        jal     r14, r10
131        or      r0, r0, r0      ; nop
132
133        ;; Exit does not return, however, this code is to catch an
134        ;;   error if it does. Set the processor into sleep mode.
135        ori     r1, r0, #$1
136        stw     r1, r0, #HALT_REG
137        or      r0, r0, r0
138        or      r0, r0, r0
139        or      r0, r0, r0
140        or      r0, r0, r0
141        or      r0, r0, r0
142.Lend:
143        jmp .Lend
144        or      r0, r0, r0
Note: See TracBrowser for help on using the repository browser.