annotate packages/hal/sparclite/arch/current/src/hal_boot.c @ 66:bf00f99aec69 ecos-sw-2000-02-02

Merge from eCos master repository on 2000-02-02-19:16:44-GMT
author jlarmour
date Wed, 02 Feb 2000 19:57:02 +0000
parents c38311975d4f
children da3908c9cd10
Ignore whitespace changes - Everywhere: Within whitespace: At end of lines:
rev   line source
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
1 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
2 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
3 // hal_boot.c
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
4 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
5 // SPARClite Architecture specific interrupt dispatch tables
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
6 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
7 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
8 //####COPYRIGHTBEGIN####
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
9 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
10 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
11 // The contents of this file are subject to the Red Hat eCos Public License
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
12 // Version 1.1 (the "License"); you may not use this file except in
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
14 // http://www.redhat.com/
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
15 //
66
bf00f99aec69 Merge from eCos master repository on 2000-02-02-19:16:44-GMT
jlarmour
parents: 64
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
64
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
18 // License for the specific language governing rights and limitations under
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
19 // the License.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
20 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
21 // The Original Code is eCos - Embedded Configurable Operating System,
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
22 // released September 30, 1998.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
23 //
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
24 // The Initial Developer of the Original Code is Red Hat.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
25 // Portions created by Red Hat are
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
26 // Copyright (C) 1998, 1999, 2000 Red Hat, Inc.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
27 // All Rights Reserved.
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
28 // -------------------------------------------
c38311975d4f Merge from eCos master repository on 2000-01-28-04:28:11-GMT
jlarmour
parents: 12
diff changeset
29 //
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
31 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
32 //#####DESCRIPTIONBEGIN####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Author(s): hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Contributors: hmt
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Date: 1998-12-10
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 // Purpose: Interrupt handler tables for SPARClite.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
40 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
41 //==========================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
42
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 #include <cyg/infra/cyg_type.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 /*------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 /* calling this is our raison d'etre: */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48 extern void cyg_start( void );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 /*------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51 /* data copy and bss zero functions */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 typedef void (CYG_ROM_ADDRESS)(void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
54
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
55 #ifdef CYG_HAL_STARTUP_ROM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 void hal_copy_data(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 extern char __ram_data_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 extern char __ram_data_end;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 extern CYG_ROM_ADDRESS __rom_data_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61 long *p = (long *)&__ram_data_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 long *q = (long *)&__rom_data_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64 while( p <= (long *)&__ram_data_end )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 *p++ = *q++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69 void hal_zero_bss(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
70 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
71 extern CYG_ROM_ADDRESS __bss_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 extern CYG_ROM_ADDRESS __bss_end;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
73
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
74 register long long zero = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 register long long *end = (long long *)&__bss_end;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76 register long long *p = (long long *)&__bss_start;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 while( p <= end )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 *p++ = zero;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
81
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
82 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 cyg_bool cyg_hal_stop_constructors;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 void
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87 cyg_hal_invoke_constructors (void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 typedef void (*pfunc) (void);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 extern pfunc __CTOR_LIST__[];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 extern pfunc __CTOR_END__[];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
92
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
93 #ifdef CYGSEM_HAL_STOP_CONSTRUCTORS_ON_FLAG
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 static pfunc *p = &__CTOR_END__[-1];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96 cyg_hal_stop_constructors = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 for (; p >= __CTOR_LIST__; p--) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 (*p) ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 if (cyg_hal_stop_constructors) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 p--;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 break;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
102 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
103 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
104 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 pfunc *p;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 for (p = &__CTOR_END__[-1]; p >= __CTOR_LIST__; p--)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108 (*p) ();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
12
4cc3eff958ab Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents: 2
diff changeset
112 // Override any __gccmain the compiler might generate. We don't want
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113 // constructors to be called twice.
12
4cc3eff958ab Merge from eCos master repository on 1999-06-04-22:24:56-BST
jlarmour
parents: 2
diff changeset
114 void __gccmain(void) {}
2
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
115
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
116 /*------------------------------------------------------------------------*/
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
117 /* CYG_HAL_START - pre-main-entrypoint */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
118
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
119 #ifdef CYG_HAL_SPARCLITE_SLEB
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120 #define SLEB_LED (*(volatile char *)(0x02000003))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 #define LED( _x_ ) SLEB_LED = (char)(0xff & ~(_x_))
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 #else
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123 #define LED( _x_ ) CYG_EMPTY_STATEMENT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126 extern void hal_board_prestart( void );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 extern void hal_board_poststart( void );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 // This is called with traps enabled, but interrupts masked out:
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 // Be sure to enable them in hal_board_poststart() at the latest.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
131
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
132 void cyg_hal_start( void )
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 /* Board specific prestart that's best done in C */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135 hal_board_prestart();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
136
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
137 LED( 0xd0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 #ifdef CYG_HAL_STARTUP_ROM
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 /* Copy data from ROM to RAM */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 hal_copy_data();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 LED( 0xd4 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 /* Zero BSS */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 hal_zero_bss();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149 LED( 0xd8 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 /* Call constructors */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 cyg_hal_invoke_constructors();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
153
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
154 LED( 0xdc );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 /* Board specific late startup that's best done in C */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 hal_board_poststart();
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 LED( 0xf8 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
160
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
161 /* Call cyg_start */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 cyg_start(); /* does not return */
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 // EOF hal_boot.c