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

Subversion Repositories openrisc

[/] [openrisc/] [trunk/] [rtos/] [ecos-3.0/] [packages/] [hal/] [v85x/] [arch/] [current/] [src/] [vectors.S] - Blame information for rev 786

Details | Compare with Previous | View Log

Line No. Rev Author Line
1 786 skrzyp
// #========================================================================
2
// #
3
// #    vectors.S
4
// #
5
// #    NEC/V85x exception/interrupt vectors
6
// #
7
// #========================================================================
8
// ####ECOSGPLCOPYRIGHTBEGIN####
9
// -------------------------------------------
10
// This file is part of eCos, the Embedded Configurable Operating System.
11
// Copyright (C) 1998, 1999, 2000, 2001, 2002 Free Software Foundation, Inc.
12
//
13
// eCos is free software; you can redistribute it and/or modify it under
14
// the terms of the GNU General Public License as published by the Free
15
// Software Foundation; either version 2 or (at your option) any later
16
// version.
17
//
18
// eCos is distributed in the hope that it will be useful, but WITHOUT
19
// ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
20
// FITNESS FOR A PARTICULAR PURPOSE.  See the GNU General Public License
21
// for more details.
22
//
23
// You should have received a copy of the GNU General Public License
24
// along with eCos; if not, write to the Free Software Foundation, Inc.,
25
// 51 Franklin Street, Fifth Floor, Boston, MA  02110-1301, USA.
26
//
27
// As a special exception, if other files instantiate templates or use
28
// macros or inline functions from this file, or you compile this file
29
// and link it with other works to produce a work based on this file,
30
// this file does not by itself cause the resulting work to be covered by
31
// the GNU General Public License. However the source code for this file
32
// must still be made available in accordance with section (3) of the GNU
33
// General Public License v2.
34
//
35
// This exception does not invalidate any other reasons why a work based
36
// on this file might be covered by the GNU General Public License.
37
// -------------------------------------------
38
// ####ECOSGPLCOPYRIGHTEND####
39
// #========================================================================
40
// ######DESCRIPTIONBEGIN####
41
// #
42
// # Author(s):     gthomas, jlarmour
43
// # Contributors:  gthomas, jlarmour
44
// # Date:          2001-03-21
45
// # Purpose:       NEC/V85x exception vectors
46
// # Description:   This file defines the code placed into the exception
47
// #                vectors. It also contains the first level default VSRs
48
// #                that save and restore state for both exceptions and
49
// #                interrupts.
50
// #
51
// #####DESCRIPTIONEND####
52
// #
53
// #========================================================================
54
 
55
#include 
56
#include 
57
#include 
58
#ifdef CYGPKG_KERNEL
59
#include 
60
#else
61
# undef CYGFUN_HAL_COMMON_KERNEL_SUPPORT
62
# undef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
63
#endif
64
#include 
65
#include CYGHWR_MEMORY_LAYOUT_H
66
 
67
#include 
68
 
69
// Two different macros in case we ever decide to differentiate
70
// between exceptions and interrupts.
71
        .macro  EXCEPTION
72
        .org    reset_vector+(0x0010*VECTOR)
73
        addi    -CYGARC_EXCEPTION_FRAME_SIZE,sp,sp
74
        st.w    r8,CYGARC_REG_R8[sp]
75
        movea   VECTOR,r0,r8
76
        jr      exception
77
        .set    VECTOR, VECTOR+1
78
        .endm
79
 
80
        .macro  INTERRUPT
81
        .org    reset_vector+(0x0010*VECTOR)
82
        addi    -CYGARC_EXCEPTION_FRAME_SIZE,sp,sp
83
        st.w    r8,CYGARC_REG_R8[sp]
84
        movea   VECTOR,r0,r8
85
        jr      exception
86
        .set    VECTOR, VECTOR+1
87
        .endm
88
 
89
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
90
        .section ".vectors","ax"
