OpenCores
URL https://opencores.org/ocsvn/openrisc/openrisc/trunk

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [freertos-6.1.1/] [Source/] [portable/] [IAR/] [AVR32_UC3/] [exception.s82] - Blame information for rev 583

Go to most recent revision | Details | Compare with Previous | View Log

Line No. Rev Author Line
1 572 jeremybenn
/*This file is prepared for Doxygen automatic documentation generation.*/
2
/*! \file *********************************************************************
3
 *
4
 * \brief Exception and interrupt vectors.
5
 *
6
 * This file maps all events supported by an AVR32UC.
7
 *
8
 * - Compiler:           IAR EWAVR32
9
 * - Supported devices:  All AVR32UC devices with an INTC module can be used.
10
 * - AppNote:
11
 *
12
 * \author               Atmel Corporation: http://www.atmel.com \n
13
 *                       Support and FAQ: http://support.atmel.no/
14
 *
15
 ******************************************************************************/
16
 
17
/* Copyright (c) 2007, Atmel Corporation All rights reserved.
18
 *
19
 * Redistribution and use in source and binary forms, with or without
20
 * modification, are permitted provided that the following conditions are met:
21
 *
22
 * 1. Redistributions of source code must retain the above copyright notice,
23
 * this list of conditions and the following disclaimer.
24
 *
25
 * 2. Redistributions in binary form must reproduce the above copyright notice,
26
 * this list of conditions and the following disclaimer in the documentation
27
 * and/or other materials provided with the distribution.
28
 *
29
 * 3. The name of ATMEL may not be used to endorse or promote products derived
30
 * from this software without specific prior written permission.
31
 *
32
 * THIS SOFTWARE IS PROVIDED BY ATMEL ``AS IS'' AND ANY EXPRESS OR IMPLIED
33
 * WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF
34
 * MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE EXPRESSLY AND
35
 * SPECIFICALLY DISCLAIMED. IN NO EVENT SHALL ATMEL BE LIABLE FOR ANY DIRECT,
36
 * INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
37
 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
38
 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
39
 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
40
 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
41
 * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
42
 */
43
 
44
 
45
#include 
46
#include "intc.h"
47
 
48
 
49
//! @{
50
//! \verbatim
51
 
52
 
53
// Start of Exception Vector Table.
54
 
55
  // EVBA must be aligned with a power of two strictly greater than the EVBA-
56
  // relative offset of the last vector.
57
  COMMON  EVTAB:CODE:ROOT(9)
58
 
59
 
60
  // Force EVBA initialization.
61
  EXTERN  ??init_EVBA
62
  REQUIRE ??init_EVBA
63
 
64
  // Export symbol.
65
  PUBLIC  ??EVBA
66
  PUBLIC  _evba
67
??EVBA:
68
_evba:
69
 
70
        ORG 0x000
71
        // Unrecoverable Exception.
72
_handle_Unrecoverable_Exception:
73
        rjmp $
74
 
75
        ORG 0x004
76
        // TLB Multiple Hit: UNUSED IN AVR32UC.
77
_handle_TLB_Multiple_Hit:
78
        rjmp $
79
 
80
        ORG 0x008
81
        // Bus Error Data Fetch.
82
_handle_Bus_Error_Data_Fetch:
83
        rjmp $
84
 
85
        ORG 0x00C
86
         // Bus Error Instruction Fetch.
87
_handle_Bus_Error_Instruction_Fetch:
88
        rjmp $
89
 
90
        ORG 0x010
91
        // NMI.
92
_handle_NMI:
93
        rjmp $
94
 
95
        ORG 0x014
96
        // Instruction Address.
97
_handle_Instruction_Address:
98
        rjmp $
99
 
100
        ORG 0x018
101
        // ITLB Protection.
102
_handle_ITLB_Protection:
103
        rjmp $
104
 
105
        ORG 0x01C
106
        // Breakpoint.
107
_handle_Breakpoint:
108
        rjmp $
109
 
110
        ORG 0x020
111
        // Illegal Opcode.
112
_handle_Illegal_Opcode:
113
        rjmp $
114
 
115
        ORG 0x024
116
        // Unimplemented Instruction.
117
_handle_Unimplemented_Instruction:
118
        rjmp $
119
 
120
        ORG 0x028
121
        // Privilege Violation.
122
_handle_Privilege_Violation:
123
        rjmp $
124
 
125
        ORG 0x02C
126
        // Floating-Point: UNUSED IN AVR32UC.
127
_handle_Floating_Point:
128
        rjmp $
129
 
130
        ORG 0x030
131
        // Coprocessor Absent: UNUSED IN AVR32UC.
132
_handle_Coprocessor_Absent:
133
        rjmp $
134
 
135
        ORG 0x034
136
        // Data Address (Read).
137
_handle_Data_Address_Read:
138
        rjmp $
139
 
140
        ORG 0x038
141
        // Data Address (Write).
142
_handle_Data_Address_Write:
143
        rjmp $
144
 
145
        ORG 0x03C
146
        // DTLB Protection (Read).
147
_handle_DTLB_Protection_Read:
148
        rjmp $
149
 
150
        ORG 0x040
151
        // DTLB Protection (Write).
152
_handle_DTLB_Protection_Write:
153
        rjmp $
154
 
155
        ORG 0x044
156
        // DTLB Modified: UNUSED IN AVR32UC.
157
_handle_DTLB_Modified:
158
        rjmp $
159
 
160
        ORG 0x050
161
        // ITLB Miss: UNUSED IN AVR32UC.
162
_handle_ITLB_Miss:
163
        rjmp $
164
 
165
        ORG 0x060
