vectors.s
来自「eCos操作系统源码」· S 代码 · 共 854 行 · 第 1/2 页
S
854 行
// #========================================================================// #// # vectors.S// #// # Fujitsu exception vectors// #// #========================================================================//####ECOSGPLCOPYRIGHTBEGIN####// -------------------------------------------// This file is part of eCos, the Embedded Configurable Operating System.// Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.//// eCos is free software; you can redistribute it and/or modify it under// the terms of the GNU General Public License as published by the Free// Software Foundation; either version 2 or (at your option) any later version.//// eCos is distributed in the hope that it will be useful, but WITHOUT ANY// WARRANTY; without even the implied warranty of MERCHANTABILITY or// FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License// for more details.//// You should have received a copy of the GNU General Public License along// with eCos; if not, write to the Free Software Foundation, Inc.,// 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA.//// As a special exception, if other files instantiate templates or use macros// or inline functions from this file, or you compile this file and link it// with other works to produce a work based on this file, this file does not// by itself cause the resulting work to be covered by the GNU General Public// License. However the source code for this file must still be made available// in accordance with section (3) of the GNU General Public License.//// This exception does not invalidate any other reasons why a work based on// this file might be covered by the GNU General Public License.//// Alternative licenses for eCos may be arranged by contacting Red Hat, Inc.// at http://sources.redhat.com/ecos/ecos-license/// -------------------------------------------//####ECOSGPLCOPYRIGHTEND####// #========================================================================// ######DESCRIPTIONBEGIN####// #// # Author(s): gthomas// # Contributors: gthomas// # Date: 2001-09-16// # Purpose: Fujitsu exception vectors// # Description: This file defines the code placed into the exception// # vectors. It also contains the first level default VSRs// # that save and restore state for both exceptions and// # interrupts.// #// #####DESCRIPTIONEND####// #// #========================================================================#include <pkgconf/hal.h>#include CYGBLD_HAL_PLF_DEFS_H #include "frv.inc"#include <cyg/hal/platform.inc> .macro lda a r sethi #gprelhi(\a),\r setlo #gprello(\a),\r add \r,gr16,\r .endm .macro li v r sethi #((\v)>>16),\r setlo #((\v)&0xFFFF),\r .endm .macro save_GDB_exception_regs base,orig // 'orig' points to an area where some registers were already saved // orig+0: GPR4 // orig+4: GPR5 // orig+8: GPR6 // orig+12: GPR16 // orig+16: LR // orig+20: CCR sti gr4,@(\base,_TS_VECTOR) addi \orig,24,gr5 sti gr5,@(\base,_TS_SP) ldi @(\orig,0),gr5 sti gr5,@(\base,_TS_GPR4) ldi @(\orig,4),gr5 sti gr5,@(\base,_TS_GPR5) ldi @(\orig,8),gr5 sti gr5,@(\base,_TS_GPR6) ldi @(\orig,12),gr5 sti gr5,@(\base,_TS_GPR16) ldi @(\orig,16),gr5 sti gr5,@(\base,_TS_LR) ldi @(\orig,20),gr5 sti gr5,@(\base,_TS_CCR) .endm .macro save_exception_regs base sti gr4,@(\base,_TS_VECTOR) sti gr5,@(\base,_TS_GPR5) addi sp,_TS_size,gr5 sti gr5,@(\base,_TS_SP) sti gr6,@(\base,_TS_GPR6) sti gr16,@(\base,_TS_GPR16) movsg lr,gr5 sti gr5,@(\base,_TS_LR) movsg ccr,gr5 sti gr5,@(\base,_TS_CCR) .endm // Save the machine state after an interrupt/exception // Note: it might be possible to use stdi/lddi instructions here, // but it would require that the stack pointer always be 64 bit // (doubleword) aligned. .macro save_state base sti gr0,@(\base,_TS_GPR0) sti gr2,@(\base,_TS_GPR2) sti gr3,@(\base,_TS_GPR3) sti gr7,@(\base,_TS_GPR7) sti gr8,@(\base,_TS_GPR8) sti gr9,@(\base,_TS_GPR9) sti gr10,@(\base,_TS_GPR10) sti gr11,@(\base,_TS_GPR11) sti gr12,@(\base,_TS_GPR12) sti gr13,@(\base,_TS_GPR13) sti gr14,@(\base,_TS_GPR14) sti gr15,@(\base,_TS_GPR15) sti gr17,@(\base,_TS_GPR17) sti gr18,@(\base,_TS_GPR18) sti gr19,@(\base,_TS_GPR19) sti gr20,@(\base,_TS_GPR20) sti gr21,@(\base,_TS_GPR21) sti gr22,@(\base,_TS_GPR22) sti gr23,@(\base,_TS_GPR23) sti gr24,@(\base,_TS_GPR24) sti gr25,@(\base,_TS_GPR25) sti gr26,@(\base,_TS_GPR26) sti gr27,@(\base,_TS_GPR27) sti gr28,@(\base,_TS_GPR28) sti gr29,@(\base,_TS_GPR29) sti gr30,@(\base,_TS_GPR30) sti gr31,@(\base,_TS_GPR31) #if _NGPR != 32 sti gr32,@(\base,_TS_GPR32) sti gr33,@(\base,_TS_GPR33) sti gr34,@(\base,_TS_GPR34) sti gr35,@(\base,_TS_GPR35) sti gr36,@(\base,_TS_GPR36) sti gr37,@(\base,_TS_GPR37) sti gr38,@(\base,_TS_GPR38) sti gr39,@(\base,_TS_GPR39) sti gr40,@(\base,_TS_GPR40) sti gr41,@(\base,_TS_GPR41) sti gr42,@(\base,_TS_GPR42) sti gr43,@(\base,_TS_GPR43) sti gr44,@(\base,_TS_GPR44) sti gr45,@(\base,_TS_GPR45) sti gr46,@(\base,_TS_GPR46) sti gr47,@(\base,_TS_GPR47) sti gr48,@(\base,_TS_GPR48) sti gr49,@(\base,_TS_GPR49) sti gr50,@(\base,_TS_GPR50) sti gr51,@(\base,_TS_GPR51) sti gr52,@(\base,_TS_GPR52) sti gr53,@(\base,_TS_GPR53) sti gr54,@(\base,_TS_GPR54) sti gr55,@(\base,_TS_GPR55) sti gr56,@(\base,_TS_GPR56) sti gr57,@(\base,_TS_GPR57) sti gr58,@(\base,_TS_GPR58) sti gr59,@(\base,_TS_GPR59) sti gr60,@(\base,_TS_GPR60) sti gr61,@(\base,_TS_GPR61) sti gr62,@(\base,_TS_GPR62) sti gr63,@(\base,_TS_GPR63)#endif movsg psr,gr5 sti gr5,@(\base,_TS_PSR) movsg lcr,gr5 sti gr5,@(\base,_TS_LCR) movsg cccr,gr5 sti gr5,@(\base,_TS_CCCR) movsg bpcsr,gr5#if defined( CYGSEM_HAL_FRV_HW_DEBUG ) || defined(CYGPKG_HAL_FRV_FRV400) cmpi gr4,#CYGNUM_HAL_VECTOR_BREAKPOINT,icc0 beq icc0,0,10f#endif 5: movsg pcsr,gr5 cmpi gr4,#CYGNUM_HAL_VECTOR_SYSCALL,icc0 blt icc0,0,10f6: subi gr5,#4,gr5 // traps show PC+410: sti gr5,@(\base,_TS_PC) .endm // Restore the machine state after an interrupt/exception .macro restore_state base,pcreg,retv ldi @(\base,_TS_PC),gr5 movgs gr5,\pcreg ldi @(\base,_TS_CCR),gr5 movgs gr5,ccr ldi @(\base,_TS_LR),gr5 movgs gr5,lr ldi @(\base,_TS_PSR),gr5 movgs gr5,psr ldi @(\base,_TS_LCR),gr5 movgs gr5,lcr ldi @(\base,_TS_CCCR),gr5 movgs gr5,cccr ldi @(\base,_TS_GPR2),gr2 ldi @(\base,_TS_GPR3),gr3 ldi @(\base,_TS_GPR4),gr4 ldi @(\base,_TS_GPR5),gr5 ldi @(\base,_TS_GPR6),gr6 ldi @(\base,_TS_GPR7),gr7 ldi @(\base,_TS_GPR8),gr8 ldi @(\base,_TS_GPR9),gr9 ldi @(\base,_TS_GPR10),gr10 ldi @(\base,_TS_GPR11),gr11 ldi @(\base,_TS_GPR12),gr12 ldi @(\base,_TS_GPR13),gr13 ldi @(\base,_TS_GPR14),gr14 ldi @(\base,_TS_GPR15),gr15 ldi @(\base,_TS_GPR16),gr16 ldi @(\base,_TS_GPR17),gr17 ldi @(\base,_TS_GPR18),gr18 ldi @(\base,_TS_GPR19),gr19 ldi @(\base,_TS_GPR20),gr20 ldi @(\base,_TS_GPR21),gr21 ldi @(\base,_TS_GPR22),gr22 ldi @(\base,_TS_GPR23),gr23 ldi @(\base,_TS_GPR24),gr24 ldi @(\base,_TS_GPR25),gr25 ldi @(\base,_TS_GPR26),gr26 ldi @(\base,_TS_GPR27),gr27 ldi @(\base,_TS_GPR28),gr28 ldi @(\base,_TS_GPR29),gr29 ldi @(\base,_TS_GPR30),gr30 ldi @(\base,_TS_GPR31),gr31#if _NGPR != 32 ldi @(\base,_TS_GPR32),gr32 ldi @(\base,_TS_GPR33),gr33 ldi @(\base,_TS_GPR34),gr34 ldi @(\base,_TS_GPR35),gr35 ldi @(\base,_TS_GPR36),gr36 ldi @(\base,_TS_GPR37),gr37 ldi @(\base,_TS_GPR38),gr38 ldi @(\base,_TS_GPR39),gr39 ldi @(\base,_TS_GPR40),gr40 ldi @(\base,_TS_GPR41),gr41 ldi @(\base,_TS_GPR42),gr42 ldi @(\base,_TS_GPR43),gr43 ldi @(\base,_TS_GPR44),gr44 ldi @(\base,_TS_GPR45),gr45 ldi @(\base,_TS_GPR46),gr46 ldi @(\base,_TS_GPR47),gr47 ldi @(\base,_TS_GPR48),gr48 ldi @(\base,_TS_GPR49),gr49 ldi @(\base,_TS_GPR50),gr50 ldi @(\base,_TS_GPR51),gr51 ldi @(\base,_TS_GPR52),gr52 ldi @(\base,_TS_GPR53),gr53 ldi @(\base,_TS_GPR54),gr54 ldi @(\base,_TS_GPR55),gr55 ldi @(\base,_TS_GPR56),gr56 ldi @(\base,_TS_GPR57),gr57 ldi @(\base,_TS_GPR58),gr58 ldi @(\base,_TS_GPR59),gr59 ldi @(\base,_TS_GPR60),gr60 ldi @(\base,_TS_GPR61),gr61 ldi @(\base,_TS_GPR62),gr62 ldi @(\base,_TS_GPR63),gr63#endif ldi @(\base,_TS_SP),gr1 // This has to be last - Stack pointer rett #\retv .endm #if defined(CYG_HAL_STARTUP_ROM) || defined(CYG_HAL_STARTUP_ROMRAM) .macro exception_VSR#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS subi sp,24,sp sti gr4,@(sp,0)#else subi sp,_TS_size,sp sti gr4,@(sp,_TS_GPR4)#endif addi gr0,#((.-8)-_vectors)/16,gr4 bra _exception .endm#if defined(CYGPKG_HAL_FRV_FRV400) && defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) .macro break_VSR#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS subi sp,24,sp sti gr4,@(sp,0)#else subi sp,_TS_size,sp sti gr4,@(sp,_TS_GPR4)#endif addi gr0,#((.-8)-_vectors)/16,gr4 bra _break .endm#endif // CYGPKG_HAL_FRV_FRV400 && STUBS .macro interrupt_VSR subi sp,_TS_size,sp sti gr4,@(sp,_TS_GPR4) addi gr0,#((.-8)-_vectors)/16,gr4 bra _interrupt .endm .section ".rom_vectors","ax"_vectors: call reset_vector nop // I hate fencepost stuff like this.... nop // (NEXT_INDEX_AFTER_THIS - 1) - (PREVIOUS_INDEX_FILLED) nop // (LAST_INDEX_TO_FILL) - (PREVIOUS_INDEX_FILLED) .rept (CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1-1)-0 exception_VSR .endr .rept (CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_15) - (CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_1-1) interrupt_VSR .endr .rept (254) - CYGNUM_HAL_VECTOR_EXTERNAL_INTERRUPT_LEVEL_15 exception_VSR .endr#if defined(CYGPKG_HAL_FRV_FRV400) && defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) break_VSR // in index 255#else exception_VSR // another one#endif // CYGPKG_HAL_FRV_FRV400 && STUBS //// Handle a break//// just like _exception, but it calls break_handler instead.//#if defined(CYGPKG_HAL_FRV_FRV400) && defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) _break: // Save current register state#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS sti gr5,@(sp,4) // First, check BRR to see whether we're processing a break // instruction. The stub uses this instruction to enter debug mode. movsg brr,gr5 andicc gr5,#2,gr0,icc0 beq icc0,#0,1f // It is a break instruction. Clear BRR to acknowledge it. movgs gr0,brr // Set LR to the address of the instruction after the break. // Since software breaks are post-execution ones, BPCSR already // contains the right address. movsg bpcsr,gr5 movgs gr5,lr // Restore the other registers and return as if the break were a // call. Don't worry, the user of the break instruction knows // that LR will be clobbered! ldi @(sp,0),gr4 ldi @(sp,4),gr5 addi sp,#24,sp ret1: // We didn't come here from a break instruction so assume a // breakpoint or watchpoint has been triggered. Since the // interrupt and exception handlers save their registers on the // application stack, there's a chance that these handlers could // trigger watchpoints accidentally. We should just ignore // the watchpoint when that happens. // Use the previous value of SPR:ET to decide whether the break // was triggered by stub or user code. The stub runs with traps // disabled, while any user code that disables traps will not be // debuggable. movsg bpsr,gr5 andicc gr5,#1,gr0,icc0 bne icc0,#2,1f // Hmm, it looks like the GDB stub has triggered an old watchpoint. // Acknowledge it by clearing brr and return as if nothing had // happened. movgs gr0,brr ldi @(sp,0),gr4 ldi @(sp,4),gr5 addi sp,#24,sp rett #11: sti gr6,@(sp,8) sti gr16,@(sp,12) movsg lr,gr5 sti gr5,@(sp,16) movsg ccr,gr5 sti gr5,@(sp,20) // Set the global offset register (gr16) call .Lbrk.Lbrk: movsg lr,gr16 sethi #gprelhi(.Lbrk),gr5 setlo #gprello(.Lbrk),gr5 sub gr16,gr5,gr16 mov sp,gr6 // Original stack pointer lda __GDB_stack,gr5 // already on GDB stack? cmp sp,gr5,icc0 bhi icc0,0,10f // no - need to switch lda __GDB_stack_base,gr5 cmp sp,gr5,icc0 bhi icc0,0,11f10: lda __GDB_stack,sp // already on GDB stack?11: subi sp,_TS_size,sp // Space for scratch saves save_GDB_exception_regs sp,gr6 save_state sp#else save_exception_regs sp save_state sp#endif LED 0x0FFF add sp,gr0,gr8 call break_handler restore_state sp,bpcsr,1#endif // CYGPKG_HAL_FRV_FRV400 && STUBS//// Handle an exception//
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?