91
        .globl  reset_vector
92
reset_vector:
93
 
94
//
95
// These are the hardware exception vectors.
96
//
97
__ROM_vsr:
98
        // start of ROM
99
        mov     r0,sp  // needed for platforms that have NMI 2 insns after reset
100
        // This jump works even for ROMRAM because it is PC relative
101
        jr      start
102
 
103
        .set    VECTOR, 1
104
        .rept   CYGNUM_HAL_EXCEPTION_COUNT-1
105
        EXCEPTION
106
        .endr
107
        .set    VECTOR, CYGNUM_HAL_ISR_MIN
108
        .rept   CYGNUM_HAL_ISR_COUNT
109
        INTERRUPT
110
        .endr
111
#endif
112
 
113
        .text
114
        .globl  start
115
start:
116
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
117
        // Before anything else, *carefully* check if this was actually an NMI
118
        // The assumption is that the stack pointer can only be 0 on reset
119
        // as set above at __ROM_vsr
120
        cmp     r0,sp
121
        be      1f
122
        addi    -CYGARC_EXCEPTION_FRAME_SIZE,sp,sp
123
        movea   1,r0,r8
124
        jr      exception
125
1:
126
#endif
127
 
128
        // Perform hardware initialization
129
        PLATFORM_SETUP1
130
 
131
        // Copy everything to the proper VMA base and jump to it.
132
#if defined(CYG_HAL_STARTUP_ROMRAM)
133
        lea     CYGMEM_REGION_rom,r6
134
        lea     CYGMEM_REGION_ram,r7
135
        lea     ___rom_data_end,r8 // Assume end of .data == end of ROM
136
1:      ld.w    0[r6],r1
137
        st.w    r1,0[r7]
138
        addi    4,r6,r6
139
        addi    4,r7,r7
140
        cmp     r6,r8
141
        bne     1b
142
 
143
        // now jump to RAM
144
        lea     ___romram_jump_vector,r1
145
        jmp     [r1]
146
 
147
___romram_jump_vector:
148
 
149
#elif defined( CYG_HAL_STARTUP_ROM )
150
        // Relocate [copy] data from ROM to RAM
151
        lea     ___rom_data_start,r6
152
        lea     ___ram_data_start,r7
153
        lea     ___ram_data_end,r8
154
1:      ld.w    0[r6],r1
155
        st.w    r1,0[r7]
156
        addi    4,r6,r6
157
        addi    4,r7,r7
158
        cmp     r7,r8
159
        bne     1b
160
 
161
        // Initialize RAM vectors
162
        lea     ___ram_vectors_loadaddr,r6
163
        lea     ___ram_vectors_start,r7
164
        lea     ___ram_vectors_end,r8
165
1:      ld.w    0[r6],r1
166
        st.w    r1,0[r7]
167
        addi    4,r6,r6
168
        addi    4,r7,r7
169
        cmp     r7,r8
170
        bne     1b
171
#endif
172
 
173
        // Initialize stack
174
        lea     __startup_stack-16,r1
175
        mov     r1,sp
176
 
177
        // Clear BSS
178
        lea     ___bss_start,r6
179
        lea     ___bss_end,r7
180
1:      st.w    r0,0[r6]
181
        addi    4,r6,r6
182
        cmp     r6,r7
183
        bne     1b
184
 
185
#if defined(CYG_HAL_STARTUP_RAM)
186
// Set up VSR pointers into this application/image
187
        lea     _hal_vsr_table+(CYGNUM_HAL_ISR_MIN*4),r6
188
        movea   CYGNUM_HAL_ISR_COUNT,r0,r7
189
        lea     do_interrupt,r8
190
10:     st.w    r8,0[r6]
191
        addi    4,r6,r6
192
        addi    -1,r7,r7
193
        bne     10b
194
#endif
195
 
196
        // Initialize hardware
197
        jarl    _cyg_hal_hardware_init,r31
198
 
