📄 vectors.s
字号:
##==========================================================================
##
## vectors.S
##
## PowerPC exception vectors
##
##==========================================================================
#####ECOSGPLCOPYRIGHTBEGIN####
## -------------------------------------------
## This file is part of eCos, the Embedded Configurable Operating System.
## Copyright (C) 1998, 1999, 2000, 2001, 2002 Red Hat, Inc.
## Copyright (C) 2002 Gary Thomas
##
## 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): nickg, jskov
## Contributors: nickg, jskov
## Date: 1999-02-20
## Purpose: PowerPC 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####
##
##==========================================================================
#===========================================================================
#
# The PowerPC exception handling has changed as of version 1.3.1.
# The primary motivation for rewriting the code was to bring it more
# in line with the other HALs, in particular to allow a RAM application
# to cleanly take over only a subset of vectors from a running ROM
# monitor.
#
# GDB stubs (and CygMon, should it be ported to PPC) copies
# exception vector entry handler code to address 0. These vector entry
# handlers (defined by the exception_vector macro below) compute
# a vector index into the hal_vsr_table, fetch the pointer, and
# jump to the HAL vector service routine (VSR).
#
# The hal_vsr_table is located immediately after the vector
# handlers (at address 0x3000), allowing RAM applications to
# change VSRs as necessary, while still keeping desired ROM
# monitor functionality available for debugging.
#
# ROM applications can still be configured to leave the vector entry
# handlers at 0xff000000, but there is at the moment no
# provision for reclaiming the reserved vector space in RAM to
# application usage.
#
# RAM applications can also be configured to provide exception
# handlers which are copied to address 0 on startup, thus taking
# full control of the target.
#
#
# Default configuration is for RAM applications to rely on an
# existing ROM monitor to provide debugging functionality, and
# for ROM applications to copy vectors to address 0.
#
#
# Unfortunately the new exception scheme is not compatible with the
# old scheme. Stubs and applications must be compiled using the same
# scheme (i.e., old binaries will not run with new stubs, and new
# binaries will not run with old stubs).
#
#===========================================================================
#include <pkgconf/hal.h>
#ifdef CYGPKG_KERNEL
#include <pkgconf/kernel.h> // CYGPKG_KERNEL_INSTRUMENT
#endif
#define CYGARC_HAL_COMMON_EXPORT_CPU_MACROS
#include <cyg/hal/ppc_regs.h>
#===========================================================================
// .file "vectors.S"
.extern hal_interrupt_data
.extern hal_interrupt_handlers
.extern hal_interrupt_objects
.extern hal_vsr_table
.extern cyg_hal_invoke_constructors
.extern cyg_instrument
.extern cyg_start
.extern hal_IRQ_init
.extern hal_MMU_init
.extern hal_enable_caches
.extern hal_hardware_init
.extern initialize_stub
.extern __bss_start
.extern __bss_end
.extern __sbss_start
.extern __sbss_end
#===========================================================================
# MSR initialization value
# zero all bits except:
# FP = floating point available
# ME = machine check enabled
# IP = vectors at 0xFFFxxxxx (ROM startup only)
# IR = instruction address translation
# DR = data address translation
# RI = recoverable interrupt
#define CYG_MSR_COMMON (MSR_FP | MSR_ME | MSR_RI)
#if (CYGHWR_HAL_POWERPC_VECTOR_BASE == 0xfff00000)
# define IP_BIT MSR_IP
#else
# define IP_BIT 0
#endif
#ifdef CYGHWR_HAL_POWERPC_ENABLE_MMU
# define IR_DR_BITS (MSR_IR | MSR_DR)
#else
# define IR_DR_BITS 0
#endif
#define CYG_MSR (CYG_MSR_COMMON | IP_BIT | IR_DR_BITS)
# Include variant macros after MSR definition.
#include <cyg/hal/arch.inc>
#include <cyg/hal/ppc_offsets.inc>
#===========================================================================
# If the following option is enabled, we only save registers up to R12.
# The PowerPC ABI defines registers 13..31 as callee saved and thus we do
# not need to save them when calling C functions.
#ifdef CYGDBG_HAL_COMMON_INTERRUPTS_SAVE_MINIMUM_CONTEXT
# define MAX_SAVE_REG 12
#else
# define MAX_SAVE_REG 31
#endif
#if defined(CYGHWR_HAL_POWERPC_NEED_VECTORS)
#===========================================================================
# Start by defining the exceptions vectors that must be placed at
# locations 0xFFF00000 or 0x00000000. The following code will normally
# be located at 0xFFF00000 in the ROM. It may optionally be copied out
# to 0x00000000 if we want to use the RAM vectors. For this reason this code
# MUST BE POSITION INDEPENDENT.
.section ".vectors","ax"
#---------------------------------------------------------------------------
# Macros for generating an exception vector service routine
# Reset vector macro
.macro reset_vector name
.p2align 8
.globl __exception_\name
__exception_\name:
#ifdef CYGSEM_HAL_POWERPC_RESET_USES_JUMP
bl _start
#else
lwi r3,_start
mtlr r3
blr
#endif
.endm
# Generic vector macro
.macro exception_vector name
.p2align 8
.globl __exception_\name
__exception_\name:
mtspr SPRG1,r3 # stash some work registers away
mtspr SPRG2,r4
mtspr SPRG3,r5
mfcr r4 # stash CR
li r5,__exception_\name-rom_vectors # load low half of vector addr
srwi r5,r5,6 # shift right by 6
lwi r3,hal_vsr_table # table base
lwzx r3,r3,r5 # address of vsr
mflr r5 # save link register
mtlr r3 # put vsr address into it
li r3,__exception_\name-rom_vectors # reload low half of vector addr
blr # go to common code
.endm
#---------------------------------------------------------------------------
# Define the exception vectors.
// Some platforms won't let us put the vector code just where we want
// This macro introduces some lattitude in vector placement
#ifdef CYG_HAL_FUDGE_VECTOR_ALIGNMENT
hal_fudge_vector_alignment
#endif
rom_vectors:
# These are the architecture defined vectors that
# are always present.
#ifdef CYG_HAL_RESERVED_VECTOR_00000
hal_reserved_vector_00000
#else
exception_vector reserved_00000
#endif
reset_vector reset
exception_vector machine_check
exception_vector data_storage
exception_vector instruction_storage
exception_vector external
exception_vector alignment
exception_vector program
exception_vector floatingpoint_unavailable
exception_vector decrementer
exception_vector reserved_00a00
exception_vector reserved_00b00
exception_vector system_call
exception_vector trace
exception_vector floatingpoint_assist
exception_vector reserved_00f00
# Variants may define extra vectors.
hal_extra_vectors
rom_vectors_end:
#else // CYGHWR_HAL_POWERPC_NEED_VECTORS
# When vectors are not included this is the primary entry point.
.globl __exception_reset
__exception_reset:
lwi r3,_start
mtlr r3
blr
#endif // CYGHWR_HAL_POWERPC_NEED_VECTORS
#===========================================================================
# Real startup code. We jump here from the various reset vectors to set up
# the world.
.text
.globl _start
_start:
# Initialize CPU to a post-reset state, ensuring the ground doesn''t
# shift under us while we try to set things up.
hal_cpu_init
# Set up global offset table
lwi r2,_GLOBAL_OFFSET_TABLE_
# set up time base register to zero
xor r3,r3,r3
mtspr TBL_W,r3
xor r4,r4,r4
mtspr TBU_W,r4
# Call platform specific hardware initialization
# This may include memory controller initialization. It is not
# safe to access RAM until after this point.
bl hal_hardware_init # this is platform dependent
.globl _hal_hardware_init_done
_hal_hardware_init_done:
#if !defined(CYG_HAL_STARTUP_ROM) && defined(CYGSEM_HAL_POWERPC_COPY_VECTORS)
lwi r3,rom_vectors-4
lwi r4,((CYGHWR_HAL_POWERPC_VECTOR_BASE)-4)
lwi r5,rom_vectors_end-4
sub r5,r5,r3 # compute number of words to copy
srwi r5,r5,2
mtctr r5
0: lwzu r0,4(r3)
stwu r0,4(r4)
bdnz 0b
#endif
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -