annotate packages/hal/i386/linux/current/src/hal_startup.c @ 2:443894e2e912 ecos-v1_2_1-release

Block commit of eCos version 1.2.1
author jlarmour
date Tue, 11 May 1999 12:24:34 +0000
parents
children 7a6ac9edc838
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_startup.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 // HAL bootstrap code
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####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
9 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
10 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
11 // The contents of this file are subject to the Cygnus eCos Public License
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
12 // Version 1.0 (the "License"); you may not use this file except in
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
13 // compliance with the License. You may obtain a copy of the License at
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
14 // http://sourceware.cygnus.com/ecos
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
15 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
16 // Software distributed under the License is distributed on an "AS IS"
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
17 // basis, WITHOUT WARRANTY OF ANY KIND, either express or implied. See the
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
18 // License for the specific language governing rights and limitations under
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
19 // the License.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
20 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
21 // The Original Code is eCos - Embedded Cygnus Operating System, released
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
22 // October 31, 1998.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
23 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
24 // The Initial Developer of the Original Code is Cygnus. Portions created
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
25 // by Cygnus are Copyright (C) 1998,1999 Cygnus Solutions. All Rights Reserved.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
26 // -------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
27 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
28 //####COPYRIGHTEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
29 //=============================================================================
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
30 //#####DESCRIPTIONBEGIN####
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 // Author(s): proven
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
33 // Contributors:proven, jskov
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
34 // Date: 1998-10-06
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
35 // Purpose: HAL diagnostic output
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
36 // Description: Implementations of HAL diagnostic output support.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
37 //
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
38 //####DESCRIPTIONEND####
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
39 //
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 #include <pkgconf/hal.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
43
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
44 #ifdef CYGPKG_KERNEL
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
45 #include <pkgconf/kernel.h>
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
46 #include <cyg/kernel/kapi.h> // cyg_scheduler_lock
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
47 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
48
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
49 #include <cyg/hal/hal_intr.h> // interrupt stuff
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
50 #include <cyg/hal/hal_arch.h> // Architecture specific definitions
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
51
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
52 #include <cyg/infra/diag.h> // diag_printf
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
53 #include <cyg/infra/cyg_ass.h> // ASSERTION macros
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
56 //----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
57 // ISR tables
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
58 volatile CYG_ADDRESS cyg_hal_interrupt_handlers[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
59 volatile CYG_ADDRWORD cyg_hal_interrupt_data[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
60 volatile CYG_ADDRESS cyg_hal_interrupt_objects[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
61
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
62 // VSR table
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
63 volatile CYG_ADDRESS cyg_hal_vsr_table[CYGNUM_HAL_VSR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
64
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
65 // Interrupts start disabled
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
66 volatile int cyg_hal_interrupts_disabled = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
67 volatile int cyg_hal_interrupts_deferred;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
68 volatile int cyg_hal_interrupts_unhandled[CYGNUM_HAL_ISR_COUNT];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
69
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
72 typedef cyg_uint32 (*callsig_t)(int vector, cyg_uint32);
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 externC void interrupt_end(CYG_ADDRESS, CYG_ADDRESS, CYG_ADDRESS);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
75 extern volatile cyg_uint32 cyg_scheduler_sched_lock;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
76
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
77 externC void cyg_hal_default_interrupt_vsr(int vector)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
78 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
79 callsig_t func;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
80 cyg_uint32 ret;
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 if (cyg_hal_interrupts_disabled) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
83 cyg_hal_interrupts_unhandled[vector] = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
84 cyg_hal_interrupts_deferred = 1;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
85 return;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
86 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
87
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
88 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
89 // Increment the scheduler lock when the kernel is present.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
90 cyg_scheduler_sched_lock++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
91 #endif
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 cyg_hal_interrupts_unhandled[vector] = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
94 func = (callsig_t) cyg_hal_interrupt_handlers[vector];
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
95 ret = func(vector, cyg_hal_interrupt_data[vector]);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
96
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
97 #ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
98 // We only need to call _interrupt_end() when there is a kernel
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
99 // present to do any tidying up.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
100 interrupt_end(ret, cyg_hal_interrupt_objects[vector], (CYG_ADDRESS) NULL);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
101 #endif
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 externC void cyg_hal_default_exception_vsr(int vector)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
105 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
106 #if defined(CYGFUN_HAL_COMMON_KERNEL_SUPPORT) && \
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
107 defined(CYGPKG_HAL_EXCEPTIONS)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
108
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
109 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
110 int __pre_state = cyg_hal_interrupts_disabled++;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
111
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
112 cyg_hal_deliver_exception( vector, 0 );
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
113
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
114 cyg_hal_interrupts_disabled = __pre_state;
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 #else
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 CYG_FAIL("Exception!!!");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
120
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
121 #endif
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
122 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
123
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
124 //---------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
125 // Default ISR
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
126
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
127 externC cyg_uint32
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
128 cyg_hal_default_isr(CYG_ADDRWORD vector, CYG_ADDRWORD data)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
129 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
130 diag_printf("Interrupt: %d\n", vector);
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 CYG_FAIL("Spurious Interrupt!!!");
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
133 return 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
134 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
135
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 // Initialization on the VSRs.
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
138 struct hal_sigaction {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
139 void (*hal_handler)(int);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
140 long hal_mask;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
141 int hal_flags;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
142 void (*hal_bogus)(int);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
143 } act, oact;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
144 extern int cyg_hal_sys_sigaction(int, const struct hal_sigaction*,
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
145 struct hal_sigaction*);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
146 externC void cyg_hal_isr_init(void)
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
147 {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
148 int i;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
149
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
150 // ISR setup
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
151 for (i = 0; i < CYGNUM_HAL_ISR_COUNT; i++) {
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
152 cyg_hal_interrupt_handlers[i] = (CYG_ADDRESS) &cyg_hal_default_isr;
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
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
155 // Interrupt VSR setup
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
156 act.hal_handler = cyg_hal_default_interrupt_vsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
157 act.hal_mask = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
158 act.hal_flags = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
159 cyg_hal_sys_sigaction(CYGNUM_HAL_INTERRUPT_RTC, &act, &oact);
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 // Exception VSR setup
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
162 act.hal_handler = cyg_hal_default_exception_vsr;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
163 act.hal_mask = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
164 act.hal_flags = 0;
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
165 cyg_hal_sys_sigaction(CYGNUM_HAL_VECTOR_SIGSEGV, &act, &oact);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
166 cyg_hal_sys_sigaction(CYGNUM_HAL_VECTOR_SIGBUS, &act, &oact);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
167 cyg_hal_sys_sigaction(CYGNUM_HAL_VECTOR_SIGFPE, &act, &oact);
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
168 }
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
169
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
170 //-----------------------------------------------------------------------------
443894e2e912 Block commit of eCos version 1.2.1
jlarmour
parents:
diff changeset
171 // End of hal_startup.c