199
#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
200
# ifdef CYG_HAL_STARTUP_RAM
201
// Need to handle exceptions as well
202
        lea     _hal_vsr_table,r6
203
        movea   CYGNUM_HAL_EXCEPTION_COUNT,r0,r7
204
        lea     do_exception,r8
205
10:     st.w    r8,0[r6]
206
        addi    4,r6,r6
207
        addi    -1,r7,r7
208
        bne     10b
209
# endif
210
        jarl    _initialize_stub,r31
211
#else // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
212
// All programs need to provide for NMI handlers
213
        lea     _hal_vsr_table+4,r6
214
        lea     do_exception,r8
215
        st.w    r8,0[r6]    // NMI pin
216
#endif // CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS
217
 
218
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
219
        // we can process NMIs now
220
        lea     __allow_nmi,r1
221
        addi    1,r0,r2
222
        st.w    r2,0[r1]
223
#endif
224
 
225
#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \
226
    || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)
227
        .extern hal_ctrlc_isr_init
228
        jarl    _hal_ctrlc_isr_init,r31
229
#endif
230
 
231
        // Run through static constructors
232
        jarl    _cyg_hal_invoke_constructors,r31
233
 
234
        // Ready to start the eCos kernel
235
        jarl    _cyg_start,r31
236
 
237
        // If we get here, something is _very_ wrong
238
_start_hang:
239
        br      _start_hang
240
 
241
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
242
        // Handle exception
243
exception:
244
        // save exception context
245
        st.w    ep,CYGARC_REG_EP[sp]
246
        mov     sp,ep
247
        sst.w   r8,CYGARC_REG_VECTOR[ep]
248
        sst.w   r1,CYGARC_REG_R1[ep]
249
        addi    CYGARC_EXCEPTION_FRAME_SIZE,ep,r1
250
        sst.w   r2,CYGARC_REG_R2[ep]
251
        sst.w   r1,CYGARC_REG_SP[ep]
252
        sst.w   r4,CYGARC_REG_R4[ep]
253
        sst.w   r5,CYGARC_REG_R5[ep]
254
        sst.w   r6,CYGARC_REG_R6[ep]
255
        sst.w   r7,CYGARC_REG_R7[ep]
256
//        sst.w   r8,CYGARC_REG_R8[ep]
257
        sst.w   r9,CYGARC_REG_R9[ep]
258
        sst.w   r10,CYGARC_REG_R10[ep]
259
        sst.w   r11,CYGARC_REG_R11[ep]
260
        sst.w   r12,CYGARC_REG_R12[ep]
261
        sst.w   r13,CYGARC_REG_R13[ep]
262
        sst.w   r14,CYGARC_REG_R14[ep]
263
        sst.w   r15,CYGARC_REG_R15[ep]
264
        sst.w   r16,CYGARC_REG_R16[ep]
265
        sst.w   r17,CYGARC_REG_R17[ep]
266
        sst.w   r18,CYGARC_REG_R18[ep]
267
        sst.w   r19,CYGARC_REG_R19[ep]
268
#ifndef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
269
        sst.w   r20,CYGARC_REG_R20[ep]
270
        sst.w   r21,CYGARC_REG_R21[ep]
271
        sst.w   r22,CYGARC_REG_R22[ep]
272
        sst.w   r23,CYGARC_REG_R23[ep]
273
        sst.w   r24,CYGARC_REG_R24[ep]
274
        sst.w   r25,CYGARC_REG_R25[ep]
275
        sst.w   r26,CYGARC_REG_R26[ep]
276
        sst.w   r27,CYGARC_REG_R27[ep]
277
        sst.w   r28,CYGARC_REG_R28[ep]
278
#endif
279
        sst.w   r29,CYGARC_REG_R29[ep] // NB frame pointer
280
        sst.w   lp,CYGARC_REG_LP[ep]
281
        cmp     CYGNUM_HAL_VECTOR_TRAP00,r8  // NMI?
282
        bge     05f
283
        stsr    FEPC,r6                 // saved state differs
284
        stsr    FEPSW,r7
285
        lea     __allow_nmi,r1          // is the system ready for NMIs?
286
        tst1    0, 0[r1]
287
        bne     10f
288
        // if not processing NMIs, allow restore
289
        sst.w   r6,CYGARC_REG_PC[ep]
290
        sst.w   r7,CYGARC_REG_PSW[ep]
291
        // Reenable exception processing
292
        stsr    PSW,r6
293
        andi    ~(CYGARC_PSW_EP|CYGARC_PSW_NP),r6,r6
294
        ldsr    r6,PSW
295
        lea     return_from_exception_or_interrupt,r1
296
        jmp     [r1]
297
 
298
05:     stsr    EIPC,r6
299
        stsr    EIPSW,r7
300
        cmp     CYGNUM_HAL_VECTOR_ILGOP,r8 // Illegal opcode?
301
        bne     10f
302
        addi    -4,r6,r6                // yes, adjust PC
303
10:     sst.w   r6,CYGARC_REG_PC[ep]
304
        sst.w   r7,CYGARC_REG_PSW[ep]
305
        stsr    ECR,r6
306
        sst.w   r6,CYGARC_REG_CAUSE[ep]
307
        // Reenable exception processing
308
        stsr    PSW,r6
309
        andi    ~(CYGARC_PSW_EP|CYGARC_PSW_NP),r6,r6
310
        ldsr    r6,PSW
311
        shl     2,r8
312
        lea     _hal_vsr_table,r1
313
        add     r1,r8
314
        ld.w    0[r8],r1
315
        jmp     [r1]
316
#endif
317
 
318
do_exception:
319
        // pass in saved registers
320
        mov     sp,r6
321
 
322
        // leave space for the parameter flush back area (as per calling
323
        // conventions)
324
        addi    -16,sp,sp
325
 
326
        jarl    _exception_handler,r31
327
 
328
return_from_exception_or_interrupt:
329
        // save sp, but remove space for the parameter flush back area
330
        // (as per calling conventions) at the same time
331
        addi    16,sp,ep
332
 
333
        sld.w   CYGARC_REG_PSW[ep],r7
334
        sld.w   CYGARC_REG_R1[ep],r1
335
        sld.w   CYGARC_REG_PC[ep],r6
336
        sld.w   CYGARC_REG_R2[ep],r2
337
        // disable interrupts while restoring context
338
        ld.w    CYGARC_REG_VECTOR[ep],r4
339
        stsr    PSW,r8
340
        cmp     CYGNUM_HAL_VECTOR_TRAP00,r4
341
        bge     10f
342
        ori     CYGARC_PSW_NP,r8,r8     // returning from NMI
343
        ori     CYGARC_PSW_ID,r8,r8     // disable interrupt
344
        ldsr    r8,PSW
345
        ldsr    r7,FEPSW
346
        ldsr    r6,FEPC
347
        br      30f
348
10:     cmp     CYGNUM_HAL_ISR_MIN,r4   // exception or interrupt
349
        bge     20f
350
        ori     CYGARC_PSW_EP,r8,r8     // returning from exception
351
20:     ori     CYGARC_PSW_ID,r8,r8     // disable interrupt
352
        ldsr    r8,PSW
353
        ldsr    r7,EIPSW                // Avoid pipeline bubbles
354
        ldsr    r6,EIPC
355
30:     sld.w   CYGARC_REG_R4[ep],r4
356
        sld.w   CYGARC_REG_R5[ep],r5
357
        sld.w   CYGARC_REG_R6[ep],r6
358
        sld.w   CYGARC_REG_R7[ep],r7
359
        sld.w   CYGARC_REG_R8[ep],r8
360
        sld.w   CYGARC_REG_R9[ep],r9
361
        sld.w   CYGARC_REG_R10[ep],r10
