]> git.kernelconcepts.de Git - karo-tx-redboot.git/blob - doc/html/ref/hal-exception-handling.html
RedBoot TX53 Release 2012-02-15
[karo-tx-redboot.git] / doc / html / ref / hal-exception-handling.html
1 <!-- Copyright (C) 2003 Red Hat, Inc.                                -->
2 <!-- This material may be distributed only subject to the terms      -->
3 <!-- and conditions set forth in the Open Publication License, v1.0  -->
4 <!-- or later (the latest version is presently available at          -->
5 <!-- http://www.opencontent.org/openpub/).                           -->
6 <!-- Distribution of the work or derivative of the work in any       -->
7 <!-- standard (paper) book form is prohibited unless prior           -->
8 <!-- permission is obtained from the copyright holder.               -->
9 <HTML
10 ><HEAD
11 ><TITLE
12 >Exception Handling</TITLE
13 ><meta name="MSSmartTagsPreventParsing" content="TRUE">
14 <META
15 NAME="GENERATOR"
16 CONTENT="Modular DocBook HTML Stylesheet Version 1.76b+
17 "><LINK
18 REL="HOME"
19 TITLE="eCos Reference Manual"
20 HREF="ecos-ref.html"><LINK
21 REL="UP"
22 TITLE="The eCos Hardware Abstraction Layer (HAL)"
23 HREF="the-ecos-hardware-abstraction-layer.html"><LINK
24 REL="PREVIOUS"
25 TITLE="SMP Support"
26 HREF="hal-smp-support.html"><LINK
27 REL="NEXT"
28 TITLE="Vectors and VSRs"
29 HREF="hal-vectors-and-vsrs.html"></HEAD
30 ><BODY
31 CLASS="CHAPTER"
32 BGCOLOR="#FFFFFF"
33 TEXT="#000000"
34 LINK="#0000FF"
35 VLINK="#840084"
36 ALINK="#0000FF"
37 ><DIV
38 CLASS="NAVHEADER"
39 ><TABLE
40 SUMMARY="Header navigation table"
41 WIDTH="100%"
42 BORDER="0"
43 CELLPADDING="0"
44 CELLSPACING="0"
45 ><TR
46 ><TH
47 COLSPAN="3"
48 ALIGN="center"
49 >eCos Reference Manual</TH
50 ></TR
51 ><TR
52 ><TD
53 WIDTH="10%"
54 ALIGN="left"
55 VALIGN="bottom"
56 ><A
57 HREF="hal-smp-support.html"
58 ACCESSKEY="P"
59 >Prev</A
60 ></TD
61 ><TD
62 WIDTH="80%"
63 ALIGN="center"
64 VALIGN="bottom"
65 ></TD
66 ><TD
67 WIDTH="10%"
68 ALIGN="right"
69 VALIGN="bottom"
70 ><A
71 HREF="hal-vectors-and-vsrs.html"
72 ACCESSKEY="N"
73 >Next</A
74 ></TD
75 ></TR
76 ></TABLE
77 ><HR
78 ALIGN="LEFT"
79 WIDTH="100%"></DIV
80 ><DIV
81 CLASS="CHAPTER"
82 ><H1
83 ><A
84 NAME="HAL-EXCEPTION-HANDLING">Chapter 10. Exception Handling</H1
85 ><DIV
86 CLASS="TOC"
87 ><DL
88 ><DT
89 ><B
90 >Table of Contents</B
91 ></DT
92 ><DT
93 ><A
94 HREF="hal-exception-handling.html#HAL-STARTUP"
95 >HAL Startup</A
96 ></DT
97 ><DT
98 ><A
99 HREF="hal-vectors-and-vsrs.html"
100 >Vectors and VSRs</A
101 ></DT
102 ><DT
103 ><A
104 HREF="hal-default-synchronous-exception-handling.html"
105 >Default Synchronous Exception Handling</A
106 ></DT
107 ><DT
108 ><A
109 HREF="hal-default-interrupt-handling.html"
110 >Default Interrupt Handling</A
111 ></DT
112 ></DL
113 ></DIV
114 ><P
115 >Most of the HAL consists of simple macros or functions that are
116 called via the interfaces described in the previous section. These
117 just perform whatever operation is required by accessing the hardware
118 and then return. The exception to this is the handling of exceptions:
119 either synchronous hardware traps or asynchronous device
120 interrupts. Here control is passed first to the HAL, which then passed
121 it on to eCos or the application. After eCos has finished with it,
122 control is then passed back to the HAL for it to tidy up the CPU state
123 and resume processing from the point at which the exception occurred.</P
124 ><P
125 >The HAL exceptions handling code is usually found in the file
126 <TT
127 CLASS="FILENAME"
128 >vectors.S</TT
129 > in the architecture HAL.  Since the
130 reset entry point is usually implemented as one of these it also deals
131 with system startup.</P
132 ><P
133 >The exact implementation of this code is under the control of the HAL
134 implementer. So long as it interacts correctly with the interfaces
135 defined previously it may take any form.  However, all current
136 implementation follow the same pattern, and there should be a very
137 good reason to break with this. The rest of this section describes
138 these operate.</P
139 ><P
140 >Exception handling normally deals with the following broad areas of
141 functionality:</P
142 ><P
143 ></P
144 ><UL
145 ><LI
146 ><P
147 >Startup and initialization.</P
148 ></LI
149 ><LI
150 ><P
151 >Hardware exception delivery.</P
152 ></LI
153 ><LI
154 ><P
155 >Default handling of synchronous exceptions.</P
156 ></LI
157 ><LI
158 ><P
159 >Default handling of asynchronous interrupts.</P
160 ></LI
161 ></UL
162 ><DIV
163 CLASS="SECTION"
164 ><H1
165 CLASS="SECTION"
166 ><A
167 NAME="HAL-STARTUP">HAL Startup</H1
168 ><P
169 >Execution normally begins at the reset vector with
170 the machine in a minimal startup state. From here the HAL needs to get
171 the machine running, set up the execution environment for the
172 application, and finally invoke its entry point.</P
173 ><P
174 >The following is a list of the jobs that need to be done in
175 approximately the order in which they should be accomplished. Many
176 of these will not be needed in some configurations.</P
177 ><P
178 ></P
179 ><UL
180 ><LI
181 ><P
182 >  Initialize the hardware. This may involve initializing several
183   subsystems in both the architecture, variant and platform
184   HALs. These include:
185   </P
186 ><P
187 ></P
188 ><UL
189 ><LI
190 ><P
191 >       Initialize various CPU status registers. Most importantly, the CPU
192         interrupt mask should be set to disable interrupts.
193         </P
194 ></LI
195 ><LI
196 ><P
197 >       Initialize the MMU, if it is used. On many platforms it is
198         only possible to control the cacheability of address ranges
199         via the MMU. Also, it may be necessary to remap RAM and device
200         registers to locations other than their defaults. However, for
201         simplicity, the mapping should be kept as close to one-to-one
202         physical-to-virtual as possible.
203         </P
204 ></LI
205 ><LI
206 ><P
207 >       Set up the memory controller to access RAM, ROM and I/O devices
208         correctly. Until this is done it may not be possible to access
209         RAM. If this is a ROMRAM startup then the program code can
210         now be copied to its RAM address and control transferred to it.
211         </P
212 ></LI
213 ><LI
214 ><P
215 >       Set up any bus bridges and support chips. Often access to
216         device registers needs to go through various bus bridges and
217         other intermediary devices. In many systems these are combined
218         with the memory controller, so it makes sense to set these up
219         together. This is particularly important if early diagnostic
220         output needs to go through one of these devices.
221         </P
222 ></LI
223 ><LI
224 ><P
225 >       Set up diagnostic mechanisms. If the platform includes an LED or
226         LCD output device, it often makes sense to output progress
227         indications on this during startup. This helps with diagnosing
228         hardware and software errors.
229         </P
230 ></LI
231 ><LI
232 ><P
233 >       Initialize floating point and other extensions such as SIMD
234         and multimedia engines. It is usually necessary to enable
235         these and maybe initialize control and exception registers for
236         these extensions.
237         </P
238 ></LI
239 ><LI
240 ><P
241 >       Initialize interrupt controller. At the very least, it should
242         be configured to mask all interrupts. It may also be necessary
243         to set up the mapping from the interrupt controller's vector
244         number space to the CPU's exception number space. Similar
245         mappings may need to be set up between primary and secondary
246         interrupt controllers.
247         </P
248 ></LI
249 ><LI
250 ><P
251 >       Disable and initialize the caches. The caches should not
252         normally be enabled at this point, but it may be necessary to
253         clear or initialize them so that they can be enabled
254         later. Some architectures require that the caches be
255         explicitly reinitialized after a power-on reset.
256         </P
257 ></LI
258 ><LI
259 ><P
260 >       Initialize the timer, clock etc. While the timer used for RTC
261         interrupts will be initialized later, it may be necessary to
262         set up the clocks that drive it here.
263         </P
264 ></LI
265 ></UL
266 ><P
267 >    The exact order in which these initializations is done is
268     architecture or variant specific. It is also often not necessary
269     to do anything at all for some of these options. These fragments
270     of code should concentrate on getting the target up and running so
271     that C function calls can be made and code can be run. More
272     complex initializations that cannot be done in assembly code may
273     be postponed until calls to
274     <TT
275 CLASS="FUNCTION"
276 >hal_variant_init()</TT
277 > or
278     <TT
279 CLASS="FUNCTION"
280 >hal_platform_init()</TT
281 > are made.
282     </P
283 ><P
284 >    Not all of these initializations need to be done for all startup
285     types. In particular, RAM startups can reasonably assume that the
286     ROM monitor or loader has already done most of this work.
287     </P
288 ></LI
289 ><LI
290 ><P
291 >    Set up the stack pointer, this allows subsequent initialization
292     code to make proper procedure calls. Usually the interrupt stack
293     is used for this purpose since it is available, large enough, and
294     will be reused for other purposes later.
295     </P
296 ></LI
297 ><LI
298 ><P
299 >    Initialize any global pointer register needed for access to
300     globally defined variables. This allows subsequent initialization
301     code to access global variables.
302     </P
303 ></LI
304 ><LI
305 ><P
306 >    If the system is starting from ROM, copy the ROM template of the 
307     <TT
308 CLASS="FILENAME"
309 >.data</TT
310 > section out to its correct position in
311     RAM. (<A
312 HREF="hal-linker-scripts.html"
313 >the Section called <I
314 >Linker Scripts</I
315 > in Chapter 9</A
316 >).
317     </P
318 ></LI
319 ><LI
320 ><P
321 >    Zero the <TT
322 CLASS="FILENAME"
323 >.bss</TT
324 > section.
325     </P
326 ></LI
327 ><LI
328 ><P
329 >    Create a suitable C call stack frame. This may involve making
330     stack space for call frames, and arguments, and initializing the
331     back pointers to halt a GDB backtrace operation.
332     </P
333 ></LI
334 ><LI
335 ><P
336 >    Call <TT
337 CLASS="FUNCTION"
338 >hal_variant_init()</TT
339 > and
340     <TT
341 CLASS="FUNCTION"
342 >hal_platform_init()</TT
343 >. These will perform any
344     additional initialization needed by the variant and platform. This
345     typically includes further initialization of the interrupt
346     controller, PCI bus bridges, basic IO devices and enabling the
347     caches.
348     </P
349 ></LI
350 ><LI
351 ><P
352 >    Call <TT
353 CLASS="FUNCTION"
354 >cyg_hal_invoke_constructors()</TT
355 > to run any
356     static constructors.
357     </P
358 ></LI
359 ><LI
360 ><P
361 >    Call <TT
362 CLASS="FUNCTION"
363 >cyg_start()</TT
364 >. If
365     <TT
366 CLASS="FUNCTION"
367 >cyg_start()</TT
368 > returns, drop into an infinite
369     loop.
370     </P
371 ></LI
372 ></UL
373 ></DIV
374 ></DIV
375 ><DIV
376 CLASS="NAVFOOTER"
377 ><HR
378 ALIGN="LEFT"
379 WIDTH="100%"><TABLE
380 SUMMARY="Footer navigation table"
381 WIDTH="100%"
382 BORDER="0"
383 CELLPADDING="0"
384 CELLSPACING="0"
385 ><TR
386 ><TD
387 WIDTH="33%"
388 ALIGN="left"
389 VALIGN="top"
390 ><A
391 HREF="hal-smp-support.html"
392 ACCESSKEY="P"
393 >Prev</A
394 ></TD
395 ><TD
396 WIDTH="34%"
397 ALIGN="center"
398 VALIGN="top"
399 ><A
400 HREF="ecos-ref.html"
401 ACCESSKEY="H"
402 >Home</A
403 ></TD
404 ><TD
405 WIDTH="33%"
406 ALIGN="right"
407 VALIGN="top"
408 ><A
409 HREF="hal-vectors-and-vsrs.html"
410 ACCESSKEY="N"
411 >Next</A
412 ></TD
413 ></TR
414 ><TR
415 ><TD
416 WIDTH="33%"
417 ALIGN="left"
418 VALIGN="top"
419 >SMP Support</TD
420 ><TD
421 WIDTH="34%"
422 ALIGN="center"
423 VALIGN="top"
424 ><A
425 HREF="the-ecos-hardware-abstraction-layer.html"
426 ACCESSKEY="U"
427 >Up</A
428 ></TD
429 ><TD
430 WIDTH="33%"
431 ALIGN="right"
432 VALIGN="top"
433 >Vectors and VSRs</TD
434 ></TR
435 ></TABLE
436 ></DIV
437 ></BODY
438 ></HTML
439 >