hal_var_bank.inc
来自「eCos操作系统源码」· INC 代码 · 共 416 行
INC
416 行
##==========================================================================#### hal_var_bank.inc#### SH support code for variants using register banks####==========================================================================#####ECOSGPLCOPYRIGHTBEGIN###### -------------------------------------------## This file is part of eCos, the Embedded Configurable Operating System.## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.## Copyright (C) 2003 Nick Garnett #### 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): jskov## Contributors: jskov, nickg## Date: 2002-01-11## Purpose: SH support code for variants using register banks########DESCRIPTIONEND########==========================================================================#---------------------------------------------------------------------------# The models with banked registers jump directly to code without storing# anything on the stack. Instead, the CPU switches to use banked registers# leaving initial saving of state to the VSRs.# reset 0xa0000000# other exceptions VBR+0x100# tlb miss VBR+0x400# interrupts VBR+0x600#===========================================================================# Reset code must be PC relative so it can be executed out of the shadow# area during startup. Not until after hal_hardware_init can the system# be expected to provide the proper address space (at that time we# jump to the VMA base of the code). .org 0x000FUNC_START(_reset) mov.l $_reset_platform,r0 jmp @r0 nop# Note: this is the unmapped, shadow address of the start of code# Sadly, it is too far to just branch to. .align 2$_reset_platform:#ifdef CYG_HAL_STARTUP_RAM .long CYG_LABEL_DEFN(_reset_platform)#elif defined(CYG_HAL_STARTUP_ROMRAM) // Uncached "shadow" address but adjusted for VMA/LMA differences .long __reset_platform+0x20000000-CYGMEM_REGION_ram+CYGMEM_REGION_rom#else // Uncached "shadow" address .long CYG_LABEL_DEFN(_reset_platform)+0x20000000#endif #---------------------------------------------------------------------------# Exception entry .org 0x100__exception:#if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR) mov #1,r7#endif mov.l $nCYGARC_REG_EXCEVT2,r1 mov.l @r1,r1 shlr2 r1 shlr r1 ! divide cause by 0x08 mov.l $hal_vsr_table2,r0 mov.l @(r0,r1),r1 jmp @r1 nop .align 2 SYM_PTR_REFn(hal_vsr_table,2)#---------------------------------------------------------------------------# TLB miss entry .org 0x400__tlb_miss:#if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR) mov #2,r7#endif mov.l $nCYGARC_REG_EXCEVT2,r1 mov.l @r1,r1 shlr2 r1 shlr r1 ! divide cause by 0x08 mov.l $hal_vsr_table3,r0 mov.l @(r0,r1),r1 jmp @r1 nop .align 2 SYM_PTR_REFn(hal_vsr_table,3)$nCYGARC_REG_EXCEVT2: .long CYGARC_REG_EXCEVT#---------------------------------------------------------------------------# Interrupt entry .org 0x600__interrupt: #ifdef CYGHWR_HAL_SH_IRQ_HANDLE_SPURIOUS_INTERRUPTS # A spurious interrupt with INTEVT=0 may be caused by # clearing of BL. Those interrupts need to be ignored. mov.l 1f,r0 mov.l @r0,r0 cmp/eq #0,r0 bf 2f rte nop .align 21: .long CYGARC_REG_INTEVT2: #endif #if defined(CYGPKG_KERNEL_INSTRUMENT) && defined(CYGDBG_KERNEL_INSTRUMENT_INTR) mov #3,r7#endif mov.l $hal_vsr_table_int,r1 mov.l @r1,r1 jmp @r1 nop .align 2$hal_vsr_table_int: .long CYG_LABEL_DEFN(hal_vsr_table)+CYGNUM_HAL_VECTOR_INTERRUPT*4##============================================================================## Macros for saving/restoring register state on an exception.#---------------------------------------------------------------------------## Save registers on exception:## At entry:## r15 is location to be stored to## r0 is the available scratch register## At exit:## r7 is the vector ### all other registers (except sp) are available .macro hal_cpu_save_regs # We come here with all register containing their # pre-exception values except: # r0_b-r7_b = saved r0-r7 # r7 = vector # # spc = saved pc # ssr = saved sr # Save away some registers mov r15,r1 ! entry sp#ifdef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT add #-12,r15 ! Space for cause, gbr, and vbr#else add #-4,r15 ! Space for cause stc gbr,r0 ! GBR mov.l r0,@-r15 stc vbr,r0 ! VBR mov.l r0,@-r15#endif stc spc,r0 mov.l r0,@-r15 ! PC stc ssr,r0 mov.l r0,@-r15 ! SR sts.l pr,@-r15 ! PR#ifdef CYGHWR_HAL_SH_FPU sts.l fpscr,@-r15 sts.l fpul,@-r15 mov.l 3f,r0 ! set FPSCR to known value lds r0,fpscr#if CYGHWR_HAL_SH_FPU_REGS == 32 frchg fmov.s fr15,@-r15 fmov.s fr14,@-r15 fmov.s fr13,@-r15 fmov.s fr12,@-r15 fmov.s fr11,@-r15 fmov.s fr10,@-r15 fmov.s fr9,@-r15 fmov.s fr8,@-r15 fmov.s fr7,@-r15 fmov.s fr6,@-r15 fmov.s fr5,@-r15 fmov.s fr4,@-r15 fmov.s fr3,@-r15 fmov.s fr2,@-r15 fmov.s fr1,@-r15 fmov.s fr0,@-r15 frchg#endif fmov.s fr15,@-r15 fmov.s fr14,@-r15 fmov.s fr13,@-r15 fmov.s fr12,@-r15 fmov.s fr11,@-r15 fmov.s fr10,@-r15 fmov.s fr9,@-r15 fmov.s fr8,@-r15 fmov.s fr7,@-r15 fmov.s fr6,@-r15 fmov.s fr5,@-r15 fmov.s fr4,@-r15 fmov.s fr3,@-r15 fmov.s fr2,@-r15 fmov.s fr1,@-r15 fmov.s fr0,@-r15#endif sts.l mach,@-r15 ! mach sts.l macl,@-r15 ! macl mov.l r1,@-r15 ! entry sp mov.l r14,@-r15 ! r14-r0 mov.l r13,@-r15 mov.l r12,@-r15 mov.l r11,@-r15 mov.l r10,@-r15 mov.l r9,@-r15 mov.l r8,@-r15 stc.l r7_bank,@-r15 stc.l r6_bank,@-r15 stc.l r5_bank,@-r15 stc.l r4_bank,@-r15 stc.l r3_bank,@-r15 stc.l r2_bank,@-r15 stc.l r1_bank,@-r15 stc.l r0_bank,@-r15 # After setting the SR it will be possible to use breakpoints. mov.l 1f,r1 ldc r1,sr bra 2f nop .align 2 1: .long CYG_SR#ifdef CYGHWR_HAL_SH_FPU3: .long CYG_FPSCR#endif # ------------------------------------------------------------ # Register bank has changed now. 2: .endm # No additional magic needed. hal_cpu_save_regs does it all. .macro hal_exception_entry_extras .endm .macro hal_interrupt_entry_extras .endm#---------------------------------------------------------------------------## Restore registers after exception:## At entry:## r15 is location to be loaded from## all other registers (except sp) are available## At exit:## Returns to interrupted code .macro hal_cpu_restore_regs_return # Disable interrupts and switch register bank during the restore # operation mov.l 1f,r1 ldc r1,sr # ------------------------------------------------------------ # Register bank has changed now. # # Single step debugging becomes impossible after this point! # mov r15,r0 ldc.l @r0+,r0_bank ldc.l @r0+,r1_bank ldc.l @r0+,r2_bank ldc.l @r0+,r3_bank ldc.l @r0+,r4_bank ldc.l @r0+,r5_bank ldc.l @r0+,r6_bank ldc.l @r0+,r7_bank mov.l @r0+,r8 mov.l @r0+,r9 mov.l @r0+,r10 mov.l @r0+,r11 mov.l @r0+,r12 mov.l @r0+,r13 mov.l @r0+,r14 mov.l @r0+,r15 ! return SP lds.l @r0+,macl ! macl lds.l @r0+,mach ! mach#ifdef CYGHWR_HAL_SH_FPU fmov.s @r0+,fr0 fmov.s @r0+,fr1 fmov.s @r0+,fr2 fmov.s @r0+,fr3 fmov.s @r0+,fr4 fmov.s @r0+,fr5 fmov.s @r0+,fr6 fmov.s @r0+,fr7 fmov.s @r0+,fr8 fmov.s @r0+,fr9 fmov.s @r0+,fr10 fmov.s @r0+,fr11 fmov.s @r0+,fr12 fmov.s @r0+,fr13 fmov.s @r0+,fr14 fmov.s @r0+,fr15#if CYGHWR_HAL_SH_FPU_REGS == 32 frchg fmov.s @r0+,fr0 fmov.s @r0+,fr1 fmov.s @r0+,fr2 fmov.s @r0+,fr3 fmov.s @r0+,fr4 fmov.s @r0+,fr5 fmov.s @r0+,fr6 fmov.s @r0+,fr7 fmov.s @r0+,fr8 fmov.s @r0+,fr9 fmov.s @r0+,fr10 fmov.s @r0+,fr11 fmov.s @r0+,fr12 fmov.s @r0+,fr13 fmov.s @r0+,fr14 fmov.s @r0+,fr15 frchg#endif lds.l @r0+,fpul lds.l @r0+,fpscr#endif lds.l @r0+,pr ! PR mov.l @r0+,r2 ldc r2,ssr ! return SR mov.l @r0+,r2 ldc r2,spc ! return PC#ifndef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT mov.l @r0+,r2 ldc r2,vbr ! return VBR mov.l @r0+,r2 ldc r2,gbr ! return GBR#endif rte nop .align 2 1: .long CYG_SR_BANK1 .endm#---------------------------------------------------------------------------# Translate cause of exception to a vector number .macro hal_exception_translate mov.l 1f,r0 mov.l @r0,r4 mov #-5,r0 ! divide cause by 0x20 shld r0,r4 mov.l 3f,r0 bra 2f mov.l r4,@(r0,r15) ! store decoded vector number back .align 21: .long CYGARC_REG_EXCEVT3: .long CYGARC_SHREG_EVENT2: .endm#---------------------------------------------------------------------------# end of hal_var_bank.inc
⌨️ 快捷键说明
复制代码Ctrl + C
搜索代码Ctrl + F
全屏模式F11
增大字号Ctrl + =
减小字号Ctrl + -
显示快捷键?