362
        sld.w   CYGARC_REG_R11[ep],r11
363
        sld.w   CYGARC_REG_R12[ep],r12
364
        sld.w   CYGARC_REG_R13[ep],r13
365
        sld.w   CYGARC_REG_R14[ep],r14
366
        sld.w   CYGARC_REG_R15[ep],r15
367
        sld.w   CYGARC_REG_R16[ep],r16
368
        sld.w   CYGARC_REG_R17[ep],r17
369
        sld.w   CYGARC_REG_R18[ep],r18
370
        sld.w   CYGARC_REG_R19[ep],r19
371
#ifndef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
372
        sld.w   CYGARC_REG_R20[ep],r20
373
        sld.w   CYGARC_REG_R21[ep],r21
374
        sld.w   CYGARC_REG_R22[ep],r22
375
        sld.w   CYGARC_REG_R23[ep],r23
376
        sld.w   CYGARC_REG_R24[ep],r24
377
        sld.w   CYGARC_REG_R25[ep],r25
378
        sld.w   CYGARC_REG_R26[ep],r26
379
        sld.w   CYGARC_REG_R27[ep],r27
380
        sld.w   CYGARC_REG_R28[ep],r28
381
#endif
382
        sld.w   CYGARC_REG_R29[ep],r29 // NB frame pointer
383
        sld.w   CYGARC_REG_LP[ep],lp
384
        sld.w   CYGARC_REG_SP[ep],sp
385
        sld.w   CYGARC_REG_EP[ep],ep
386
        reti
387
 
388
        // Handle interrupt - these are typically vectored into user code
389
do_interrupt:
390
        mov     sp,ep                   // save pointer to regs frame
391
        // leave space for the parameter flush back area (as per calling
392
        // conventions)
393
        addi    -16,sp,sp
394
 
395
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
396
        // Switch to interrupt stack
397
        lea     irq_level,r6            // current number of nested interrupts
398
        ld.w    0[r6],r7
399
        addi    1,r7,r8
400
        st.w    r8,0[r6]
401
        cmp     0,r7                    // if was zero, switch stacks
402
        bne     10f
403
        mov     sp,r1                   // save old stack pointer
404
        lea     __interrupt_stack-20,r2
405
        mov     r2,sp
406
        st.w    r1,16[sp]
407
10:
408
#endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
409
 
410
        // The entire CPU state is now stashed on the stack,
411
        // increment the scheduler lock and handle the interrupt
412
 
413
#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT
414
        .extern _cyg_scheduler_sched_lock
415
        lea     _cyg_scheduler_sched_lock,r7
416
        ld.w    0[r7],r8
417
        addi    1,r8,r8
418
        st.w    r8,0[r7]
419
#endif
420
 
421
#if defined(CYGPKG_KERNEL_INSTRUMENT) && \
422
    defined(CYGDBG_KERNEL_INSTRUMENT_INTR)
423
        lea     RAISE_INTR,r6                   // arg0 = type = INTR,RAISE
424
        ld.w    CYGARC_REG_VECTOR[ep],r7        // args = vector
425
        mov     r0,r8                           // arg2 = 0
426
        jarl    _cyg_instrument,r31
427
#endif
428
 
429
#if defined(CYGDBG_HAL_DEBUG_GDB_CTRLC_SUPPORT) \
430
    || defined(CYGDBG_HAL_DEBUG_GDB_BREAK_SUPPORT)
431
        // If we are supporting Ctrl-C interrupts from GDB, we must squirrel
432
        // away a pointer to the save interrupt state here so that we can
433
        // plant a breakpoint at some later time.
434
 
435
        .extern _hal_saved_interrupt_state
436
        lea     _hal_saved_interrupt_state,r8
437
        st.w    ep,0[r8]
438
#endif
439
 
440
#ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
441
        mov     r0,r8                           // vector # (overloaded by kernel)
