173 lines
4.3 KiB
ArmAsm
173 lines
4.3 KiB
ArmAsm
/*
|
|
* (C) Copyright 2010 Quantenna Communications Inc.
|
|
*
|
|
* See file CREDITS for list of people who contributed to this
|
|
* project.
|
|
*
|
|
* This program 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 of
|
|
* the License, or (at your option) any later version.
|
|
*
|
|
* This program 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 this program; if not, write to the Free Software
|
|
* Foundation, Inc., 59 Temple Place, Suite 330, Boston,
|
|
* MA 02111-1307 USA
|
|
*/
|
|
|
|
#include <config.h>
|
|
|
|
#include <asm/arch/platform.h>
|
|
|
|
/***********************************************************************************
|
|
* Vectors must be aligned on 1KB boundary.
|
|
*/
|
|
.section .text
|
|
|
|
.align 1024
|
|
|
|
__vectors_start:
|
|
.globl __vectors_start
|
|
|
|
/***********************************************************************************
|
|
* Vectors itself.
|
|
*/
|
|
|
|
j EV_Reset ; 0x00, Reset (0x0)
|
|
j EV_MemErr ; 0x08, Memory error (0x8)
|
|
j EV_InstrErr ; 0x10, Instruction error (0x10)
|
|
|
|
.rept 29
|
|
j EV_NotImpl
|
|
.endr
|
|
|
|
j EV_MachineCheck ; 0x100, Fatal Machine check (0x20)
|
|
j EV_TLBMissI ; 0x108, Intruction TLB miss (0x21)
|
|
j EV_TLBMissD ; 0x110, Data TLB miss (0x22)
|
|
j EV_TLBProtV ; 0x118, Protection Violation (0x23) or Misaligned Access
|
|
j EV_PrivilegeV ; 0x120, Privilege Violation (0x24)
|
|
j EV_Trap ; 0x128, Trap exception (0x25)
|
|
j EV_Extension ; 0x130, Extn Intruction Excp (0x26)
|
|
|
|
.rept 24
|
|
j EV_NotImpl
|
|
.endr
|
|
|
|
/***********************************************************************************
|
|
* Stack and static data to process interrupts.
|
|
* As static data is used, code does not work correctly on SMP systems,
|
|
* or on systems where interrupts can interrupt each other
|
|
* (like in case of ARC's 2 levels of interrupts - this mode
|
|
* must not be used with this code).
|
|
*/
|
|
|
|
.rept 127
|
|
.word 0x0
|
|
.endr
|
|
__vector_stack:
|
|
.word 0
|
|
__vector_saved_sp:
|
|
.word 0
|
|
__vector_saved_fp:
|
|
.word 0
|
|
__vector_saved_cfunc_ptr:
|
|
.word 0
|
|
|
|
/***********************************************************************************
|
|
* Code to process interrupts.
|
|
*/
|
|
|
|
.macro VECTOR_SAVE_REGS
|
|
st.a r0, [sp, -4]
|
|
st.a r1, [sp, -4]
|
|
st.a r2, [sp, -4]
|
|
st.a r3, [sp, -4]
|
|
st.a r4, [sp, -4]
|
|
st.a r5, [sp, -4]
|
|
st.a r6, [sp, -4]
|
|
st.a r7, [sp, -4]
|
|
st.a r8, [sp, -4]
|
|
st.a r9, [sp, -4]
|
|
st.a r10, [sp, -4]
|
|
st.a r11, [sp, -4]
|
|
st.a r12, [sp, -4]
|
|
.endm
|
|
|
|
.macro VECTOR_RESTORE_REGS
|
|
ld.ab r12, [sp, 4]
|
|
ld.ab r11, [sp, 4]
|
|
ld.ab r10, [sp, 4]
|
|
ld.ab r9, [sp, 4]
|
|
ld.ab r8, [sp, 4]
|
|
ld.ab r7, [sp, 4]
|
|
ld.ab r6, [sp, 4]
|
|
ld.ab r5, [sp, 4]
|
|
ld.ab r4, [sp, 4]
|
|
ld.ab r3, [sp, 4]
|
|
ld.ab r2, [sp, 4]
|
|
ld.ab r1, [sp, 4]
|
|
ld.ab r0, [sp, 4]
|
|
.endm
|
|
|
|
.macro VECTOR_FUNC_HEADER name
|
|
.globl \name
|
|
.align 4
|
|
\name :
|
|
.endm
|
|
|
|
.macro VECTOR_FUNC name ptr
|
|
; please have this macro small as it will be used many times
|
|
VECTOR_FUNC_HEADER \name
|
|
|
|
; store pointer to __vector_saved_cfunc_ptr address.
|
|
st r0, [__vector_saved_sp]
|
|
mov r0, \ptr
|
|
st r0, [__vector_saved_cfunc_ptr]
|
|
ld r0, [__vector_saved_sp]
|
|
|
|
; go to dispatcher. it never returns back.
|
|
j EV_Dispatcher
|
|
.endm
|
|
|
|
VECTOR_FUNC_HEADER EV_Dispatcher
|
|
; prepare stack
|
|
st sp, [__vector_saved_sp]
|
|
st fp, [__vector_saved_fp]
|
|
mov sp, __vector_stack
|
|
mov fp, sp
|
|
|
|
; save registers which C-function can modify to stack
|
|
VECTOR_SAVE_REGS
|
|
|
|
; call C-function
|
|
; it must have 'void f(void) prototype
|
|
ld r0, [__vector_saved_cfunc_ptr]
|
|
jl [r0]
|
|
|
|
; restore registers from stack
|
|
VECTOR_RESTORE_REGS
|
|
|
|
; restore original stack registers
|
|
ld sp, [__vector_saved_sp]
|
|
ld fp, [__vector_saved_fp]
|
|
|
|
; return from interrupt
|
|
rtie
|
|
|
|
VECTOR_FUNC EV_NotImpl intr_EV_NotImpl
|
|
VECTOR_FUNC EV_Reset intr_EV_Reset
|
|
VECTOR_FUNC EV_MemErr intr_EV_MemErr
|
|
VECTOR_FUNC EV_InstrErr intr_EV_InstrErr
|
|
VECTOR_FUNC EV_MachineCheck intr_EV_MachineCheck
|
|
VECTOR_FUNC EV_TLBMissI intr_EV_TLBMissI
|
|
VECTOR_FUNC EV_TLBMissD intr_EV_TLBMissD
|
|
VECTOR_FUNC EV_TLBProtV intr_EV_TLBProtV
|
|
VECTOR_FUNC EV_PrivilegeV intr_EV_PrivilegeV
|
|
VECTOR_FUNC EV_Trap intr_EV_Trap
|
|
VECTOR_FUNC EV_Extension intr_EV_Extension
|