166
        // DTLB Miss (Read): UNUSED IN AVR32UC.
167
_handle_DTLB_Miss_Read:
168
        rjmp $
169
 
170
        ORG 0x070
171
        // DTLB Miss (Write): UNUSED IN AVR32UC.
172
_handle_DTLB_Miss_Write:
173
        rjmp $
174
 
175
        ORG 0x100
176
        // Supervisor Call.
177
_handle_Supervisor_Call:
178
        lddpc   pc, __SCALLYield
179
 
180
 
181
// Interrupt support.
182
// The interrupt controller must provide the offset address relative to EVBA.
183
// Important note:
184
//   All interrupts call a C function named _get_interrupt_handler.
185
//   This function will read group and interrupt line number to then return in
186
//   R12 a pointer to a user-provided interrupt handler.
187
 
188
  ALIGN 2
189
 
190
_int0:
191
  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
192
  // CPU upon interrupt entry.
193
#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
194
  mfsr    r12, AVR32_SR
195
  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
196
  cp.w    r12, 110b
197
  brlo    _int0_normal
198
  lddsp   r12, sp[0 * 4]
199
  stdsp   sp[6 * 4], r12
200
  lddsp   r12, sp[1 * 4]
201
  stdsp   sp[7 * 4], r12
202
  lddsp   r12, sp[3 * 4]
203
  sub     sp, -6 * 4
204
  rete
205
_int0_normal:
206
#endif
207
  mov     r12, 0  // Pass the int_lev parameter to the _get_interrupt_handler function.
208
  mcall   __get_interrupt_handler
209
  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
210
  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
211
  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
212
 
213
_int1:
214
  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
215
  // CPU upon interrupt entry.
216
#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
217
  mfsr    r12, AVR32_SR
218
  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
219
  cp.w    r12, 110b
220
  brlo    _int1_normal
221
  lddsp   r12, sp[0 * 4]
222
  stdsp   sp[6 * 4], r12
223
  lddsp   r12, sp[1 * 4]
224
  stdsp   sp[7 * 4], r12
225
  lddsp   r12, sp[3 * 4]
226
  sub     sp, -6 * 4
227
  rete
228
_int1_normal:
229
#endif
230
  mov     r12, 1  // Pass the int_lev parameter to the _get_interrupt_handler function.
231
  mcall   __get_interrupt_handler
232
  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
233
  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
234
  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
235
 
236
_int2:
237
  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
238
  // CPU upon interrupt entry.
239
#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
240
  mfsr    r12, AVR32_SR
241
  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
242
  cp.w    r12, 110b
243
  brlo    _int2_normal
244
  lddsp   r12, sp[0 * 4]
245
  stdsp   sp[6 * 4], r12
246
  lddsp   r12, sp[1 * 4]
247
  stdsp   sp[7 * 4], r12
248
  lddsp   r12, sp[3 * 4]
249
  sub     sp, -6 * 4
250
  rete
251
_int2_normal:
252
#endif
253
  mov     r12, 2  // Pass the int_lev parameter to the _get_interrupt_handler function.
254
  mcall   __get_interrupt_handler
255
  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
256
  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
257
  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
258
 
259
_int3:
260
  // R8-R12, LR, PC and SR are automatically pushed onto the system stack by the
261
  // CPU upon interrupt entry.
262
#if 1 // B1832: interrupt stack changed to exception stack if exception is detected.
263
  mfsr    r12, AVR32_SR
264
  bfextu  r12, r12, AVR32_SR_M0_OFFSET, AVR32_SR_M0_SIZE + AVR32_SR_M1_SIZE + AVR32_SR_M2_SIZE
265
  cp.w    r12, 110b
266
  brlo    _int3_normal
267
  lddsp   r12, sp[0 * 4]
268
  stdsp   sp[6 * 4], r12
269
  lddsp   r12, sp[1 * 4]
270
  stdsp   sp[7 * 4], r12
271
  lddsp   r12, sp[3 * 4]
272
  sub     sp, -6 * 4
273
  rete
274
_int3_normal:
275
#endif
276
  mov     r12, 3  // Pass the int_lev parameter to the _get_interrupt_handler function.
277
  mcall   __get_interrupt_handler
278
  cp.w    r12, 0  // Get the pointer to the interrupt handler returned by the function.
279
  movne   pc, r12 // If this was not a spurious interrupt (R12 != NULL), jump to the handler.
280
  rete            // If this was a spurious interrupt (R12 == NULL), return from event handler.
281
 
282
 
283
// Constant data area.
284
 
285
  ALIGN 2
286
 
287
  // Import symbols.
288
  EXTERN  SCALLYield
289
  EXTERN  _get_interrupt_handler
290
__SCALLYield:
291
  DC32  SCALLYield
292
__get_interrupt_handler:
293
  DC32  _get_interrupt_handler
294
 
295
  // Values to store in the interrupt priority registers for the various interrupt priority levels.
296
  // The interrupt priority registers contain the interrupt priority level and
297
  // the EVBA-relative interrupt vector offset.
298
  PUBLIC  ipr_val
299
ipr_val:
300
  DC32  (INT0 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int0 - _evba),\
301
        (INT1 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int1 - _evba),\
302
        (INT2 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int2 - _evba),\
303
        (INT3 << AVR32_INTC_IPR0_INTLEV_OFFSET) | (_int3 - _evba)
304
 
305
 
306
  END
307
 
308
 
309
//! \endverbatim
310
//! @}

powered by: WebSVN 2.1.0

© copyright 1999-2024 OpenCores.org, equivalent to Oliscience, all rights reserved. OpenCores®, registered trademark.