442
#else
443
        ld.w    CYGARC_REG_VECTOR[ep],r6        // vector #
444
        addi    -CYGNUM_HAL_ISR_MIN,r6,r8
445
        shl     2,r8
446
#endif
447
        lea     _hal_interrupt_objects,r1
448
        add     r8,r1
449
        ld.w    0[r1],r29                       // save object handle
450
        lea     _hal_interrupt_data,r1
451
        add     r8,r1
452
        ld.w    0[r1],r7                        // handler data
453
        lea     _hal_interrupt_handlers,r1
454
        add     r8,r1
455
        mov     ep,r8                           // pointer to saved registers
456
        ld.w    0[r1],r1                        // handler routine
457
#ifdef CYGIMP_KERNEL_INTERRUPTS_CHAIN
458
        ld.w    CYGARC_REG_VECTOR[ep],r6        // vector #
459
#endif
460
        jarl    call_via_r1,r31
461
 
462
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
463
        // If we are returning from the last nested interrupt, move back
464
        // to the thread stack. interrupt_end() must be called on the
465
        // thread stack since it potentially causes a context switch.
466
        lea     irq_level,r6
467
        ld.w    0[r6],r7
468
        addi    -1,r7,r8
469
        st.w    r8,0[r6]
470
        cmp     0,r8
471
        bne     10f
472
        ld.w    16[sp],sp       // Restore non-interrupt stack at last interrupt
473
                                // this is offset 16 because of parameter
474
                                // flush back area
475
10:
476
#endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
477
 
478
#ifdef CYGFUN_HAL_COMMON_KERNEL_SUPPORT
479
        // The return value from the handler (in r10) will indicate whether a
480
        // DSR is to be posted. Pass this together with a pointer to the
481
        // interrupt object we have just used to the interrupt tidy up routine.
482
 
483
        mov     r10,r6                          // interrupt handler return code
484
        mov     r29,r7                          // object handle
485
        mov     ep,r8                           // register frame
486
        jarl    _interrupt_end,r31              // post any bottom layer handle
487
 
488
#endif
489
        br      return_from_exception_or_interrupt
490
 
491
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
492
        .globl  _hal_interrupt_stack_call_pending_DSRs
493
_hal_interrupt_stack_call_pending_DSRs:
494
        stsr    PSW,r9
495
        di                              // disable interrupts while changing stack
496
        // Switch to interrupt stack
497
        lea     irq_level,r6            // current number of nested interrupts
498
        mov     1,r7                    // note: this can never be non-zero at this point
499
        st.w    r7,0[r6]
500
        mov     sp,r1                   // save old stack pointer
501
        lea     __interrupt_stack-32,r8 // 32 for 16-byte parameter flush back
502
                                        // plus 12 bytes for following reg saves
503
                                        // plus 4 bytes to preserve alignment
504
        mov     r8,sp
505
        st.w    r1,16[sp]
506
        st.w    r9,20[sp]
507
        st.w    lp,24[sp]
508
        ei
509
        jarl    _cyg_interrupt_call_pending_DSRs,lp
510
        di
511
        ld.w    24[sp],lp                // restore state
512
        ld.w    20[sp],r6
513
        ld.w    16[sp],sp
514
        lea     irq_level,r7
515
        st.w    r0,0[r7]
516
        ldsr    r6,PSW
517
        jmp     [lp]
518
#endif // CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
519
 
520
//
521
// Indirect subroutine call, via R1
522
 
523
call_via_r1:
524
        jmp     [r1]
525
 
526
//
527
// Reset the board
528
//
529
        .globl  _hal_reset_board
530
_hal_reset_board:
531
        di                      // Turn off interrupts
532
        // Don't process NMIs
533
        lea     __allow_nmi,r1
534
        st.w    r0,0[r1]
535
        jmp     [r0]            // Restart machine
536
 
537
#if !defined(CYGSEM_HAL_NEC_INLINE_INTERRUPT_FUNCTIONS)
538
        .globl  _hal_disable_interrupts
