305 lines
12 KiB
ArmAsm
305 lines
12 KiB
ArmAsm
|
/****************************************************************************
|
||
|
* boards/xtensa/esp32s3/common/kernel/esp32s3_user_vectors.S
|
||
|
*
|
||
|
* Licensed to the Apache Software Foundation (ASF) under one or more
|
||
|
* contributor license agreements. See the NOTICE file distributed with
|
||
|
* this work for additional information regarding copyright ownership. The
|
||
|
* ASF licenses this file to you under the Apache License, Version 2.0 (the
|
||
|
* "License"); you may not use this file except in compliance with the
|
||
|
* License. You may obtain a copy of the License at
|
||
|
*
|
||
|
* http://www.apache.org/licenses/LICENSE-2.0
|
||
|
*
|
||
|
* Unless required by applicable law or agreed to in writing, software
|
||
|
* distributed under the License is distributed on an "AS IS" BASIS, WITHOUT
|
||
|
* WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the
|
||
|
* License for the specific language governing permissions and limitations
|
||
|
* under the License.
|
||
|
*
|
||
|
****************************************************************************/
|
||
|
|
||
|
.file "esp32s3_user_vectors.S"
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Included Files
|
||
|
****************************************************************************/
|
||
|
|
||
|
#include <nuttx/config.h>
|
||
|
|
||
|
#include <arch/irq.h>
|
||
|
#include <arch/chip/core-isa.h>
|
||
|
#include <arch/xtensa/xtensa_abi.h>
|
||
|
#include <arch/xtensa/xtensa_specregs.h>
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Public Functions
|
||
|
****************************************************************************/
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Medium-/High-priority interrupt vectors
|
||
|
****************************************************************************/
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _xtensa_level2_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .xtensa_level2_vector
|
||
|
.section .xtensa_level2_vector.text, "ax"
|
||
|
.global _xtensa_level2_vector
|
||
|
.type _xtensa_level2_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_xtensa_level2_vector:
|
||
|
j __kernel_vector_table + 0x180
|
||
|
|
||
|
.size _xtensa_level2_vector, . - _xtensa_level2_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _xtensa_level3_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .xtensa_level3_vector
|
||
|
.section .xtensa_level3_vector.text, "ax"
|
||
|
.global _xtensa_level3_vector
|
||
|
.type _xtensa_level3_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_xtensa_level3_vector:
|
||
|
j __kernel_vector_table + 0x1c0
|
||
|
|
||
|
.size _xtensa_level3_vector, . - _xtensa_level3_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _xtensa_level4_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .xtensa_level4_vector
|
||
|
.section .xtensa_level4_vector.text, "ax"
|
||
|
.global _xtensa_level4_vector
|
||
|
.type _xtensa_level4_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_xtensa_level4_vector:
|
||
|
j __kernel_vector_table + 0x200
|
||
|
|
||
|
.size _xtensa_level4_vector, . - _xtensa_level4_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _xtensa_level5_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .xtensa_level5_vector
|
||
|
.section .xtensa_level5_vector.text, "ax"
|
||
|
.global _xtensa_level5_vector
|
||
|
.type _xtensa_level5_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_xtensa_level5_vector:
|
||
|
j __kernel_vector_table + 0x240
|
||
|
|
||
|
.size _xtensa_level5_vector, . - _xtensa_level5_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _debug_exception_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .debug_exception_vector
|
||
|
.section .debug_exception_vector.text, "ax"
|
||
|
.global _debug_exception_vector
|
||
|
.type _debug_exception_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_debug_exception_vector:
|
||
|
j __kernel_vector_table + 0x280
|
||
|
|
||
|
.size _debug_exception_vector, . - _debug_exception_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _nmi_exception_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .nmi_exception_vector
|
||
|
.section .nmi_exception_vector.text, "ax"
|
||
|
.global _nmi_exception_vector
|
||
|
.type _nmi_exception_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_nmi_exception_vector:
|
||
|
j __kernel_vector_table + 0x2c0
|
||
|
|
||
|
.size _nmi_exception_vector, . - _nmi_exception_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* General exception vectors
|
||
|
****************************************************************************/
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _kernel_exception_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .kernel_exception_vector
|
||
|
.section .kernel_exception_vector.text, "ax"
|
||
|
.global _kernel_exception_vector
|
||
|
.type _kernel_exception_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_kernel_exception_vector:
|
||
|
j __kernel_vector_table + 0x300
|
||
|
|
||
|
.size _kernel_exception_vector, . - _kernel_exception_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _user_exception_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .user_exception_vector
|
||
|
.section .user_exception_vector.text, "ax"
|
||
|
.global _user_exception_vector
|
||
|
.type _user_exception_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_user_exception_vector:
|
||
|
j __kernel_vector_table + 0x340
|
||
|
|
||
|
.size _user_exception_vector, . - _user_exception_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _double_exception_vector
|
||
|
****************************************************************************/
|
||
|
|
||
|
.begin literal_prefix .double_exception_vector
|
||
|
.section .double_exception_vector.text, "ax"
|
||
|
.global _double_exception_vector
|
||
|
.type _double_exception_vector, @function
|
||
|
.align 4
|
||
|
|
||
|
_double_exception_vector:
|
||
|
j __kernel_vector_table + 0x3c0
|
||
|
|
||
|
.size _double_exception_vector, . - _double_exception_vector
|
||
|
.end literal_prefix
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Window exception vectors
|
||
|
****************************************************************************/
|
||
|
|
||
|
.section .window_vectors.text, "ax"
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _window_overflow4
|
||
|
****************************************************************************/
|
||
|
|
||
|
.org 0x0
|
||
|
.global _window_overflow4
|
||
|
_window_overflow4:
|
||
|
s32e a0, a5, -16 /* save a0 to call[j+1]'s stack frame */
|
||
|
s32e a1, a5, -12 /* save a1 to call[j+1]'s stack frame */
|
||
|
s32e a2, a5, -8 /* save a2 to call[j+1]'s stack frame */
|
||
|
s32e a3, a5, -4 /* save a3 to call[j+1]'s stack frame */
|
||
|
rfwo /* rotates back to call[i] position */
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _window_underflow4
|
||
|
****************************************************************************/
|
||
|
|
||
|
.org 0x40
|
||
|
.global _window_underflow4
|
||
|
_window_underflow4:
|
||
|
l32e a0, a5, -16 /* restore a0 from call[i+1]'s stack frame */
|
||
|
l32e a1, a5, -12 /* restore a1 from call[i+1]'s stack frame */
|
||
|
l32e a2, a5, -8 /* restore a2 from call[i+1]'s stack frame */
|
||
|
l32e a3, a5, -4 /* restore a3 from call[i+1]'s stack frame */
|
||
|
rfwu
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _window_overflow8
|
||
|
****************************************************************************/
|
||
|
|
||
|
.org 0x80
|
||
|
.global _window_overflow8
|
||
|
_window_overflow8:
|
||
|
s32e a0, a9, -16 /* save a0 to call[j+1]'s stack frame */
|
||
|
l32e a0, a1, -12 /* a0 <- call[j-1]'s sp
|
||
|
(used to find end of call[j]'s frame) */
|
||
|
s32e a1, a9, -12 /* save a1 to call[j+1]'s stack frame */
|
||
|
s32e a2, a9, -8 /* save a2 to call[j+1]'s stack frame */
|
||
|
s32e a3, a9, -4 /* save a3 to call[j+1]'s stack frame */
|
||
|
s32e a4, a0, -32 /* save a4 to call[j]'s stack frame */
|
||
|
s32e a5, a0, -28 /* save a5 to call[j]'s stack frame */
|
||
|
s32e a6, a0, -24 /* save a6 to call[j]'s stack frame */
|
||
|
s32e a7, a0, -20 /* save a7 to call[j]'s stack frame */
|
||
|
rfwo /* rotates back to call[i] position */
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _window_underflow8
|
||
|
****************************************************************************/
|
||
|
|
||
|
.org 0xc0
|
||
|
.global _window_underflow8
|
||
|
_window_underflow8:
|
||
|
l32e a0, a9, -16 /* restore a0 from call[i+1]'s stack frame */
|
||
|
l32e a1, a9, -12 /* restore a1 from call[i+1]'s stack frame */
|
||
|
l32e a2, a9, -8 /* restore a2 from call[i+1]'s stack frame */
|
||
|
l32e a7, a1, -12 /* a7 <- call[i-1]'s sp
|
||
|
(used to find end of call[i]'s frame) */
|
||
|
l32e a3, a9, -4 /* restore a3 from call[i+1]'s stack frame */
|
||
|
l32e a4, a7, -32 /* restore a4 from call[i]'s stack frame */
|
||
|
l32e a5, a7, -28 /* restore a5 from call[i]'s stack frame */
|
||
|
l32e a6, a7, -24 /* restore a6 from call[i]'s stack frame */
|
||
|
l32e a7, a7, -20 /* restore a7 from call[i]'s stack frame */
|
||
|
rfwu
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _window_overflow12
|
||
|
****************************************************************************/
|
||
|
|
||
|
.org 0x100
|
||
|
.global _window_overflow12
|
||
|
_window_overflow12:
|
||
|
s32e a0, a13, -16 /* save a0 to call[j+1]'s stack frame */
|
||
|
l32e a0, a1, -12 /* a0 <- call[j-1]'s sp
|
||
|
(used to find end of call[j]'s frame) */
|
||
|
s32e a1, a13, -12 /* save a1 to call[j+1]'s stack frame */
|
||
|
s32e a2, a13, -8 /* save a2 to call[j+1]'s stack frame */
|
||
|
s32e a3, a13, -4 /* save a3 to call[j+1]'s stack frame */
|
||
|
s32e a4, a0, -48 /* save a4 to end of call[j]'s stack frame */
|
||
|
s32e a5, a0, -44 /* save a5 to end of call[j]'s stack frame */
|
||
|
s32e a6, a0, -40 /* save a6 to end of call[j]'s stack frame */
|
||
|
s32e a7, a0, -36 /* save a7 to end of call[j]'s stack frame */
|
||
|
s32e a8, a0, -32 /* save a8 to end of call[j]'s stack frame */
|
||
|
s32e a9, a0, -28 /* save a9 to end of call[j]'s stack frame */
|
||
|
s32e a10, a0, -24 /* save a10 to end of call[j]'s stack frame */
|
||
|
s32e a11, a0, -20 /* save a11 to end of call[j]'s stack frame */
|
||
|
rfwo /* rotates back to call[i] position */
|
||
|
|
||
|
/****************************************************************************
|
||
|
* Name: _window_underflow12
|
||
|
****************************************************************************/
|
||
|
|
||
|
.org 0x140
|
||
|
.global _window_underflow12
|
||
|
_window_underflow12:
|
||
|
l32e a0, a13, -16 /* restore a0 from call[i+1]'s stack frame */
|
||
|
l32e a1, a13, -12 /* restore a1 from call[i+1]'s stack frame */
|
||
|
l32e a2, a13, -8 /* restore a2 from call[i+1]'s stack frame */
|
||
|
l32e a11, a1, -12 /* a11 <- call[i-1]'s sp
|
||
|
(used to find end of call[i]'s frame) */
|
||
|
l32e a3, a13, -4 /* restore a3 from call[i+1]'s stack frame */
|
||
|
l32e a4, a11, -48 /* restore a4 from end of call[i]'s stack frame */
|
||
|
l32e a5, a11, -44 /* restore a5 from end of call[i]'s stack frame */
|
||
|
l32e a6, a11, -40 /* restore a6 from end of call[i]'s stack frame */
|
||
|
l32e a7, a11, -36 /* restore a7 from end of call[i]'s stack frame */
|
||
|
l32e a8, a11, -32 /* restore a8 from end of call[i]'s stack frame */
|
||
|
l32e a9, a11, -28 /* restore a9 from end of call[i]'s stack frame */
|
||
|
l32e a10, a11, -24 /* restore a10 from end of call[i]'s stack frame */
|
||
|
l32e a11, a11, -20 /* restore a11 from end of call[i]'s stack frame */
|
||
|
rfwu
|