From a90d0bbf2e7f2e85c30262692e9187ab7e64834b Mon Sep 17 00:00:00 2001 From: Gregory Nutt Date: Fri, 28 Oct 2016 11:19:23 -0600 Subject: [PATCH] ESP32: A little more co-processor logic. Still not complete. --- arch/xtensa/src/common/xtensa_coproc.S | 34 ++++++++++++++----- arch/xtensa/src/common/xtensa_cpsave.c | 46 ++++++++++++++++++++++++++ arch/xtensa/src/esp32/Make.defs | 6 ++-- 3 files changed, 75 insertions(+), 11 deletions(-) create mode 100644 arch/xtensa/src/common/xtensa_cpsave.c diff --git a/arch/xtensa/src/common/xtensa_coproc.S b/arch/xtensa/src/common/xtensa_coproc.S index 64f141092f9..16327e21917 100644 --- a/arch/xtensa/src/common/xtensa_coproc.S +++ b/arch/xtensa/src/common/xtensa_coproc.S @@ -41,10 +41,30 @@ #include #include +#include #include #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: diff --git a/arch/xtensa/src/common/xtensa_cpsave.c b/arch/xtensa/src/common/xtensa_cpsave.c new file mode 100644 index 00000000000..12fadeaabd2 --- /dev/null +++ b/arch/xtensa/src/common/xtensa_cpsave.c @@ -0,0 +1,46 @@ +/**************************************************************************** + * arch/xtensa/src/common/xtensa_cpsave.c + * + * Copyright (C) 2016 Gregory Nutt. All rights reserved. + * Author: Gregory Nutt + * + * 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 + +#include "xtensa.h" + +/**************************************************************************** + * Public Functions + ****************************************************************************/ diff --git a/arch/xtensa/src/esp32/Make.defs b/arch/xtensa/src/esp32/Make.defs index 64c855df37b..e14655286d2 100644 --- a/arch/xtensa/src/esp32/Make.defs +++ b/arch/xtensa/src/esp32/Make.defs @@ -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