539
_hal_disable_interrupts:
540
        stsr    PSW,r10
541
        di
542
        jmp     [lp]
543
 
544
        .globl  _hal_enable_interrupts
545
_hal_enable_interrupts:
546
        stsr    PSW,r6
547
        ei
548
        jmp     [lp]
549
 
550
        .globl  _hal_restore_interrupts
551
_hal_restore_interrupts:
552
        ldsr    r6,PSW
553
        jmp     [lp]
554
#endif
555
 
556
// -------------------------------------------------------------------------
557
        .section ".ram_vectors","awx",@progbits
558
 
559
#if defined(CYG_HAL_STARTUP_ROM)
560
// Trap jump table - used by builtin ROM
561
__vsr_table:
562
        .rept   CYGNUM_HAL_VSR_COUNT
563
        .word   0x00000794,0,0,0   // jr 0x0100xx0, nop, nop, nop
564
        .endr
565
__vsr_table_end:
566
#endif
567
 
568
#if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
569
_hal_vsr_table:
570
        .rept   CYGNUM_HAL_EXCEPTION_COUNT
571
        .word   do_exception
572
        .endr
573
        .rept   CYGNUM_HAL_ISR_COUNT
574
        .word   do_interrupt
575
        .endr
576
 
577
// Flag to indicate whether NMIs are allowed
578
// Without this, if we do a soft reset (using hal_plf_reset_board above)
579
// we may process NMIs like the watchdog timeout before the system can
580
// accept them
581
__allow_nmi:
582
        .word 0
583
 
584
        .balign 64
585
_hal_virtual_vector_table:
586
        .rept   CYGNUM_CALL_IF_TABLE_SIZE
587
        .word   0
588
        .endr
589
 
590
#if CYGINT_HAL_V85X_ICE_DEBUG
591
        .globl  _hal_v85x_ice_syscall_info
592
_hal_v85x_ice_syscall_info:
593
         .rept  48
594
         .long  0
595
         .endr
596
#endif // if CYGINT_HAL_V85X_ICE_DEBUG
597
#endif // if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM)
598
 
599
        .data
600
// Initial stack
601
        .rept   1024
602
        .byte   0
603
        .endr
604
__startup_stack:
605
 
606
#ifndef CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
607
#define CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE 4096
608
#endif
609
#ifdef CYGIMP_HAL_COMMON_INTERRUPTS_USE_INTERRUPT_STACK
610
        .balign 16
611
        .global _cyg_interrupt_stack_base
612
_cyg_interrupt_stack_base:
613
__interrupt_stack_base:
614
        .rept CYGNUM_HAL_COMMON_INTERRUPTS_STACK_SIZE
615
        .byte 0
616
        .endr
617
        .balign 16
618
        .global _cyg_interrupt_stack
619
_cyg_interrupt_stack:
620
__interrupt_stack:
621
irq_level:
622
        .long   0
623
#endif
624
 
625
 
626
// Interrupt vector tables.
627
// These tables contain the isr, data and object pointers used to deliver
628
// interrupts to user code.
629
 
630
        .extern _hal_default_isr
631
 
632
        .globl  _hal_interrupt_handlers
633
_hal_interrupt_handlers:
634
        .rept   CYGNUM_HAL_ISR_COUNT
635
        .long   _hal_default_isr
636
        .endr
637
 
638
        .globl  _hal_interrupt_data
639
_hal_interrupt_data:
640
        .rept   CYGNUM_HAL_ISR_COUNT
641
        .long   0
642
        .endr
643
 
644
        .globl  _hal_interrupt_objects
645
_hal_interrupt_objects:
646
        .rept   CYGNUM_HAL_ISR_COUNT
647
        .long   0
648
        .endr
649
 
650
// -------------------------------------------------------------------------
651
// EOF vectors.S

powered by: WebSVN 2.1.0

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