mirror of
https://github.com/apache/nuttx.git
synced 2026-06-07 17:33:08 +08:00
ESP32: A little more co-processor logic. Still not complete.
This commit is contained in:
@@ -41,10 +41,30 @@
|
||||
|
||||
#include <arch/chip/core-isa.h>
|
||||
#include <arch/chip/tie-asm.h>
|
||||
#include <arch/xtensa/xtensa_coproc.h>
|
||||
#include <arch/xtensa/xtensa_specregs.h>
|
||||
|
||||
#if XCHAL_CP_NUM > 0
|
||||
|
||||
/****************************************************************************
|
||||
* Public Data
|
||||
****************************************************************************/
|
||||
|
||||
.section .rodata, "a"
|
||||
|
||||
/* Offset to CP n save area in thread's CP save area. */
|
||||
|
||||
.global _xtensa_coproc_saoffsets
|
||||
.type _xtensa_coproc_saoffsets, @object
|
||||
.align 16 /* Minimize crossing cache boundaries */
|
||||
|
||||
_xtensa_coproc_saoffsets:
|
||||
|
||||
.word XTENSA_CP0_SA, XTENSA_CP1_SA, XTENSA_CP2_SA, XTENSA_CP3_SA
|
||||
.word XTENSA_CP4_SA, XTENSA_CP5_SA, XTENSA_CP6_SA, XTENSA_CP7_SA
|
||||
|
||||
.size _xtensa_coproc_saoffsets, . - _xtensa_coproc_saoffsets
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
@@ -181,8 +201,6 @@ xtensa_coproc_release:
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
.extern _xt_coproc_sa_offset /* External reference */
|
||||
|
||||
.global _xtensa_coproc_savestate
|
||||
.type _xtensa_coproc_savestate, @function
|
||||
|
||||
@@ -203,12 +221,12 @@ _xtensa_coproc_savestate:
|
||||
beqz a15, .Ldone /* if none then nothing to do */
|
||||
|
||||
s16i a2, a15, XTENSA_CPCSST /* Save mask of CPs being stored */
|
||||
movi a13, _xt_coproc_sa_offset /* Array of CP save offsets */
|
||||
movi a13, _xtensa_coproc_saoffsets /* Array of CP save offsets */
|
||||
l32i a15, a15, XTENSA_CPASA /* a15 = base of aligned save area */
|
||||
|
||||
#if XTENSA_CP0_SA_SIZE > 0
|
||||
bbci.l a2, 0, 2f /* CP 0 not enabled */
|
||||
l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[0] */
|
||||
l32i a14, a13, 0 /* a14 = _xtensa_coproc_saoffsets[0] */
|
||||
add a3, a14, a15 /* a3 = save area for CP 0 */
|
||||
xchal_cp0_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL
|
||||
2:
|
||||
@@ -216,7 +234,7 @@ _xtensa_coproc_savestate:
|
||||
|
||||
#if XTENSA_CP1_SA_SIZE > 0
|
||||
bbci.l a2, 1, 2f /* CP 1 not enabled */
|
||||
l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[1] */
|
||||
l32i a14, a13, 4 /* a14 = _xtensa_coproc_saoffsets[1] */
|
||||
add a3, a14, a15 /* a3 = save area for CP 1 */
|
||||
xchal_cp1_store a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL
|
||||
2:
|
||||
@@ -316,12 +334,12 @@ _xtensa_coproc_restorestate:
|
||||
xor a3, a3, a2 /* Clear the ones being restored */
|
||||
s32i a3, a15, XTENSA_CPCSST /* Update saved CP mask */
|
||||
|
||||
movi a13, _xt_coproc_sa_offset /* Array of CP save offsets */
|
||||
movi a13, _xtensa_coproc_saoffsets /* Array of CP save offsets */
|
||||
l32i a15, a15, XTENSA_CPASA /* a15 = base of aligned save area */
|
||||
|
||||
#if XTENSA_CP0_SA_SIZE
|
||||
bbci.l a2, 0, 2f /* CP 0 not enabled */
|
||||
l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[0] */
|
||||
l32i a14, a13, 0 /* a14 = _xtensa_coproc_saoffsets[0] */
|
||||
add a3, a14, a15 /* a3 = save area for CP 0 */
|
||||
xchal_cp0_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL
|
||||
2:
|
||||
@@ -329,7 +347,7 @@ _xtensa_coproc_restorestate:
|
||||
|
||||
#if XTENSA_CP1_SA_SIZE
|
||||
bbci.l a2, 1, 2f /* CP 1 not enabled */
|
||||
l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[1] */
|
||||
l32i a14, a13, 4 /* a14 = _xtensa_coproc_saoffsets[1] */
|
||||
add a3, a14, a15 /* a3 = save area for CP 1 */
|
||||
xchal_cp1_load a3, a4, a5, a6, a7 continue=0 ofs=-1 select=XTHAL_SAS_TIE|XTHAL_SAS_NOCC|XTHAL_SAS_CALE alloc=XTHAL_SAS_ALL
|
||||
2:
|
||||
|
||||
@@ -0,0 +1,46 @@
|
||||
/****************************************************************************
|
||||
* arch/xtensa/src/common/xtensa_cpsave.c
|
||||
*
|
||||
* Copyright (C) 2016 Gregory Nutt. All rights reserved.
|
||||
* Author: Gregory Nutt <gnutt@nuttx.org>
|
||||
*
|
||||
* Redistribution and use in source and binary forms, with or without
|
||||
* modification, are permitted provided that the following conditions
|
||||
* are met:
|
||||
*
|
||||
* 1. Redistributions of source code must retain the above copyright
|
||||
* notice, this list of conditions and the following disclaimer.
|
||||
* 2. Redistributions in binary form must reproduce the above copyright
|
||||
* notice, this list of conditions and the following disclaimer in
|
||||
* the documentation and/or other materials provided with the
|
||||
* distribution.
|
||||
* 3. Neither the name NuttX nor the names of its contributors may be
|
||||
* used to endorse or promote products derived from this software
|
||||
* without specific prior written permission.
|
||||
*
|
||||
* THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
|
||||
* "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
|
||||
* LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS
|
||||
* FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE
|
||||
* COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT,
|
||||
* INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING,
|
||||
* BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS
|
||||
* OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED
|
||||
* AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
|
||||
* LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN
|
||||
* ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
|
||||
* POSSIBILITY OF SUCH DAMAGE.
|
||||
*
|
||||
****************************************************************************/
|
||||
|
||||
/****************************************************************************
|
||||
* Included Files
|
||||
****************************************************************************/
|
||||
|
||||
#include <nuttx/config.h>
|
||||
|
||||
#include "xtensa.h"
|
||||
|
||||
/****************************************************************************
|
||||
* Public Functions
|
||||
****************************************************************************/
|
||||
@@ -40,11 +40,11 @@ HEAD_CSRC = esp32_start.c
|
||||
|
||||
# Common XTENSA files (arch/xtensa/src/common)
|
||||
|
||||
CMN_ASRCS = xtensa_context.S xtensa_cpuint.S xtensa_vectors.S
|
||||
CMN_ASRCS += xtensa_inthandlers.S xtensa_nmihandler.S
|
||||
CMN_ASRCS = xtensa_context.S xtensa_coproc.S xtensa_cpuint.S
|
||||
CMN_ASRCS += xtensa_inthandlers.S xtensa_nmihandler.S xtensa_vectors.S
|
||||
|
||||
CMN_CSRCS = xtensa_assert.c xtensa_blocktask.c xtensa_copystate.c
|
||||
CMN_CSRCS += xtensa_createstack.c xtensa_exit.c xtensa_idle.c
|
||||
CMN_CSRCS += xtensa_cpsave.c xtensa_createstack.c xtensa_exit.c xtensa_idle.c
|
||||
CMN_CSRCS += xtensa_initialize.c xtensa_initialstate.c xtensa_interruptcontext.c
|
||||
CMN_CSRCS += xtensa_irqdispatch.c xtensa_lowputs.c xtensa_mdelay.c
|
||||
CMN_CSRCS += xtensa_modifyreg8.c xtensa_modifyreg16.c xtensa_modifyreg32.c
|
||||
|
||||
Reference in New Issue
Block a user