vectors.s
来自「eCos操作系统源码」· S 代码 · 共 505 行
S
505 行
##=============================================================================#### vectors.S#### CalmRISC16 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): msalter## Contributors: msalter ## Date: 2001-02-12## Purpose: CalmRISC16 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/system.h> #include <pkgconf/hal.h>#ifdef CYGPKG_KERNEL# include <pkgconf/kernel.h> #endif #include <cyg/hal/arch.inc> #include <cyg/hal/hal_arch.h> ##-----------------------------------------------------------------------------## Hardware supplied vectors //==========================================================================// Hardware exception vectors.// This entire section will be copied to location 0x0000 at startup time.// .section ".vectors","ax" .global SYM_NAME(reset_vector)SYM_NAME(reset_vector): .short 0x100 ; reset .short 0x110 ; fiq .short 0x120 ; irq .short 0x130 ; trq .rept 62 brad 0f ; swi nop .endr ;; 0x100 - reset ld a8,SYM_NAME(_start) jmp a8 .p2align 4 ;; 0x110 - fiq push a8 ld a8,0 ldw a8,@[a8+0] jmp a8 .p2align 4 ;; 0x120 - irq push a8 ld a8,0 ldw a8,@[a8+4] jmp a8 .p2align 4 ;; 0x130 - trq push a8 ld a8,0 ldw a8,@[a8+8] jmp a8 .p2align 4 ;; 0x140 - swi 0: push a8 ld a8,0 ldw a8,@[a8+12] jmp a8##-----------------------------------------------------------------------------## Startup code .text FUNC_START _start ld r0,0 cld #28,r0 cld #29,r0 cld #30,r0 cld #31,r0 2: # Initialize hardware hal_cpu_init hal_diag_init hal_memc_init hal_cache_init hal_timer_init # load initial stack pointer ld sp,__startup_stack hal_mon_init#ifdef CYG_HAL_STARTUP_ROM # Copy data from ROM to RAM .extern SYM_NAME(hal_copy_data) jsr SYM_NAME(hal_copy_data)#endif # Zero BSS .extern SYM_NAME(hal_zero_bss) jsr SYM_NAME(hal_zero_bss) # Call variant and platform HAL # initialization routines. .extern SYM_NAME(hal_variant_init) jsr SYM_NAME(hal_variant_init) .extern SYM_NAME(hal_platform_init) jsr SYM_NAME(hal_platform_init) # Call constructors .extern SYM_NAME(cyg_hal_invoke_constructors) jsr SYM_NAME(cyg_hal_invoke_constructors)#if defined(CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS) .extern SYM_NAME(initialize_stub) jsr SYM_NAME(initialize_stub)#endif#if defined(CYGDBG_HAL_CALM16_DEBUG_GDB_CTRLC_SUPPORT) .extern SYM_NAME(hal_ctrlc_isr_init) jsr SYM_NAME(hal_ctrlc_isr_init)#endif # Call cyg_start setsr fe setsr ie .extern SYM_NAME(cyg_start) ld lr,SYM_NAME(_start) jmp SYM_NAME(cyg_start) FUNC_END _start#if 0FUNC_START __txchar ldw r0,@[sp+2] 99: cld r6,#29 cmp eq,r6,#0 brfd 99b nop cld #30,r0 ld r6,1 cld #29,r6 jmp lrFUNC_END __txchar#endif .macro switch_stack_and_save_regs // a8 already pushed on the current stack push r0 ld r0,e15 and r0,#0x3f cmp ugt,r0,#%hi(__GDB_stack) brt 80f // sp <= __GDB_stack cmp eq,r0,#%hi(__GDB_stack) brf 80f // %hi(sp) == %hi(__GDB_stack) ld a8,#__GDB_stack cmp ugt,r15,r8 brt 80f // don't need switch pop r0 pop a8 sub sp,#4 push a14 ld a14,sp add a14,#8 ldw @[sp+6],a14 bra 85f 80: // switch to GDB stack pop r0 ld a8,sp ld sp,#__GDB_stack add a8,#4 push a8 push a14 sub a8,#2 ldw a8,@[a8+0] 85: // at this point, we're using the correct stack // and a15/a14 have been pushed push a13,a12 push a11,a10 push a9,a8 push r7,r6 push r5,r4 push r3,r2 push r1,r0 ld r0,ssr_swi push r0 ld r0,ssr_irq push r0 ld r0,ssr_fiq push r0 ld r0,spcl_irq push r0 ld r0,spch_irq push r0 ld r0,spcl_fiq push r0 ld r0,spch_fiq push r0 .endm // switch_stack_and_save_regs .macro restore_regs pop r0 ld spch_fiq,r0 pop r0 ld spcl_fiq,r0 pop r0 ld spch_irq,r0 pop r0 ld spcl_irq,r0 pop r0 ld ssr_fiq,r0 pop r0 ld ssr_irq,r0 pop r0 ld ssr_swi,r0 pop r0,r1 pop r2,r3 pop r4,r5 pop r6,r7 pop a8,a9 pop a10,a11 pop a12,a13 pop a14 ldw sp,@[sp+2] .endm##------------------------------------------------------------------------------## Default interrupt VSR.## Saves machine state and calls appropriate ISR.FUNC_START __default_irq_vsr // IRQ is overloaded for use by the break insn. // For RedBoot (or any stub) on the core eval boards, we treat // IRQ as an exception. switch_stack_and_save_regs ld r0,2 push r0#if 0 // push interrupt_data arg ld a8,#SYM_NAME(hal_interrupt_data) ldw a8,@[a8 + 4] push a8 // push vector arg push r0 ld r0,0 push r0 // call handler ld a8,#SYM_NAME(hal_interrupt_handlers) ldw a8,@[a8 + 4] jsr a8 add sp,#10#else // call exception handler ld a8,sp add a8,#2 push a8 jsr SYM_NAME(cyg_hal_exception_handler) add sp,#6#endif restore_regs ret_irqFUNC_END __default_irq_vsr##------------------------------------------------------------------------------## Default fast interrupt VSR.## Saves machine state and calls appropriate ISR.FUNC_START __default_fiq_vsr switch_stack_and_save_regs ld r0,1 push r0 // push interrupt_data arg ld a8,#SYM_NAME(hal_interrupt_data) ldw a8,@[a8 + 0] push a8 // push vector arg push r0 ld r0,0 push r0 // call handler ld a8,#SYM_NAME(hal_interrupt_handlers) ldw a8,@[a8 + 0] jsr a8 add sp,#10 restore_regs ret_fiqFUNC_END __default_fiq_vsr##------------------------------------------------------------------------------## Default trace VSR.## Saves machine state and calls appropriate handler.FUNC_START __default_trq_vsr switch_stack_and_save_regs ld r0,3 push r0 // call exception handler ld a8,sp add a8,#2 push a8 jsr SYM_NAME(cyg_hal_exception_handler) add sp,#6 restore_regs ret_irqFUNC_END __default_trq_vsr##------------------------------------------------------------------------------## Default swi VSR.## Saves machine state and calls appropriate handler.FUNC_START __default_swi_vsr switch_stack_and_save_regs ld r0,4 push r0 // call exception handler ld a8,sp add a8,#2 push a8 jsr SYM_NAME(cyg_hal_exception_handler) add sp,#6 restore_regs ret_swiFUNC_END __default_swi_vsr##-----------------------------------------------------------------------------## Short circuit in case any code tries to use "__gccmain()"FUNC_START __gccmain jmp lrFUNC_END __gccmain##-----------------------------------------------------------------------------## Stacks.## Used during intialization and for executing ISRs. .section ".bss"#ifdef CYGDBG_HAL_DEBUG_GDB_INCLUDE_STUBS .p2align 2__GDB_stack_base: .rept 0x1000 .byte 0 .endr__GDB_stack: .long 0#endif .p2align 2__startup_stack_base: .rept 0x1000 .byte 0 .endr .p2align 2__startup_stack: .long 0##-----------------------------------------------------------------------------## VSR table.## The main interrupt code indirects through here to find the VSR## to execute for each architecture defined interrupt.## This is only used for simulated targets, on real targets a fixed location VSR## table is now allocated at 0x000000.#ifndef CYG_HAL_CALM16_VSR_TABLE_DEFINED ## .section ".vsr_table","a" .data .globl SYM_NAME(hal_vsr_table)SYM_NAME(hal_vsr_table): .long SYM_NAME(__default_fiq_vsr) // FIQ .long SYM_NAME(__default_irq_vsr) // IRQ .long SYM_NAME(__default_trq_vsr) // TRQ .long SYM_NAME(__default_swi_vsr) // SWI#endif .data .balign 16#ifdef CYGSEM_HAL_VIRTUAL_VECTOR_SUPPORT // Vectors used to communicate between eCos and ROM environments .globl SYM_NAME(hal_virtual_vector_table)SYM_NAME(hal_virtual_vector_table): .rept 64 .long 0 .endr#endif #------------------------------------------------------------------------------# Interrupt vector tables.# These tables contain the isr, data and object pointers used to deliver# interrupts to user code.# hal_interrupt_level contains the interrupt level set by # HAL_INTERRUPT_CONFIGURE().# This is a default set that provide support only for the single external# interrupt. Platforms or boards are expected to define their own versions# of these if they have their own interrupt mappings.#ifndef CYG_HAL_CALM16_ISR_TABLES_DEFINED .extern SYM_NAME(hal_default_isr) .data .globl SYM_NAME(hal_interrupt_handlers)SYM_NAME(hal_interrupt_handlers): .long SYM_NAME(hal_default_isr) .long SYM_NAME(hal_default_isr) .globl SYM_NAME(hal_interrupt_data)SYM_NAME(hal_interrupt_data): .long 0 .long 0 .globl SYM_NAME(hal_interrupt_objects)SYM_NAME(hal_interrupt_objects): .long 0 .long 0#endif##-----------------------------------------------------------------------------## end of vectors.S
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?