Update ESP32 port to ESP-IDF release v4.2 and add ESP-IDF version check (#231)
* Revert "Reintroduce Espressif's IDF v4.2 changes to ESP32 port (#193)"
This reverts commit 3d4d17178fe70621e129ec564494f823ef0253dd.
* Update ESP32 port files to work with ESP-IDF v4.2 as well as ESP-IDF v3.3
Add changes required to support ESP32-S2
* portmacro.h: Change return type of vApplicationSleep to void
This fixes build failure when automatic light sleep is enabled
* prevent header checks for files with different licensing
Co-authored-by: David Chalco <david@chalco.io>
diff --git a/.github/scripts/kernel_checker.py b/.github/scripts/kernel_checker.py
index 1a48000..91620ec 100755
--- a/.github/scripts/kernel_checker.py
+++ b/.github/scripts/kernel_checker.py
@@ -6,6 +6,10 @@
#--------------------------------------------------------------------------------------------------
# CONFIG
#--------------------------------------------------------------------------------------------------
+KERNEL_IGNORED_FILES = [
+ 'FreeRTOS-openocd.c'
+]
+
KERNEL_IGNORED_EXTENSIONS = [
'.yml',
'.css',
@@ -30,7 +34,13 @@
]
KERNEL_IGNORED_PATTERNS = [
- r'.*\.git.*'
+ r'.*\.git.*',
+ r'.*portable.*Xtensa_ESP32\/include\/portmacro\.h',
+ r'.*portable.*Xtensa_ESP32.*port\.c',
+ r'.*portable.*Xtensa_ESP32.*portasm\.S',
+ r'.*portable.*Xtensa_ESP32.*xtensa_.*',
+ r'.*portable.*Xtensa_ESP32.*portmux_impl.*',
+ r'.*portable.*Xtensa_ESP32.*xt_asm_utils\.h'
]
KERNEL_HEADER = [
@@ -70,6 +80,7 @@
checker = HeaderChecker(KERNEL_HEADER)
checker.ignoreExtension(*KERNEL_IGNORED_EXTENSIONS)
checker.ignorePattern(*KERNEL_IGNORED_PATTERNS)
+ checker.ignoreFile(*KERNEL_IGNORED_FILES)
checker.ignoreFile(os.path.split(__file__)[-1])
return checker.processArgs(args)
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h b/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h
index 03ab18e..eba402d 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/include/portmacro.h
@@ -82,6 +82,7 @@
#include <xtensa/xtruntime.h>
#include "esp_timer.h" /* required for FreeRTOS run time stats */
#include "esp_system.h"
+ #include "esp_idf_version.h"
#include <esp_heap_caps.h>
@@ -134,9 +135,9 @@
/* owner field values:
* 0 - Uninitialized (invalid)
* portMUX_FREE_VAL - Mux is free, can be locked by either CPU
- * CORE_ID_PRO / CORE_ID_APP - Mux is locked to the particular core
+ * CORE_ID_REGVAL_PRO / CORE_ID_REGVAL_APP - Mux is locked to the particular core
*
- * Any value other than portMUX_FREE_VAL, CORE_ID_PRO, CORE_ID_APP indicates corruption
+ * Any value other than portMUX_FREE_VAL, CORE_ID_REGVAL_PRO, CORE_ID_REGVAL_APP indicates corruption
*/
uint32_t owner;
@@ -283,8 +284,11 @@
/*Because the ROM routines don't necessarily handle a stack in external RAM correctly, we force */
/*the stack memory to always be internal. */
- #define pvPortMallocTcbMem( size ) heap_caps_malloc( size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT )
- #define pvPortMallocStackMem( size ) heap_caps_malloc( size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT )
+ #define portTcbMemoryCaps (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)
+ #define portStackMemoryCaps (MALLOC_CAP_INTERNAL|MALLOC_CAP_8BIT)
+
+ #define pvPortMallocTcbMem(size) heap_caps_malloc(size, portTcbMemoryCaps)
+ #define pvPortMallocStackMem(size) heap_caps_malloc(size, portStackMemoryCaps)
/*xTaskCreateStatic uses these functions to check incoming memory. */
#define portVALID_TCB_MEM( ptr ) ( esp_ptr_internal( ptr ) && esp_ptr_byte_accessible( ptr ) )
@@ -307,6 +311,14 @@
uint32_t compare,
uint32_t * set )
{
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+ __asm__ __volatile__ (
+ "WSR %2,SCOMPARE1 \n"
+ "S32C1I %0, %1, 0 \n"
+ : "=r" ( *set )
+ : "r" ( addr ), "r" ( compare ), "0" ( *set )
+ );
+ #else
#if ( XCHAL_HAVE_S32C1I > 0 )
__asm__ __volatile__ (
"WSR %2,SCOMPARE1 \n"
@@ -333,11 +345,21 @@
*set = old_value;
#endif /* if ( XCHAL_HAVE_S32C1I > 0 ) */
+ #endif /* #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0)) */
}
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
void uxPortCompareSetExtram( volatile uint32_t * addr,
uint32_t compare,
uint32_t * set );
+ #else
+ static inline void uxPortCompareSetExtram(volatile uint32_t *addr, uint32_t compare, uint32_t *set)
+ {
+ #if defined(CONFIG_ESP32_SPIRAM_SUPPORT)
+ compare_and_set_extram(addr, compare, set);
+ #endif
+ }
+ #endif
/*-----------------------------------------------------------*/
@@ -408,11 +430,37 @@
#define PRIVILEGED_DATA
#endif
- bool vApplicationSleep( TickType_t xExpectedIdleTime );
+ void vApplicationSleep( TickType_t xExpectedIdleTime );
+ void vPortSetStackWatchpoint( void* pxStackStart );
#define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime )
+ /*-----------------------------------------------------------*/
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
+ /* Architecture specific optimisations. */
+
+ #if configUSE_PORT_OPTIMISED_TASK_SELECTION == 1
+
+ /* Check the configuration. */
+ #if( configMAX_PRIORITIES > 32 )
+ #error configUSE_PORT_OPTIMISED_TASK_SELECTION can only be set to 1 when configMAX_PRIORITIES is less than or equal to 32. It is very rare that a system requires more than 10 to 15 different priorities as tasks that share a priority will time slice.
+ #endif
+
+ /* Store/clear the ready priorities in a bit map. */
+ #define portRECORD_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) |= ( 1UL << ( uxPriority ) )
+ #define portRESET_READY_PRIORITY( uxPriority, uxReadyPriorities ) ( uxReadyPriorities ) &= ~( 1UL << ( uxPriority ) )
+
+ /*-----------------------------------------------------------*/
+
+ #define portGET_HIGHEST_PRIORITY( uxTopPriority, uxReadyPriorities ) uxTopPriority = ( 31 - __builtin_clz( ( uxReadyPriorities ) ) )
+
+ #endif /* configUSE_PORT_OPTIMISED_TASK_SELECTION */
+
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
+
+ /*-----------------------------------------------------------*/
+
void _xt_coproc_release( volatile void * coproc_sa_base );
@@ -429,6 +477,15 @@
#define xPortGetFreeHeapSize esp_get_free_heap_size
#define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+/*
+ * Send an interrupt to another core in order to make the task running
+ * on it yield for a higher-priority task.
+ */
+
+ void vPortYieldOtherCore( BaseType_t coreid ) PRIVILEGED_FUNCTION;
+
+#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
/*
* Callback to set a watchpoint on the end of the stack. Called every context switch to change the stack
@@ -442,6 +499,7 @@
*/
BaseType_t xPortInIsrContext();
+
/*
* This function will be called in High prio ISRs. Returns true if the current core was in ISR context
* before calling into high prio ISR context.
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h b/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h
new file mode 100644
index 0000000..e16d4b3
--- /dev/null
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/include/xt_asm_utils.h
@@ -0,0 +1,88 @@
+/*
+ * Copyright (c) 2017, Intel Corporation
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ */
+
+/* Copyright 2015-2018 Espressif Systems (Shanghai) PTE LTD
+ *
+ * Licensed 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 adapted to use on IDF FreeRTOS component, extracted
+ * originally from zephyr RTOS code base:
+ * https://github.com/zephyrproject-rtos/zephyr/blob/dafd348/arch/xtensa/include/xtensa-asm2-s.h
+ */
+
+#ifndef __XT_ASM_UTILS_H
+#define __XT_ASM_UTILS_H
+
+/*
+ * SPILL_ALL_WINDOWS
+ *
+ * Spills all windowed registers (i.e. registers not visible as
+ * A0-A15) to their ABI-defined spill regions on the stack.
+ *
+ * Unlike the Xtensa HAL implementation, this code requires that the
+ * EXCM and WOE bit be enabled in PS, and relies on repeated hardware
+ * exception handling to do the register spills. The trick is to do a
+ * noop write to the high registers, which the hardware will trap
+ * (into an overflow exception) in the case where those registers are
+ * already used by an existing call frame. Then it rotates the window
+ * and repeats until all but the A0-A3 registers of the original frame
+ * are guaranteed to be spilled, eventually rotating back around into
+ * the original frame. Advantages:
+ *
+ * - Vastly smaller code size
+ *
+ * - More easily maintained if changes are needed to window over/underflow
+ * exception handling.
+ *
+ * - Requires no scratch registers to do its work, so can be used safely in any
+ * context.
+ *
+ * - If the WOE bit is not enabled (for example, in code written for
+ * the CALL0 ABI), this becomes a silent noop and operates compatbily.
+ *
+ * - Hilariously it's ACTUALLY FASTER than the HAL routine. And not
+ * just a little bit, it's MUCH faster. With a mostly full register
+ * file on an LX6 core (ESP-32) I'm measuring 145 cycles to spill
+ * registers with this vs. 279 (!) to do it with
+ * xthal_spill_windows().
+ */
+
+.macro SPILL_ALL_WINDOWS
+#if XCHAL_NUM_AREGS == 64
+ and a12, a12, a12
+ rotw 3
+ and a12, a12, a12
+ rotw 3
+ and a12, a12, a12
+ rotw 3
+ and a12, a12, a12
+ rotw 3
+ and a12, a12, a12
+ rotw 4
+#elif XCHAL_NUM_AREGS == 32
+ and a12, a12, a12
+ rotw 3
+ and a12, a12, a12
+ rotw 3
+ and a4, a4, a4
+ rotw 2
+#else
+#error Unrecognized XCHAL_NUM_AREGS
+#endif
+.endm
+
+#endif
\ No newline at end of file
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h b/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h
index 5a76201..031db65 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/include/xtensa_context.h
@@ -45,6 +45,7 @@
#include <xtensa/corebits.h>
#include <xtensa/config/system.h>
#include <xtensa/xtruntime-frames.h>
+#include <esp_idf_version.h>
/* Align a value up to nearest n-byte boundary, where n is a power of 2. */
@@ -325,8 +326,19 @@
.endm
#endif
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
#define CORE_ID_PRO 0xCDCD
#define CORE_ID_APP 0xABAB
+#else
+#define CORE_ID_REGVAL_PRO 0xCDCD
+#define CORE_ID_REGVAL_APP 0xABAB
+
+/* Included for compatibility, recommend using CORE_ID_REGVAL_PRO instead */
+#define CORE_ID_PRO CORE_ID_REGVAL_PRO
+
+/* Included for compatibility, recommend using CORE_ID_REGVAL_APP instead */
+#define CORE_ID_APP CORE_ID_REGVAL_APP
+#endif
/*
-------------------------------------------------------------------------------
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/port.c b/portable/ThirdParty/GCC/Xtensa_ESP32/port.c
index d3666a5..639e9f4 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/port.c
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/port.c
@@ -96,24 +96,31 @@
#include <xtensa/config/core.h>
#include "xtensa_rtos.h"
+#include "esp_idf_version.h"
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+#include "rom/ets_sys.h"
+#include "esp_panic.h"
+#include "esp_crosscore_int.h"
+#else
#if CONFIG_IDF_TARGET_ESP32S2
#include "esp32s2/rom/ets_sys.h"
#elif CONFIG_IDF_TARGET_ESP32
#include "esp32/rom/ets_sys.h"
#endif
+#include "esp_private/panic_reason.h"
+#include "esp_debug_helpers.h"
+#include "esp_private/crosscore_int.h"
+#include "esp_log.h"
+#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
#include "soc/cpu.h"
#include "FreeRTOS.h"
#include "task.h"
-#include "esp_private/panic_reason.h"
-#include "esp_debug_helpers.h"
#include "esp_heap_caps.h"
-#include "esp_private/crosscore_int.h"
#include "esp_intr_alloc.h"
-#include "esp_log.h"
/* Defined in portasm.h */
extern void _frxt_tick_timer_init( void );
@@ -488,6 +495,8 @@
{
uint32_t prev;
+ uint32_t oldlevel = portENTER_CRITICAL_NESTED();
+
#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
vPortCPUAcquireMutexIntsDisabled( &extram_mux, portMUX_NO_TIMEOUT, __FUNCTION__, __LINE__ );
#else
@@ -506,6 +515,8 @@
#else
vPortCPUReleaseMutexIntsDisabled( &extram_mux );
#endif
+
+ portEXIT_CRITICAL_NESTED(oldlevel);
}
#endif //defined(CONFIG_SPIRAM_SUPPORT)
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S b/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S
index 7884cf4..8985bf3 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/portasm.S
@@ -25,6 +25,7 @@
#include "xtensa_rtos.h"
#include "sdkconfig.h"
+#include "esp_idf_version.h"
#define TOPOFSTACK_OFFS 0x00 /* StackType_t *pxTopOfStack */
#define CP_TOPOFSTACK_OFFS 0x04 /* xMPU_SETTINGS.coproc_area */
@@ -138,6 +139,7 @@
mull a2, a4, a2
add a1, a1, a2 /* for current proc */
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef CONFIG_FREERTOS_FPU_IN_ISR
#if XCHAL_CP_NUM > 0
rsr a3, CPENABLE /* Restore thread scope CPENABLE */
@@ -145,9 +147,11 @@
s32i a3, a1, 0 /* its trigger */
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
.Lnested:
1:
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef CONFIG_FREERTOS_FPU_IN_ISR
#if XCHAL_CP_NUM > 0
movi a3, 0 /* whilst ISRs pending keep CPENABLE exception active */
@@ -155,6 +159,7 @@
rsync
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
mov a0, a12 /* restore return addr and return */
ret
@@ -192,6 +197,7 @@
s32i a2, a3, 0 /* save nesting count */
bnez a2, .Lnesting /* !=0 after decr so still nested */
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef CONFIG_FREERTOS_FPU_IN_ISR
#if XCHAL_CP_NUM > 0
l32i a3, sp, 0 /* Grab last CPENABLE before leave ISR */
@@ -200,6 +206,7 @@
rsync /* ensure CPENABLE was modified */
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
movi a2, pxCurrentTCB
addx4 a2, a4, a2
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h b/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h
index 4c2f9dc..791d05e 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.h
@@ -48,7 +48,11 @@
#include "portable.h"
/* XOR one core ID with this value to get the other core ID */
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
#define CORE_ID_XOR_SWAP ( CORE_ID_PRO ^ CORE_ID_APP )
+#else
+#define CORE_ID_REGVAL_XOR_SWAP (CORE_ID_REGVAL_PRO ^ CORE_ID_REGVAL_APP)
+#endif
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h b/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h
index e98d488..b19ce83 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/portmux_impl.inc.h
@@ -70,7 +70,11 @@
#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
uint32_t owner = mux->owner;
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
if( ( owner != portMUX_FREE_VAL ) && ( owner != CORE_ID_PRO ) && ( owner != CORE_ID_APP ) )
+ #else
+ if (owner != portMUX_FREE_VAL && owner != CORE_ID_REGVAL_PRO && owner != CORE_ID_REGVAL_APP)
+ #endif
{
ets_printf( "ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)! Called from %s line %d.\n", mux, owner, fnName, line );
mux->owner = portMUX_FREE_VAL;
@@ -84,7 +88,11 @@
/* Note: coreID is the full 32 bit core ID (CORE_ID_PRO/CORE_ID_APP),
* not the 0/1 value returned by xPortGetCoreID()
*/
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
otherCoreID = CORE_ID_XOR_SWAP ^ coreID;
+ #else
+ otherCoreID = CORE_ID_REGVAL_XOR_SWAP ^ coreID;
+ #endif
do
{
@@ -163,7 +171,11 @@
mux->lastLockedLine = line;
uint32_t owner = mux->owner;
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
if( ( owner != portMUX_FREE_VAL ) && ( owner != CORE_ID_PRO ) && ( owner != CORE_ID_APP ) )
+ #else
+ if (owner != portMUX_FREE_VAL && owner != CORE_ID_REGVAL_PRO && owner != CORE_ID_REGVAL_APP)
+ #endif
{
ets_printf( "ERROR: vPortCPUReleaseMutex: mux %p is invalid (0x%x)!\n", mux, mux->owner );
}
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S
index fedf428..9020a76 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_context.S
@@ -51,6 +51,10 @@
#include "xtensa_rtos.h"
#include "xtensa_context.h"
+#include "esp_idf_version.h"
+#if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
+#include "xt_asm_utils.h"
+#endif
#ifdef XT_USE_OVLY
#include <xtensa/overlay_os_asm.h>
@@ -58,8 +62,6 @@
.text
-
-
/*******************************************************************************
_xt_context_save
@@ -97,6 +99,7 @@
.align 4
.literal_position
.align 4
+
_xt_context_save:
s32i a2, sp, XT_STK_A2
@@ -143,6 +146,7 @@
mov a9, a0 /* preserve ret addr */
#endif
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
#ifndef __XTENSA_CALL0_ABI__
/*
To spill the reg windows, temp. need pre-interrupt stack ptr and a4-15.
@@ -175,25 +179,76 @@
l32i a13, sp, XT_STK_TMP1
l32i a9, sp, XT_STK_TMP2
#endif
+ #endif /* (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0)) */
+
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
+ s32i a12, sp, XT_STK_TMP0 /* temp. save stuff in stack frame */
+ s32i a13, sp, XT_STK_TMP1
+ s32i a9, sp, XT_STK_TMP2
+
+ l32i a12, sp, XT_STK_A12 /* recover original a9,12,13 */
+ l32i a13, sp, XT_STK_A13
+ l32i a9, sp, XT_STK_A9
+ #endif
#if XCHAL_EXTRA_SA_SIZE > 0
- /*
- NOTE: Normally the xthal_save_extra_nw macro only affects address
- registers a2-a5. It is theoretically possible for Xtensa processor
- designers to write TIE that causes more address registers to be
- affected, but it is generally unlikely. If that ever happens,
- more registers need to be saved/restored around this macro invocation.
- Here we assume a9,12,13 are preserved.
- Future Xtensa tools releases might limit the regs that can be affected.
- */
addi a2, sp, XT_STK_EXTRA /* where to save it */
# if XCHAL_EXTRA_SA_ALIGN > 16
movi a3, -XCHAL_EXTRA_SA_ALIGN
and a2, a2, a3 /* align dynamically >16 bytes */
# endif
- call0 xthal_save_extra_nw /* destroys a0,2,3,4,5 */
+ call0 xthal_save_extra_nw /* destroys a0,2,3 */
#endif
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
+ #ifndef __XTENSA_CALL0_ABI__
+ #ifdef XT_USE_OVLY
+ l32i a9, sp, XT_STK_PC /* recover saved PC */
+ _xt_overlay_get_state a9, a12, a13
+ s32i a9, sp, XT_STK_OVLY /* save overlay state */
+ #endif
+
+ /* SPILL_ALL_WINDOWS macro requires window overflow exceptions to be enabled,
+ * i.e. PS.EXCM cleared and PS.WOE set.
+ * Since we are going to clear PS.EXCM, we also need to increase INTLEVEL
+ * at least to XCHAL_EXCM_LEVEL. This matches that value of effective INTLEVEL
+ * at entry (CINTLEVEL=max(PS.INTLEVEL, XCHAL_EXCM_LEVEL) when PS.EXCM is set.
+ * Since WindowOverflow exceptions will trigger inside SPILL_ALL_WINDOWS,
+ * need to save/restore EPC1 as well.
+ * Note: even though a4-a15 are saved into the exception frame, we should not
+ * clobber them until after SPILL_ALL_WINDOWS. This is because these registers
+ * may contain live windows belonging to previous frames in the call stack.
+ * These frames will be spilled by SPILL_ALL_WINDOWS, and if the register was
+ * used as a temporary by this code, the temporary value would get stored
+ * onto the stack, instead of the real value.
+ */
+ rsr a2, PS /* to be restored after SPILL_ALL_WINDOWS */
+ movi a0, PS_INTLEVEL_MASK
+ and a3, a2, a0 /* get the current INTLEVEL */
+ bgeui a3, XCHAL_EXCM_LEVEL, 1f /* calculate max(INTLEVEL, XCHAL_EXCM_LEVEL) */
+ movi a3, XCHAL_EXCM_LEVEL
+1:
+ movi a0, PS_UM | PS_WOE /* clear EXCM, enable window overflow, set new INTLEVEL */
+ or a3, a3, a0
+ wsr a3, ps
+ rsr a0, EPC1 /* to be restored after SPILL_ALL_WINDOWS */
+
+ addi sp, sp, XT_STK_FRMSZ /* restore the interruptee's SP */
+ SPILL_ALL_WINDOWS
+ addi sp, sp, -XT_STK_FRMSZ /* return the current stack pointer and proceed with context save*/
+
+
+ wsr a2, PS /* restore to the value at entry */
+ rsync
+ wsr a0, EPC1 /* likewise */
+
+ #endif /* __XTENSA_CALL0_ABI__ */
+
+ l32i a12, sp, XT_STK_TMP0 /* restore the temp saved registers */
+ l32i a13, sp, XT_STK_TMP1 /* our return address is there */
+ l32i a9, sp, XT_STK_TMP2
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
+
#if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__)
mov a0, a9 /* retrieve ret addr */
#endif
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c
index 2bf1da7..1862ddd 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_init.c
@@ -34,11 +34,16 @@
#endif
#include "xtensa_rtos.h"
+#include "esp_idf_version.h"
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+#include "esp_clk.h"
+#else
#if CONFIG_IDF_TARGET_ESP32S2
#include "esp32s2/clk.h"
#elif CONFIG_IDF_TARGET_ESP32
#include "esp32/clk.h"
#endif
+#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
#ifdef XT_RTOS_TIMER_INT
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c
index 93e4160..3ed8d10 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_intr.c
@@ -33,12 +33,17 @@
#include "freertos/FreeRTOS.h"
#include "freertos/xtensa_api.h"
#include "freertos/portable.h"
+#include "esp_idf_version.h"
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+#include "rom/ets_sys.h"
+#else
#if CONFIG_IDF_TARGET_ESP32S2
#include "esp32s2/rom/ets_sys.h"
#elif CONFIG_IDF_TARGET_ESP32
#include "esp32/rom/ets_sys.h"
#endif
+#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
#if XCHAL_HAVE_EXCEPTIONS
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S
index 6ce34dd..b760e0e 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vector_defaults.S
@@ -13,7 +13,12 @@
// limitations under the License.
#include "xtensa_rtos.h"
+#include "esp_idf_version.h"
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+#include "esp_panic.h"
+#else
#include "esp_private/panic_reason.h"
+#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
#include "sdkconfig.h"
#include "soc/soc.h"
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S
index eb0729f..a93f655 100644
--- a/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S
+++ b/portable/ThirdParty/GCC/Xtensa_ESP32/xtensa_vectors.S
@@ -91,7 +91,12 @@
*******************************************************************************/
#include "xtensa_rtos.h"
+#include "esp_idf_version.h"
+#if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+#include "esp_panic.h"
+#else
#include "esp_private/panic_reason.h"
+#endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
#include "sdkconfig.h"
#include "soc/soc.h"
@@ -226,11 +231,13 @@
*/
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
rsr a0, EXCSAVE_1 + \level - 1 /* Get exception frame pointer stored in EXCSAVE_x */
l32i a3, a0, XT_STK_A0 /* Copy pre-exception a0 (return address) */
s32e a3, a1, -16
l32i a3, a0, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */
s32e a3, a1, -12
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Backtracing only needs a0 and a1, no need to create full base save area.
Also need to change current frame's return address to point to pre-exception's
last run instruction.
@@ -734,10 +741,12 @@
*/
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
l32i a3, sp, XT_STK_A0 /* Copy pre-exception a0 (return address) */
s32e a3, sp, -16
l32i a3, sp, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */
s32e a3, sp, -12
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
rsr a0, EPC_1 /* return address for debug backtrace */
movi a5, 0xC0000000 /* constant with top 2 bits set (call size) */
rsync /* wait for WSR.PS to complete */
@@ -983,10 +992,13 @@
/* Get co-processor state save area of new owner thread. */
call0 XT_RTOS_CP_STATE /* a15 = new owner's save area */
-
+ #if (ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0))
+ beqz a15, .L_goto_invalid /* not in a thread (invalid) */
+ #else
#ifndef CONFIG_FREERTOS_FPU_IN_ISR
beqz a15, .L_goto_invalid
#endif
+ #endif /* ESP_IDF_VERSION < ESP_IDF_VERSION_VAL(4, 2, 0) */
/*When FPU in ISR is enabled we could deal with zeroed a15 */
@@ -1034,8 +1046,12 @@
/* below, because on restoring from ISR we may have new == old condition used
* to force cp restore to next thread
*/
- #ifndef CONFIG_FREERTOS_FPU_IN_ISR
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
+ #ifndef CONFIG_FREERTOS_FPU_IN_ISR
+ #endif
beq a15, a2, .L_goto_done /* new owner == old, we're done */
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
+ #endif
#endif
/* If no old owner then nothing to save. */
@@ -1078,7 +1094,9 @@
.L_check_new:
/* Check if any state has to be restored for new owner. */
/* NOTE: a15 = new owner's save area, cannot be zero when we get here. */
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
beqz a15, .L_xt_coproc_done
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
l16ui a3, a15, XT_CPSTORED /* a3 = new owner's CPSTORED */
movi a4, _xt_coproc_sa_offset
@@ -1164,6 +1182,7 @@
movi a0, _xt_user_exit /* save exit point for dispatch */
s32i a0, sp, XT_STK_EXIT
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
/* EXCSAVE_1 should now be free to use. Use it to keep a copy of the
current stack pointer that points to the exception frame (XT_STK_FRAME).*/
#ifdef XT_DEBUG_BACKTRACE
@@ -1172,6 +1191,7 @@
wsr a0, EXCSAVE_1
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Save rest of interrupt context and enter RTOS. */
@@ -1256,12 +1276,14 @@
/* EXCSAVE_2 should now be free to use. Use it to keep a copy of the
current stack pointer that points to the exception frame (XT_STK_FRAME).*/
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
mov a0, sp
wsr a0, EXCSAVE_2
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Save rest of interrupt context and enter RTOS. */
@@ -1337,12 +1359,14 @@
/* EXCSAVE_3 should now be free to use. Use it to keep a copy of the
current stack pointer that points to the exception frame (XT_STK_FRAME).*/
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
mov a0, sp
wsr a0, EXCSAVE_3
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Save rest of interrupt context and enter RTOS. */
@@ -1417,12 +1441,14 @@
/* EXCSAVE_4 should now be free to use. Use it to keep a copy of the
current stack pointer that points to the exception frame (XT_STK_FRAME).*/
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
mov a0, sp
wsr a0, EXCSAVE_4
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Save rest of interrupt context and enter RTOS. */
@@ -1497,12 +1523,14 @@
/* EXCSAVE_5 should now be free to use. Use it to keep a copy of the
current stack pointer that points to the exception frame (XT_STK_FRAME).*/
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
mov a0, sp
wsr a0, EXCSAVE_5
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Save rest of interrupt context and enter RTOS. */
call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
@@ -1576,12 +1604,14 @@
/* EXCSAVE_6 should now be free to use. Use it to keep a copy of the
current stack pointer that points to the exception frame (XT_STK_FRAME).*/
+ #if (ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0))
#ifdef XT_DEBUG_BACKTRACE
#ifndef __XTENSA_CALL0_ABI__
mov a0, sp
wsr a0, EXCSAVE_6
#endif
#endif
+ #endif /* ESP_IDF_VERSION >= ESP_IDF_VERSION_VAL(4, 2, 0) */
/* Save rest of interrupt context and enter RTOS. */
call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/FreeRTOS-openocd.c b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/FreeRTOS-openocd.c
deleted file mode 100644
index 671c2de..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/FreeRTOS-openocd.c
+++ /dev/null
@@ -1,27 +0,0 @@
-/*
- * Since at least FreeRTOS V7.5.3 uxTopUsedPriority is no longer
- * present in the kernel, so it has to be supplied by other means for
- * OpenOCD's threads awareness.
- *
- * Add this file to your project, and, if you're using --gc-sections,
- * ``--undefined=uxTopUsedPriority'' (or
- * ``-Wl,--undefined=uxTopUsedPriority'' when using gcc for final
- * linking) to your LDFLAGS; same with all the other symbols you need.
- */
-
-#include "FreeRTOS.h"
-#include "esp_attr.h"
-#include "sdkconfig.h"
-
-#ifdef __GNUC__
- #define USED __attribute__( ( used ) )
-#else
- #define USED
-#endif
-
-/*
- * This file is no longer needed as AFTER FreeRTOS V10.14.1 OpenOCD is fixed in the kernel.
- * #ifdef CONFIG_ESP32_DEBUG_OCDAWARE
- * const int USED DRAM_ATTR uxTopUsedPriority = configMAX_PRIORITIES - 1;
- * #endif
- */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portbenchmark.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portbenchmark.h
deleted file mode 100644
index ce34b97..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portbenchmark.h
+++ /dev/null
@@ -1,46 +0,0 @@
-/*******************************************************************************
- * // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
- * //
- * // Permission is hereby granted, free of charge, to any person obtaining
- * // a copy of this software and associated documentation files (the
- * // "Software"), to deal in the Software without restriction, including
- * // without limitation the rights to use, copy, modify, merge, publish,
- * // distribute, sublicense, and/or sell copies of the Software, and to
- * // permit persons to whom the Software is furnished to do so, subject to
- * // the following conditions:
- * //
- * // The above copyright notice and this permission notice shall be included
- * // in all copies or substantial portions of the Software.
- * //
- * // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * --------------------------------------------------------------------------------
- */
-
-/*
- * This utility helps benchmarking interrupt latency and context switches.
- * In order to enable it, set configBENCHMARK to 1 in FreeRTOSConfig.h.
- * You will also need to download the FreeRTOS_trace patch that contains
- * portbenchmark.c and the complete version of portbenchmark.h
- */
-
-#ifndef PORTBENCHMARK_H
-#define PORTBENCHMARK_H
-
-#if configBENCHMARK
- #error "You need to download the FreeRTOS_trace patch that overwrites this file"
-#endif
-
-#define portbenchmarkINTERRUPT_DISABLE()
-#define portbenchmarkINTERRUPT_RESTORE( newstate )
-#define portbenchmarkIntLatency()
-#define portbenchmarkIntWait()
-#define portbenchmarkReset()
-#define portbenchmarkPrint()
-
-#endif /* PORTBENCHMARK */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portmacro.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portmacro.h
deleted file mode 100644
index 7835eab..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/portmacro.h
+++ /dev/null
@@ -1,489 +0,0 @@
-/*
- * FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd.
- * All rights reserved
- *
- * VISIT https://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
- *
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that has become a de facto standard. *
- * *
- * Help yourself get started quickly and support the FreeRTOS *
- * project by purchasing a FreeRTOS tutorial book, reference *
- * manual, or both from: https://www.FreeRTOS.org/Documentation *
- * *
- * Thank you! *
- * *
- ***************************************************************************
- *
- * This file is part of the FreeRTOS distribution.
- *
- * FreeRTOS is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License (version 2) as published by the
- * Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
- *
- * >>! NOTE: The modification to the GPL is included to allow you to !<<
- * >>! distribute a combined work that includes FreeRTOS without being !<<
- * >>! obliged to provide the source code for proprietary components !<<
- * >>! outside of the FreeRTOS kernel. !<<
- *
- * FreeRTOS 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. Full license text is available from the following
- * link: https://www.FreeRTOS.org/a00114.html
- *
- *
- ***************************************************************************
- * *
- * Having a problem? Start by reading the FAQ "My application does *
- * not run, what could be wrong?" *
- * *
- * https://www.FreeRTOS.org/FAQHelp.html *
- * *
- ***************************************************************************
- *
- * https://www.FreeRTOS.org - Documentation, books, training, latest versions,
- * license and Real Time Engineers Ltd. contact details.
- *
- * https://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- * including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- * compatible FAT file system, and our tiny thread aware UDP/IP stack.
- *
- * https://www.highintegritysystems.com/openrtos/ - Real Time Engineers ltd
- * license FreeRTOS to High Integrity Systems to sell under the OpenRTOS brand.
- * Low cost OpenRTOS licenses offer ticketed support, indemnification
- * and middleware.
- *
- * https://www.highintegritysystems.com/safertos/ - High Integrity Systems
- * also provide a safety engineered and independently SIL3 certified version
- * for use in safety and mission critical applications that require
- * provable dependability.
- *
- */
-
-#ifndef PORTMACRO_H
-#define PORTMACRO_H
-
-/* *INDENT-OFF* */
-#ifdef __cplusplus
- extern "C" {
-#endif
-/* *INDENT-ON* */
-
-#ifndef __ASSEMBLER__
-
- #include <stdint.h>
-
- #include <xtensa/hal.h>
- #include <xtensa/config/core.h>
- #include <xtensa/config/system.h> /* required for XSHAL_CLIB */
- #include <xtensa/xtruntime.h>
- #include "esp_timer.h" /* required for FreeRTOS run time stats */
- #include "esp_system.h"
-
-
- #include <esp_heap_caps.h>
- #include "soc/soc_memory_layout.h"
-
-/*#include "xtensa_context.h" */
-
-/*-----------------------------------------------------------
- * Port specific definitions.
- *
- * The settings in this file configure FreeRTOS correctly for the
- * given hardware and compiler.
- *
- * These settings should not be altered.
- *-----------------------------------------------------------
- */
-
-/* Type definitions. */
-
- #define portCHAR int8_t
- #define portFLOAT float
- #define portDOUBLE double
- #define portLONG int32_t
- #define portSHORT int16_t
- #define portSTACK_TYPE uint8_t
- #define portBASE_TYPE int
-
- typedef portSTACK_TYPE StackType_t;
- typedef portBASE_TYPE BaseType_t;
- typedef unsigned portBASE_TYPE UBaseType_t;
-
- #if ( configUSE_16_BIT_TICKS == 1 )
- typedef uint16_t TickType_t;
- #define portMAX_DELAY ( TickType_t ) 0xffff
- #else
- typedef uint32_t TickType_t;
- #define portMAX_DELAY ( TickType_t ) 0xffffffffUL
- #endif
-/*-----------------------------------------------------------*/
-
-/* portbenchmark */
- #include "portbenchmark.h"
-
- #include "sdkconfig.h"
- #include "esp_attr.h"
-
-/* "mux" data structure (spinlock) */
- typedef struct
- {
- /* owner field values:
- * 0 - Uninitialized (invalid)
- * portMUX_FREE_VAL - Mux is free, can be locked by either CPU
- * CORE_ID_PRO / CORE_ID_APP - Mux is locked to the particular core
- *
- * Any value other than portMUX_FREE_VAL, CORE_ID_PRO, CORE_ID_APP indicates corruption
- */
- uint32_t owner;
-
- /* count field:
- * If mux is unlocked, count should be zero.
- * If mux is locked, count is non-zero & represents the number of recursive locks on the mux.
- */
- uint32_t count;
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- const char * lastLockedFn;
- int lastLockedLine;
- #endif
- } portMUX_TYPE;
-
- #define portMUX_FREE_VAL 0xB33FFFFF
-
-/* Special constants for vPortCPUAcquireMutexTimeout() */
- #define portMUX_NO_TIMEOUT ( -1 ) /* When passed for 'timeout_cycles', spin forever if necessary */
- #define portMUX_TRY_LOCK 0 /* Try to acquire the spinlock a single time only */
-
-/* Keep this in sync with the portMUX_TYPE struct definition please. */
- #ifndef CONFIG_FREERTOS_PORTMUX_DEBUG
- #define portMUX_INITIALIZER_UNLOCKED \
- { \
- .owner = portMUX_FREE_VAL, \
- .count = 0, \
- }
- #else
- #define portMUX_INITIALIZER_UNLOCKED \
- { \
- .owner = portMUX_FREE_VAL, \
- .count = 0, \
- .lastLockedFn = "(never locked)", \
- .lastLockedLine = -1 \
- }
- #endif /* ifndef CONFIG_FREERTOS_PORTMUX_DEBUG */
-
-
- #define portASSERT_IF_IN_ISR() vPortAssertIfInISR()
- void vPortAssertIfInISR();
-
- #define portCRITICAL_NESTING_IN_TCB 1
-
-/*
- * Modifications to portENTER_CRITICAL.
- *
- * For an introduction, see "Critical Sections & Disabling Interrupts" in docs/api-guides/freertos-smp.rst
- *
- * The original portENTER_CRITICAL only disabled the ISRs. This is enough for single-CPU operation: by
- * disabling the interrupts, there is no task switch so no other tasks can meddle in the data, and because
- * interrupts are disabled, ISRs can't corrupt data structures either.
- *
- * For multiprocessing, things get a bit more hairy. First of all, disabling the interrupts doesn't stop
- * the tasks or ISRs on the other processors meddling with our CPU. For tasks, this is solved by adding
- * a spinlock to the portENTER_CRITICAL macro. A task running on the other CPU accessing the same data will
- * spinlock in the portENTER_CRITICAL code until the first CPU is done.
- *
- * For ISRs, we now also need muxes: while portENTER_CRITICAL disabling interrupts will stop ISRs on the same
- * CPU from meddling with the data, it does not stop interrupts on the other cores from interfering with the
- * data. For this, we also use a spinlock in the routines called by the ISR, but these spinlocks
- * do not disable the interrupts (because they already are).
- *
- * This all assumes that interrupts are either entirely disabled or enabled. Interrupt priority levels
- * will break this scheme.
- *
- * Remark: For the ESP32, portENTER_CRITICAL and portENTER_CRITICAL_ISR both alias vTaskEnterCritical, meaning
- * that either function can be called both from ISR as well as task context. This is not standard FreeRTOS
- * behaviour; please keep this in mind if you need any compatibility with other FreeRTOS implementations.
- */
- void vPortCPUInitializeMutex( portMUX_TYPE * mux );
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- #error CONFIG_FREERTOS_PORTMUX_DEBUG not supported in Amazon FreeRTOS
- #endif
-
- void vTaskExitCritical();
- void vTaskEnterCritical();
- static inline void vPortConsumeSpinlockArg( int unused,
- ... )
- {
- }
-
-/** @brief Acquire a portmux spinlock with a timeout
- *
- * @param mux Pointer to portmux to acquire.
- * @param timeout_cycles Timeout to spin, in CPU cycles. Pass portMUX_NO_TIMEOUT to wait forever,
- * portMUX_TRY_LOCK to try a single time to acquire the lock.
- *
- * @return true if mutex is successfully acquired, false on timeout.
- */
- bool vPortCPUAcquireMutexTimeout( portMUX_TYPE * mux,
- int timeout_cycles );
- void vPortCPUReleaseMutex( portMUX_TYPE * mux );
-
- #define portENTER_CRITICAL( ... ) do { vTaskEnterCritical(); vPortConsumeSpinlockArg( 0, ## __VA_ARGS__ ); } while( 0 )
- #define portEXIT_CRITICAL( ... ) do { vTaskExitCritical(); vPortConsumeSpinlockArg( 0, ## __VA_ARGS__ ); } while( 0 )
-
-
- #define portENTER_CRITICAL_ISR( mux ) vPortCPUAcquireMutexTimeout( mux, portMUX_NO_TIMEOUT )
- #define portEXIT_CRITICAL_ISR( mux ) vPortCPUReleaseMutex( mux )
-
- #define portENTER_CRITICAL_SAFE( mux ) \
- do { \
- if( xPortInIsrContext() ) { \
- portENTER_CRITICAL_ISR( mux ); \
- } \
- else { \
- portENTER_CRITICAL( mux ); \
- } \
- } while( 0 )
-
- #define portEXIT_CRITICAL_SAFE( mux ) \
- do { \
- if( xPortInIsrContext() ) { \
- portEXIT_CRITICAL_ISR( mux ); \
- } \
- else { \
- portEXIT_CRITICAL( mux ); \
- } \
- } while( 0 )
-
-
-/* Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? */
-/* These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level. */
-/* */
-/* Only applies to one CPU. See notes above & below for reasons not to use these. */
- #define portDISABLE_INTERRUPTS() do { XTOS_SET_INTLEVEL( XCHAL_EXCM_LEVEL ); portbenchmarkINTERRUPT_DISABLE(); } while( 0 )
- #define portENABLE_INTERRUPTS() do { portbenchmarkINTERRUPT_RESTORE( 0 ); XTOS_SET_INTLEVEL( 0 ); } while( 0 )
-
-/* Cleaner solution allows nested interrupts disabling and restoring via local registers or stack. */
-/* They can be called from interrupts too. */
-/* WARNING: Only applies to current CPU. See notes above. */
- static inline unsigned portENTER_CRITICAL_NESTED()
- {
- unsigned state = XTOS_SET_INTLEVEL( XCHAL_EXCM_LEVEL );
-
- portbenchmarkINTERRUPT_DISABLE();
- return state;
- }
- #define portEXIT_CRITICAL_NESTED( state ) do { portbenchmarkINTERRUPT_RESTORE( state ); XTOS_RESTORE_JUST_INTLEVEL( state ); } while( 0 )
-
-/* These FreeRTOS versions are similar to the nested versions above */
- #define portSET_INTERRUPT_MASK_FROM_ISR() portENTER_CRITICAL_NESTED()
- #define portCLEAR_INTERRUPT_MASK_FROM_ISR( state ) portEXIT_CRITICAL_NESTED( state )
-
-/*Because the ROM routines don't necessarily handle a stack in external RAM correctly, we force */
-/*the stack memory to always be internal. */
- #define pvPortMallocTcbMem( size ) heap_caps_malloc( size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT )
- #define pvPortMallocStackMem( size ) heap_caps_malloc( size, MALLOC_CAP_INTERNAL | MALLOC_CAP_8BIT )
-
-/*xTaskCreateStatic uses these functions to check incoming memory. */
- #define portVALID_TCB_MEM( ptr ) ( esp_ptr_internal( ptr ) && esp_ptr_byte_accessible( ptr ) )
- #ifdef CONFIG_SPIRAM_ALLOW_STACK_EXTERNAL_MEMORY
- #define portVALID_STACK_MEM( ptr ) esp_ptr_byte_accessible( ptr )
- #else
- #define portVALID_STACK_MEM( ptr ) ( esp_ptr_internal( ptr ) && esp_ptr_byte_accessible( ptr ) )
- #endif
-
-/*
- * Wrapper for the Xtensa compare-and-set instruction. This subroutine will atomically compare
- * *addr to 'compare'. If *addr == compare, *addr is set to *set. *set is updated with the previous
- * value of *addr (either 'compare' or some other value.)
- *
- * Warning: From the ISA docs: in some (unspecified) cases, the s32c1i instruction may return the
- * *bitwise inverse* of the old mem if the mem wasn't written. This doesn't seem to happen on the
- * ESP32 (portMUX assertions would fail).
- */
- static inline void uxPortCompareSet( volatile uint32_t * addr,
- uint32_t compare,
- uint32_t * set )
- {
- __asm__ __volatile__ (
- "WSR %2,SCOMPARE1 \n"
- "S32C1I %0, %1, 0 \n"
- : "=r" ( *set )
- : "r" ( addr ), "r" ( compare ), "0" ( *set )
- );
- }
-
- void uxPortCompareSetExtram( volatile uint32_t * addr,
- uint32_t compare,
- uint32_t * set );
-
-/*-----------------------------------------------------------*/
-
-/* Architecture specifics. */
- #define portSTACK_GROWTH ( -1 )
- #define portTICK_PERIOD_MS ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
- #define portBYTE_ALIGNMENT 4
- #define portNOP() XT_NOP()
-/*-----------------------------------------------------------*/
-
-/* Fine resolution time */
- #define portGET_RUN_TIME_COUNTER_VALUE() xthal_get_ccount()
-/*ccount or esp_timer are initialized elsewhere */
- #define portCONFIGURE_TIMER_FOR_RUN_TIME_STATS()
-
- #ifdef CONFIG_FREERTOS_RUN_TIME_STATS_USING_ESP_TIMER
-/* Coarse resolution time (us) */
- #define portALT_GET_RUN_TIME_COUNTER_VALUE( x ) x = ( uint32_t ) esp_timer_get_time()
- #endif
-
-
-
-/* Kernel utilities. */
- void vPortYield( void );
- void _frxt_setup_switch( void );
- #define portYIELD() vPortYield()
- #define portYIELD_FROM_ISR() { traceISR_EXIT_TO_SCHEDULER(); _frxt_setup_switch(); }
-
- static inline uint32_t xPortGetCoreID();
-
-/*-----------------------------------------------------------*/
-
-/* Task function macros as described on the FreeRTOS.org WEB site. */
- #define portTASK_FUNCTION_PROTO( vFunction, pvParameters ) void vFunction( void * pvParameters )
- #define portTASK_FUNCTION( vFunction, pvParameters ) void vFunction( void * pvParameters )
-
-/* When coprocessors are defined, we to maintain a pointer to coprocessors area. */
-/* We currently use a hack: redefine field xMPU_SETTINGS in TCB block as a structure that can hold: */
-/* MPU wrappers, coprocessor area pointer, trace code structure, and more if needed. */
-/* The field is normally used for memory protection. FreeRTOS should create another general purpose field. */
- typedef struct
- {
- #if XCHAL_CP_NUM > 0
- volatile StackType_t * coproc_area; /* Pointer to coprocessor save area; MUST BE FIRST */
- #endif
-
- #if portUSING_MPU_WRAPPERS
- /* Define here mpu_settings, which is port dependent */
- int mpu_setting; /* Just a dummy example here; MPU not ported to Xtensa yet */
- #endif
-
- #if configUSE_TRACE_FACILITY_2
- struct
- {
- /* Cf. porttraceStamp() */
- int taskstamp; /* Stamp from inside task to see where we are */
- int taskstampcount; /* A counter usually incremented when we restart the task's loop */
- } porttrace;
- #endif
- } xMPU_SETTINGS;
-
-/* Main hack to use MPU_wrappers even when no MPU is defined (warning: mpu_setting should not be accessed; otherwise move this above xMPU_SETTINGS) */
- #if ( XCHAL_CP_NUM > 0 || configUSE_TRACE_FACILITY_2 ) && !portUSING_MPU_WRAPPERS /* If MPU wrappers not used, we still need to allocate coproc area */
- #undef portUSING_MPU_WRAPPERS
- #define portUSING_MPU_WRAPPERS 1 /* Enable it to allocate coproc area */
- #define MPU_WRAPPERS_H /* Override mpu_wrapper.h to disable unwanted code */
- #define PRIVILEGED_FUNCTION
- #define PRIVILEGED_DATA
- #endif
-
- bool vApplicationSleep( TickType_t xExpectedIdleTime );
-
- #define portSUPPRESS_TICKS_AND_SLEEP( idleTime ) vApplicationSleep( idleTime )
-
-
-
- void _xt_coproc_release( volatile void * coproc_sa_base );
-
-
-/*
- * Map to the memory management routines required for the port.
- *
- * Note that libc standard malloc/free are also available for
- * non-FreeRTOS-specific code, and behave the same as
- * pvPortMalloc()/vPortFree().
- */
- #define pvPortMalloc heap_caps_malloc_default
- #define vPortFree heap_caps_free
- #define xPortGetFreeHeapSize esp_get_free_heap_size
- #define xPortGetMinimumEverFreeHeapSize esp_get_minimum_free_heap_size
-
-/*
- * Send an interrupt to another core in order to make the task running
- * on it yield for a higher-priority task.
- */
-
- void vPortYieldOtherCore( BaseType_t coreid ) PRIVILEGED_FUNCTION;
-
-
-/*
- * Callback to set a watchpoint on the end of the stack. Called every context switch to change the stack
- * watchpoint around.
- */
- void vPortSetStackWatchpoint( void * pxStackStart );
-
-/*
- * Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs
- * aren't detected here, but they normally cannot call C code, so that should not be an issue anyway.
- */
- BaseType_t xPortInIsrContext();
-
-/*
- * This function will be called in High prio ISRs. Returns true if the current core was in ISR context
- * before calling into high prio ISR context.
- */
- BaseType_t xPortInterruptedFromISRContext();
-
-/*
- * The structures and methods of manipulating the MPU are contained within the
- * port layer.
- *
- * Fills the xMPUSettings structure with the memory region information
- * contained in xRegions.
- */
- #if ( portUSING_MPU_WRAPPERS == 1 )
- struct xMEMORY_REGION;
- void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
- const struct xMEMORY_REGION * const xRegions,
- StackType_t * pxBottomOfStack,
- uint32_t usStackDepth ) PRIVILEGED_FUNCTION;
- void vPortReleaseTaskMPUSettings( xMPU_SETTINGS * xMPUSettings );
- #endif
-
-/* Multi-core: get current core ID */
- static inline uint32_t IRAM_ATTR xPortGetCoreID()
- {
- int id;
-
- asm (
- "rsr.prid %0\n"
- " extui %0,%0,13,1"
- : "=r" ( id ) );
- return id;
- }
-
-/* Get tick rate per second */
- uint32_t xPortGetTickRateHz( void );
-
-/* porttrace */
- #if configUSE_TRACE_FACILITY_2
- #include "porttrace.h"
- #endif
-
-/* configASSERT_2 if requested */
- #if configASSERT_2
- #include <stdio.h>
- void exit( int );
- #define configASSERT( x ) if( !( x ) ) { porttracePrint( -1 ); printf( "\nAssertion failed in %s:%d\n", __FILE__, __LINE__ ); exit( -1 ); }
- #endif
-
-#endif // __ASSEMBLER__
-
-/* *INDENT-OFF* */
-#ifdef __cplusplus
- }
-#endif
-/* *INDENT-ON* */
-
-#endif /* PORTMACRO_H */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_api.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_api.h
deleted file mode 100644
index f91dab1..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_api.h
+++ /dev/null
@@ -1,132 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2015 Cadence Design Systems Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- ******************************************************************************/
-
-/******************************************************************************
-* Xtensa-specific API for RTOS ports.
-******************************************************************************/
-
-#ifndef __XTENSA_API_H__
-#define __XTENSA_API_H__
-
-#include <xtensa/hal.h>
-
-#include "xtensa_context.h"
-
-
-/* Typedef for C-callable interrupt handler function */
-typedef void (* xt_handler)( void * );
-
-/* Typedef for C-callable exception handler function */
-typedef void (* xt_exc_handler)( XtExcFrame * );
-
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to set a handler for the specified exception. The handler
- * will be installed on the core that calls this function.
- *
- * n - Exception number (type)
- * f - Handler function address, NULL to uninstall handler.
- *
- * The handler will be passed a pointer to the exception frame, which is created
- * on the stack of the thread that caused the exception.
- *
- * If the handler returns, the thread context will be restored and the faulting
- * instruction will be retried. Any values in the exception frame that are
- * modified by the handler will be restored as part of the context. For details
- * of the exception frame structure see xtensa_context.h.
- * -------------------------------------------------------------------------------
- */
-extern xt_exc_handler xt_set_exception_handler( int n,
- xt_exc_handler f );
-
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to set a handler for the specified interrupt. The handler
- * will be installed on the core that calls this function.
- *
- * n - Interrupt number.
- * f - Handler function address, NULL to uninstall handler.
- * arg - Argument to be passed to handler.
- * -------------------------------------------------------------------------------
- */
-extern xt_handler xt_set_interrupt_handler( int n,
- xt_handler f,
- void * arg );
-
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to enable the specified interrupts on the core that runs
- * this code.
- *
- * mask - Bit mask of interrupts to be enabled.
- * -------------------------------------------------------------------------------
- */
-extern void xt_ints_on( unsigned int mask );
-
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to disable the specified interrupts on the core that runs
- * this code.
- *
- * mask - Bit mask of interrupts to be disabled.
- * -------------------------------------------------------------------------------
- */
-extern void xt_ints_off( unsigned int mask );
-
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to set the specified (s/w) interrupt.
- * -------------------------------------------------------------------------------
- */
-static inline void xt_set_intset( unsigned int arg )
-{
- xthal_set_intset( arg );
-}
-
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to clear the specified (s/w or edge-triggered)
- * interrupt.
- * -------------------------------------------------------------------------------
- */
-static inline void xt_set_intclear( unsigned int arg )
-{
- xthal_set_intclear( arg );
-}
-
-/*
- * -------------------------------------------------------------------------------
- * Call this function to get handler's argument for the specified interrupt.
- *
- * n - Interrupt number.
- * -------------------------------------------------------------------------------
- */
-extern void * xt_get_interrupt_handler_arg( int n );
-
-#endif /* __XTENSA_API_H__ */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_config.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_config.h
deleted file mode 100644
index 4ac32d7..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_config.h
+++ /dev/null
@@ -1,145 +0,0 @@
-/*******************************************************************************
-* // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
-* //
-* // Permission is hereby granted, free of charge, to any person obtaining
-* // a copy of this software and associated documentation files (the
-* // "Software"), to deal in the Software without restriction, including
-* // without limitation the rights to use, copy, modify, merge, publish,
-* // distribute, sublicense, and/or sell copies of the Software, and to
-* // permit persons to whom the Software is furnished to do so, subject to
-* // the following conditions:
-* //
-* // The above copyright notice and this permission notice shall be included
-* // in all copies or substantial portions of the Software.
-* //
-* // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-* --------------------------------------------------------------------------------
-*
-* Configuration-specific information for Xtensa build. This file must be
-* included in FreeRTOSConfig.h to properly set up the config-dependent
-* parameters correctly.
-*
-* NOTE: To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must
-* be defined to be > 0 somewhere above or on the command line.
-*
-*******************************************************************************/
-
-#ifndef XTENSA_CONFIG_H
- #define XTENSA_CONFIG_H
-
- #ifdef __cplusplus
- extern "C" {
- #endif
-
- #include <xtensa/hal.h>
- #include <xtensa/config/core.h>
- #include <xtensa/config/system.h> /* required for XSHAL_CLIB */
-
- #include "xtensa_context.h"
-
-
-/*-----------------------------------------------------------------------------
- * STACK REQUIREMENTS
- *
- * This section defines the minimum stack size, and the extra space required to
- * be allocated for saving coprocessor state and/or C library state information
- * (if thread safety is enabled for the C library). The sizes are in bytes.
- *
- * Stack sizes for individual tasks should be derived from these minima based on
- * the maximum call depth of the task and the maximum level of interrupt nesting.
- * A minimum stack size is defined by XT_STACK_MIN_SIZE. This minimum is based
- * on the requirement for a task that calls nothing else but can be interrupted.
- * This assumes that interrupt handlers do not call more than a few levels deep.
- * If this is not true, i.e. one or more interrupt handlers make deep calls then
- * the minimum must be increased.
- *
- * If the Xtensa processor configuration includes coprocessors, then space is
- * allocated to save the coprocessor state on the stack.
- *
- * If thread safety is enabled for the C runtime library, (XT_USE_THREAD_SAFE_CLIB
- * is defined) then space is allocated to save the C library context in the TCB.
- *
- * Allocating insufficient stack space is a common source of hard-to-find errors.
- * During development, it is best to enable the FreeRTOS stack checking features.
- *
- * Usage:
- *
- * XT_USE_THREAD_SAFE_CLIB -- Define this to a nonzero value to enable thread-safe
- * use of the C library. This will require extra stack
- * space to be allocated for tasks that use the C library
- * reentrant functions. See below for more information.
- *
- * NOTE: The Xtensa toolchain supports multiple C libraries and not all of them
- * support thread safety. Check your core configuration to see which C library
- * was chosen for your system.
- *
- * XT_STACK_MIN_SIZE -- The minimum stack size for any task. It is recommended
- * that you do not use a stack smaller than this for any
- * task. In case you want to use stacks smaller than this
- * size, you must verify that the smaller size(s) will work
- * under all operating conditions.
- *
- * XT_STACK_EXTRA -- The amount of extra stack space to allocate for a task
- * that does not make C library reentrant calls. Add this
- * to the amount of stack space required by the task itself.
- *
- * XT_STACK_EXTRA_CLIB -- The amount of space to allocate for C library state.
- *
- * -----------------------------------------------------------------------------*/
-
-/* Extra space required for interrupt/exception hooks. */
- #ifdef XT_INTEXC_HOOKS
- #ifdef __XTENSA_CALL0_ABI__
- #define STK_INTEXC_EXTRA 0x200
- #else
- #define STK_INTEXC_EXTRA 0x180
- #endif
- #else
- #define STK_INTEXC_EXTRA 0
- #endif
-
- #define XT_CLIB_CONTEXT_AREA_SIZE 0
-
-/*------------------------------------------------------------------------------
- * Extra size -- interrupt frame plus coprocessor save area plus hook space.
- * NOTE: Make sure XT_INTEXC_HOOKS is undefined unless you really need the hooks.
- * ------------------------------------------------------------------------------*/
- #ifdef __XTENSA_CALL0_ABI__
- #define XT_XTRA_SIZE ( XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x10 + XT_CP_SIZE )
- #else
- #define XT_XTRA_SIZE ( XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x20 + XT_CP_SIZE )
- #endif
-
-/*------------------------------------------------------------------------------
- * Space allocated for user code -- function calls and local variables.
- * NOTE: This number can be adjusted to suit your needs. You must verify that the
- * amount of space you reserve is adequate for the worst-case conditions in your
- * application.
- * NOTE: The windowed ABI requires more stack, since space has to be reserved
- * for spilling register windows.
- * ------------------------------------------------------------------------------*/
- #ifdef __XTENSA_CALL0_ABI__
- #define XT_USER_SIZE 0x200
- #else
- #define XT_USER_SIZE 0x400
- #endif
-
-/* Minimum recommended stack size. */
- #define XT_STACK_MIN_SIZE ( ( XT_XTRA_SIZE + XT_USER_SIZE ) / sizeof( unsigned char ) )
-
-/* OS overhead with and without C library thread context. */
- #define XT_STACK_EXTRA ( XT_XTRA_SIZE )
- #define XT_STACK_EXTRA_CLIB ( XT_XTRA_SIZE + XT_CLIB_CONTEXT_AREA_SIZE )
-
-
- #ifdef __cplusplus
- }
- #endif
-
-#endif /* XTENSA_CONFIG_H */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_context.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_context.h
deleted file mode 100644
index 5a76201..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_context.h
+++ /dev/null
@@ -1,378 +0,0 @@
-/*******************************************************************************
-Copyright (c) 2006-2015 Cadence Design Systems Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------------------------------
-
- XTENSA CONTEXT FRAMES AND MACROS FOR RTOS ASSEMBLER SOURCES
-
-This header contains definitions and macros for use primarily by Xtensa
-RTOS assembly coded source files. It includes and uses the Xtensa hardware
-abstraction layer (HAL) to deal with config specifics. It may also be
-included in C source files.
-
-!! Supports only Xtensa Exception Architecture 2 (XEA2). XEA1 not supported. !!
-
-NOTE: The Xtensa architecture requires stack pointer alignment to 16 bytes.
-
-*******************************************************************************/
-
-#ifndef XTENSA_CONTEXT_H
-#define XTENSA_CONTEXT_H
-
-#ifdef __ASSEMBLER__
-#include <xtensa/coreasm.h>
-#endif
-
-#include <xtensa/config/tie.h>
-#include <xtensa/corebits.h>
-#include <xtensa/config/system.h>
-#include <xtensa/xtruntime-frames.h>
-
-
-/* Align a value up to nearest n-byte boundary, where n is a power of 2. */
-#define ALIGNUP(n, val) (((val) + (n)-1) & -(n))
-
-
-/*
--------------------------------------------------------------------------------
- Macros that help define structures for both C and assembler.
--------------------------------------------------------------------------------
-*/
-
-#ifdef STRUCT_BEGIN
-#undef STRUCT_BEGIN
-#undef STRUCT_FIELD
-#undef STRUCT_AFIELD
-#undef STRUCT_END
-#endif
-
-#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__)
-
-#define STRUCT_BEGIN .pushsection .text; .struct 0
-#define STRUCT_FIELD(ctype,size,asname,name) asname: .space size
-#define STRUCT_AFIELD(ctype,size,asname,name,n) asname: .space (size)*(n)
-#define STRUCT_END(sname) sname##Size:; .popsection
-
-#else
-
-#define STRUCT_BEGIN typedef struct {
-#define STRUCT_FIELD(ctype,size,asname,name) ctype name;
-#define STRUCT_AFIELD(ctype,size,asname,name,n) ctype name[n];
-#define STRUCT_END(sname) } sname;
-
-#endif //_ASMLANGUAGE || __ASSEMBLER__
-
-
-/*
--------------------------------------------------------------------------------
- INTERRUPT/EXCEPTION STACK FRAME FOR A THREAD OR NESTED INTERRUPT
-
- A stack frame of this structure is allocated for any interrupt or exception.
- It goes on the current stack. If the RTOS has a system stack for handling
- interrupts, every thread stack must allow space for just one interrupt stack
- frame, then nested interrupt stack frames go on the system stack.
-
- The frame includes basic registers (explicit) and "extra" registers introduced
- by user TIE or the use of the MAC16 option in the user's Xtensa config.
- The frame size is minimized by omitting regs not applicable to user's config.
-
- For Windowed ABI, this stack frame includes the interruptee's base save area,
- another base save area to manage gcc nested functions, and a little temporary
- space to help manage the spilling of the register windows.
--------------------------------------------------------------------------------
-*/
-
-STRUCT_BEGIN
-STRUCT_FIELD (long, 4, XT_STK_EXIT, exit) /* exit point for dispatch */
-STRUCT_FIELD (long, 4, XT_STK_PC, pc) /* return PC */
-STRUCT_FIELD (long, 4, XT_STK_PS, ps) /* return PS */
-STRUCT_FIELD (long, 4, XT_STK_A0, a0)
-STRUCT_FIELD (long, 4, XT_STK_A1, a1) /* stack pointer before interrupt */
-STRUCT_FIELD (long, 4, XT_STK_A2, a2)
-STRUCT_FIELD (long, 4, XT_STK_A3, a3)
-STRUCT_FIELD (long, 4, XT_STK_A4, a4)
-STRUCT_FIELD (long, 4, XT_STK_A5, a5)
-STRUCT_FIELD (long, 4, XT_STK_A6, a6)
-STRUCT_FIELD (long, 4, XT_STK_A7, a7)
-STRUCT_FIELD (long, 4, XT_STK_A8, a8)
-STRUCT_FIELD (long, 4, XT_STK_A9, a9)
-STRUCT_FIELD (long, 4, XT_STK_A10, a10)
-STRUCT_FIELD (long, 4, XT_STK_A11, a11)
-STRUCT_FIELD (long, 4, XT_STK_A12, a12)
-STRUCT_FIELD (long, 4, XT_STK_A13, a13)
-STRUCT_FIELD (long, 4, XT_STK_A14, a14)
-STRUCT_FIELD (long, 4, XT_STK_A15, a15)
-STRUCT_FIELD (long, 4, XT_STK_SAR, sar)
-STRUCT_FIELD (long, 4, XT_STK_EXCCAUSE, exccause)
-STRUCT_FIELD (long, 4, XT_STK_EXCVADDR, excvaddr)
-#if XCHAL_HAVE_LOOPS
-STRUCT_FIELD (long, 4, XT_STK_LBEG, lbeg)
-STRUCT_FIELD (long, 4, XT_STK_LEND, lend)
-STRUCT_FIELD (long, 4, XT_STK_LCOUNT, lcount)
-#endif
-#ifndef __XTENSA_CALL0_ABI__
-/* Temporary space for saving stuff during window spill */
-STRUCT_FIELD (long, 4, XT_STK_TMP0, tmp0)
-STRUCT_FIELD (long, 4, XT_STK_TMP1, tmp1)
-STRUCT_FIELD (long, 4, XT_STK_TMP2, tmp2)
-#endif
-#ifdef XT_USE_SWPRI
-/* Storage for virtual priority mask */
-STRUCT_FIELD (long, 4, XT_STK_VPRI, vpri)
-#endif
-#ifdef XT_USE_OVLY
-/* Storage for overlay state */
-STRUCT_FIELD (long, 4, XT_STK_OVLY, ovly)
-#endif
-STRUCT_END(XtExcFrame)
-
-#if defined(_ASMLANGUAGE) || defined(__ASSEMBLER__)
-#define XT_STK_NEXT1 XtExcFrameSize
-#else
-#define XT_STK_NEXT1 sizeof(XtExcFrame)
-#endif
-
-/* Allocate extra storage if needed */
-#if XCHAL_EXTRA_SA_SIZE != 0
-
-#if XCHAL_EXTRA_SA_ALIGN <= 16
-#define XT_STK_EXTRA ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1)
-#else
-/* If need more alignment than stack, add space for dynamic alignment */
-#define XT_STK_EXTRA (ALIGNUP(XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1) + XCHAL_EXTRA_SA_ALIGN)
-#endif
-#define XT_STK_NEXT2 (XT_STK_EXTRA + XCHAL_EXTRA_SA_SIZE)
-
-#else
-
-#define XT_STK_NEXT2 XT_STK_NEXT1
-
-#endif
-
-/*
--------------------------------------------------------------------------------
- This is the frame size. Add space for 4 registers (interruptee's base save
- area) and some space for gcc nested functions if any.
--------------------------------------------------------------------------------
-*/
-#define XT_STK_FRMSZ (ALIGNUP(0x10, XT_STK_NEXT2) + 0x20)
-
-
-/*
--------------------------------------------------------------------------------
- SOLICITED STACK FRAME FOR A THREAD
-
- A stack frame of this structure is allocated whenever a thread enters the
- RTOS kernel intentionally (and synchronously) to submit to thread scheduling.
- It goes on the current thread's stack.
-
- The solicited frame only includes registers that are required to be preserved
- by the callee according to the compiler's ABI conventions, some space to save
- the return address for returning to the caller, and the caller's PS register.
-
- For Windowed ABI, this stack frame includes the caller's base save area.
-
- Note on XT_SOL_EXIT field:
- It is necessary to distinguish a solicited from an interrupt stack frame.
- This field corresponds to XT_STK_EXIT in the interrupt stack frame and is
- always at the same offset (0). It can be written with a code (usually 0)
- to distinguish a solicted frame from an interrupt frame. An RTOS port may
- opt to ignore this field if it has another way of distinguishing frames.
--------------------------------------------------------------------------------
-*/
-
-STRUCT_BEGIN
-#ifdef __XTENSA_CALL0_ABI__
-STRUCT_FIELD (long, 4, XT_SOL_EXIT, exit)
-STRUCT_FIELD (long, 4, XT_SOL_PC, pc)
-STRUCT_FIELD (long, 4, XT_SOL_PS, ps)
-STRUCT_FIELD (long, 4, XT_SOL_NEXT, next)
-STRUCT_FIELD (long, 4, XT_SOL_A12, a12) /* should be on 16-byte alignment */
-STRUCT_FIELD (long, 4, XT_SOL_A13, a13)
-STRUCT_FIELD (long, 4, XT_SOL_A14, a14)
-STRUCT_FIELD (long, 4, XT_SOL_A15, a15)
-#else
-STRUCT_FIELD (long, 4, XT_SOL_EXIT, exit)
-STRUCT_FIELD (long, 4, XT_SOL_PC, pc)
-STRUCT_FIELD (long, 4, XT_SOL_PS, ps)
-STRUCT_FIELD (long, 4, XT_SOL_NEXT, next)
-STRUCT_FIELD (long, 4, XT_SOL_A0, a0) /* should be on 16-byte alignment */
-STRUCT_FIELD (long, 4, XT_SOL_A1, a1)
-STRUCT_FIELD (long, 4, XT_SOL_A2, a2)
-STRUCT_FIELD (long, 4, XT_SOL_A3, a3)
-#endif
-STRUCT_END(XtSolFrame)
-
-/* Size of solicited stack frame */
-#define XT_SOL_FRMSZ ALIGNUP(0x10, XtSolFrameSize)
-
-
-/*
--------------------------------------------------------------------------------
- CO-PROCESSOR STATE SAVE AREA FOR A THREAD
-
- The RTOS must provide an area per thread to save the state of co-processors
- when that thread does not have control. Co-processors are context-switched
- lazily (on demand) only when a new thread uses a co-processor instruction,
- otherwise a thread retains ownership of the co-processor even when it loses
- control of the processor. An Xtensa co-processor exception is triggered when
- any co-processor instruction is executed by a thread that is not the owner,
- and the context switch of that co-processor is then peformed by the handler.
- Ownership represents which thread's state is currently in the co-processor.
-
- Co-processors may not be used by interrupt or exception handlers. If an
- co-processor instruction is executed by an interrupt or exception handler,
- the co-processor exception handler will trigger a kernel panic and freeze.
- This restriction is introduced to reduce the overhead of saving and restoring
- co-processor state (which can be quite large) and in particular remove that
- overhead from interrupt handlers.
-
- The co-processor state save area may be in any convenient per-thread location
- such as in the thread control block or above the thread stack area. It need
- not be in the interrupt stack frame since interrupts don't use co-processors.
-
- Along with the save area for each co-processor, two bitmasks with flags per
- co-processor (laid out as in the CPENABLE reg) help manage context-switching
- co-processors as efficiently as possible:
-
- XT_CPENABLE
- The contents of a non-running thread's CPENABLE register.
- It represents the co-processors owned (and whose state is still needed)
- by the thread. When a thread is preempted, its CPENABLE is saved here.
- When a thread solicits a context-swtich, its CPENABLE is cleared - the
- compiler has saved the (caller-saved) co-proc state if it needs to.
- When a non-running thread loses ownership of a CP, its bit is cleared.
- When a thread runs, it's XT_CPENABLE is loaded into the CPENABLE reg.
- Avoids co-processor exceptions when no change of ownership is needed.
-
- XT_CPSTORED
- A bitmask with the same layout as CPENABLE, a bit per co-processor.
- Indicates whether the state of each co-processor is saved in the state
- save area. When a thread enters the kernel, only the state of co-procs
- still enabled in CPENABLE is saved. When the co-processor exception
- handler assigns ownership of a co-processor to a thread, it restores
- the saved state only if this bit is set, and clears this bit.
-
- XT_CP_CS_ST
- A bitmask with the same layout as CPENABLE, a bit per co-processor.
- Indicates whether callee-saved state is saved in the state save area.
- Callee-saved state is saved by itself on a solicited context switch,
- and restored when needed by the coprocessor exception handler.
- Unsolicited switches will cause the entire coprocessor to be saved
- when necessary.
-
- XT_CP_ASA
- Pointer to the aligned save area. Allows it to be aligned more than
- the overall save area (which might only be stack-aligned or TCB-aligned).
- Especially relevant for Xtensa cores configured with a very large data
- path that requires alignment greater than 16 bytes (ABI stack alignment).
--------------------------------------------------------------------------------
-*/
-
-#if XCHAL_CP_NUM > 0
-
-/* Offsets of each coprocessor save area within the 'aligned save area': */
-#define XT_CP0_SA 0
-#define XT_CP1_SA ALIGNUP(XCHAL_CP1_SA_ALIGN, XT_CP0_SA + XCHAL_CP0_SA_SIZE)
-#define XT_CP2_SA ALIGNUP(XCHAL_CP2_SA_ALIGN, XT_CP1_SA + XCHAL_CP1_SA_SIZE)
-#define XT_CP3_SA ALIGNUP(XCHAL_CP3_SA_ALIGN, XT_CP2_SA + XCHAL_CP2_SA_SIZE)
-#define XT_CP4_SA ALIGNUP(XCHAL_CP4_SA_ALIGN, XT_CP3_SA + XCHAL_CP3_SA_SIZE)
-#define XT_CP5_SA ALIGNUP(XCHAL_CP5_SA_ALIGN, XT_CP4_SA + XCHAL_CP4_SA_SIZE)
-#define XT_CP6_SA ALIGNUP(XCHAL_CP6_SA_ALIGN, XT_CP5_SA + XCHAL_CP5_SA_SIZE)
-#define XT_CP7_SA ALIGNUP(XCHAL_CP7_SA_ALIGN, XT_CP6_SA + XCHAL_CP6_SA_SIZE)
-#define XT_CP_SA_SIZE ALIGNUP(16, XT_CP7_SA + XCHAL_CP7_SA_SIZE)
-
-/* Offsets within the overall save area: */
-#define XT_CPENABLE 0 /* (2 bytes) coprocessors active for this thread */
-#define XT_CPSTORED 2 /* (2 bytes) coprocessors saved for this thread */
-#define XT_CP_CS_ST 4 /* (2 bytes) coprocessor callee-saved regs stored for this thread */
-#define XT_CP_ASA 8 /* (4 bytes) ptr to aligned save area */
-/* Overall size allows for dynamic alignment: */
-#define XT_CP_SIZE (12 + XT_CP_SA_SIZE + XCHAL_TOTAL_SA_ALIGN)
-#else
-#define XT_CP_SIZE 0
-#endif
-
-
-/*
- Macro to get the current core ID. Only uses the reg given as an argument.
- Reading PRID on the ESP32 gives us 0xCDCD on the PRO processor (0)
- and 0xABAB on the APP CPU (1). We can distinguish between the two by checking
- bit 13: it's 1 on the APP and 0 on the PRO processor.
-*/
-#ifdef __ASSEMBLER__
- .macro getcoreid reg
- rsr.prid \reg
- extui \reg,\reg,13,1
- .endm
-#endif
-
-#define CORE_ID_PRO 0xCDCD
-#define CORE_ID_APP 0xABAB
-
-/*
--------------------------------------------------------------------------------
- MACROS TO HANDLE ABI SPECIFICS OF FUNCTION ENTRY AND RETURN
-
- Convenient where the frame size requirements are the same for both ABIs.
- ENTRY(sz), RET(sz) are for framed functions (have locals or make calls).
- ENTRY0, RET0 are for frameless functions (no locals, no calls).
-
- where size = size of stack frame in bytes (must be >0 and aligned to 16).
- For framed functions the frame is created and the return address saved at
- base of frame (Call0 ABI) or as determined by hardware (Windowed ABI).
- For frameless functions, there is no frame and return address remains in a0.
- Note: Because CPP macros expand to a single line, macros requiring multi-line
- expansions are implemented as assembler macros.
--------------------------------------------------------------------------------
-*/
-
-#ifdef __ASSEMBLER__
-#ifdef __XTENSA_CALL0_ABI__
- /* Call0 */
- #define ENTRY(sz) entry1 sz
- .macro entry1 size=0x10
- addi sp, sp, -\size
- s32i a0, sp, 0
- .endm
- #define ENTRY0
- #define RET(sz) ret1 sz
- .macro ret1 size=0x10
- l32i a0, sp, 0
- addi sp, sp, \size
- ret
- .endm
- #define RET0 ret
-#else
- /* Windowed */
- #define ENTRY(sz) entry sp, sz
- #define ENTRY0 entry sp, 0x10
- #define RET(sz) retw
- #define RET0 retw
-#endif
-#endif
-
-
-
-
-
-#endif /* XTENSA_CONTEXT_H */
-
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_rtos.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_rtos.h
deleted file mode 100644
index dbd82b6..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_rtos.h
+++ /dev/null
@@ -1,231 +0,0 @@
-/*******************************************************************************
-* // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
-* //
-* // Permission is hereby granted, free of charge, to any person obtaining
-* // a copy of this software and associated documentation files (the
-* // "Software"), to deal in the Software without restriction, including
-* // without limitation the rights to use, copy, modify, merge, publish,
-* // distribute, sublicense, and/or sell copies of the Software, and to
-* // permit persons to whom the Software is furnished to do so, subject to
-* // the following conditions:
-* //
-* // The above copyright notice and this permission notice shall be included
-* // in all copies or substantial portions of the Software.
-* //
-* // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-* --------------------------------------------------------------------------------
-*
-* RTOS-SPECIFIC INFORMATION FOR XTENSA RTOS ASSEMBLER SOURCES
-* (FreeRTOS Port)
-*
-* This header is the primary glue between generic Xtensa RTOS support
-* sources and a specific RTOS port for Xtensa. It contains definitions
-* and macros for use primarily by Xtensa assembly coded source files.
-*
-* Macros in this header map callouts from generic Xtensa files to specific
-* RTOS functions. It may also be included in C source files.
-*
-* Xtensa RTOS ports support all RTOS-compatible configurations of the Xtensa
-* architecture, using the Xtensa hardware abstraction layer (HAL) to deal
-* with configuration specifics.
-*
-* Should be included by all Xtensa generic and RTOS port-specific sources.
-*
-*******************************************************************************/
-
-#ifndef XTENSA_RTOS_H
-#define XTENSA_RTOS_H
-
-#ifdef __ASSEMBLER__
- #include <xtensa/coreasm.h>
-#else
- #include <xtensa/config/core.h>
-#endif
-
-#include <xtensa/corebits.h>
-#include <xtensa/config/system.h>
-
-/*
- * Include any RTOS specific definitions that are needed by this header.
- */
-#include "FreeRTOSConfig.h"
-
-/*
- * Convert FreeRTOSConfig definitions to XTENSA definitions.
- * However these can still be overridden from the command line.
- */
-
-#ifndef XT_SIMULATOR
- #if configXT_SIMULATOR
- #define XT_SIMULATOR 1 /* Simulator mode */
- #endif
-#endif
-
-#ifndef XT_BOARD
- #if configXT_BOARD
- #define XT_BOARD 1 /* Board mode */
- #endif
-#endif
-
-#ifndef XT_TIMER_INDEX
- #if defined configXT_TIMER_INDEX
- #define XT_TIMER_INDEX configXT_TIMER_INDEX /* Index of hardware timer to be used */
- #endif
-#endif
-
-#ifndef XT_INTEXC_HOOKS
- #if configXT_INTEXC_HOOKS
- #define XT_INTEXC_HOOKS 1 /* Enables exception hooks */
- #endif
-#endif
-
-#if !defined( XT_SIMULATOR ) && !defined( XT_BOARD )
- #error Either XT_SIMULATOR or XT_BOARD must be defined.
-#endif
-
-
-/*
- * Name of RTOS (for messages).
- */
-#define XT_RTOS_NAME FreeRTOS
-
-/*
- * Check some Xtensa configuration requirements and report error if not met.
- * Error messages can be customize to the RTOS port.
- */
-
-#if !XCHAL_HAVE_XEA2
- #error "FreeRTOS/Xtensa requires XEA2 (exception architecture 2)."
-#endif
-
-
-/*******************************************************************************
-*
-* RTOS CALLOUT MACROS MAPPED TO RTOS PORT-SPECIFIC FUNCTIONS.
-*
-* Define callout macros used in generic Xtensa code to interact with the RTOS.
-* The macros are simply the function names for use in calls from assembler code.
-* Some of these functions may call back to generic functions in xtensa_context.h .
-*
-*******************************************************************************/
-
-/*
- * Inform RTOS of entry into an interrupt handler that will affect it.
- * Allows RTOS to manage switch to any system stack and count nesting level.
- * Called after minimal context has been saved, with interrupts disabled.
- * RTOS port can call0 _xt_context_save to save the rest of the context.
- * May only be called from assembly code by the 'call0' instruction.
- */
-/* void XT_RTOS_INT_ENTER(void) */
-#define XT_RTOS_INT_ENTER _frxt_int_enter
-
-/*
- * Inform RTOS of completion of an interrupt handler, and give control to
- * RTOS to perform thread/task scheduling, switch back from any system stack
- * and restore the context, and return to the exit dispatcher saved in the
- * stack frame at XT_STK_EXIT. RTOS port can call0 _xt_context_restore
- * to save the context saved in XT_RTOS_INT_ENTER via _xt_context_save,
- * leaving only a minimal part of the context to be restored by the exit
- * dispatcher. This function does not return to the place it was called from.
- * May only be called from assembly code by the 'call0' instruction.
- */
-/* void XT_RTOS_INT_EXIT(void) */
-#define XT_RTOS_INT_EXIT _frxt_int_exit
-
-/*
- * Inform RTOS of the occurrence of a tick timer interrupt.
- * If RTOS has no tick timer, leave XT_RTOS_TIMER_INT undefined.
- * May be coded in or called from C or assembly, per ABI conventions.
- * RTOS may optionally define XT_TICK_PER_SEC in its own way (eg. macro).
- */
-/* void XT_RTOS_TIMER_INT(void) */
-#define XT_RTOS_TIMER_INT _frxt_timer_int
-#define XT_TICK_PER_SEC configTICK_RATE_HZ
-
-/*
- * Return in a15 the base address of the co-processor state save area for the
- * thread that triggered a co-processor exception, or 0 if no thread was running.
- * The state save area is structured as defined in xtensa_context.h and has size
- * XT_CP_SIZE. Co-processor instructions should only be used in thread code, never
- * in interrupt handlers or the RTOS kernel. May only be called from assembly code
- * and by the 'call0' instruction. A result of 0 indicates an unrecoverable error.
- * The implementation may use only a2-4, a15 (all other regs must be preserved).
- */
-/* void* XT_RTOS_CP_STATE(void) */
-#define XT_RTOS_CP_STATE _frxt_task_coproc_state
-
-
-/*******************************************************************************
-*
-* HOOKS TO DYNAMICALLY INSTALL INTERRUPT AND EXCEPTION HANDLERS PER LEVEL.
-*
-* This Xtensa RTOS port provides hooks for dynamically installing exception
-* and interrupt handlers to facilitate automated testing where each test
-* case can install its own handler for user exceptions and each interrupt
-* priority (level). This consists of an array of function pointers indexed
-* by interrupt priority, with index 0 being the user exception handler hook.
-* Each entry in the array is initially 0, and may be replaced by a function
-* pointer of type XT_INTEXC_HOOK. A handler may be uninstalled by installing 0.
-*
-* The handler for low and medium priority obeys ABI conventions so may be coded
-* in C. For the exception handler, the cause is the contents of the EXCCAUSE
-* reg, and the result is -1 if handled, else the cause (still needs handling).
-* For interrupt handlers, the cause is a mask of pending enabled interrupts at
-* that level, and the result is the same mask with the bits for the handled
-* interrupts cleared (those not cleared still need handling). This allows a test
-* case to either pre-handle or override the default handling for the exception
-* or interrupt level (see xtensa_vectors.S).
-*
-* High priority handlers (including NMI) must be coded in assembly, are always
-* called by 'call0' regardless of ABI, must preserve all registers except a0,
-* and must not use or modify the interrupted stack. The hook argument 'cause'
-* is not passed and the result is ignored, so as not to burden the caller with
-* saving and restoring a2 (it assumes only one interrupt per level - see the
-* discussion in high priority interrupts in xtensa_vectors.S). The handler
-* therefore should be coded to prototype 'void h(void)' even though it plugs
-* into an array of handlers of prototype 'unsigned h(unsigned)'.
-*
-* To enable interrupt/exception hooks, compile the RTOS with '-DXT_INTEXC_HOOKS'.
-*
-*******************************************************************************/
-
-#define XT_INTEXC_HOOK_NUM ( 1 + XCHAL_NUM_INTLEVELS + XCHAL_HAVE_NMI )
-
-#ifndef __ASSEMBLER__
- typedef unsigned (* XT_INTEXC_HOOK)( unsigned cause );
- extern volatile XT_INTEXC_HOOK _xt_intexc_hooks[ XT_INTEXC_HOOK_NUM ];
-#endif
-
-
-/*******************************************************************************
-*
-* CONVENIENCE INCLUSIONS.
-*
-* Ensures RTOS specific files need only include this one Xtensa-generic header.
-* These headers are included last so they can use the RTOS definitions above.
-*
-*******************************************************************************/
-
-#include "xtensa_context.h"
-
-#ifdef XT_RTOS_TIMER_INT
- #include "xtensa_timer.h"
-#endif
-
-
-/*******************************************************************************
-*
-* Xtensa Port Version.
-*
-*******************************************************************************/
-
-#define XTENSA_PORT_VERSION 1.4 .2
-#define XTENSA_PORT_VERSION_STRING "1.4.2"
-
-#endif /* XTENSA_RTOS_H */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_timer.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_timer.h
deleted file mode 100644
index 431205d..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/include/xtensa_timer.h
+++ /dev/null
@@ -1,158 +0,0 @@
-/*******************************************************************************
-* // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
-* //
-* // Permission is hereby granted, free of charge, to any person obtaining
-* // a copy of this software and associated documentation files (the
-* // "Software"), to deal in the Software without restriction, including
-* // without limitation the rights to use, copy, modify, merge, publish,
-* // distribute, sublicense, and/or sell copies of the Software, and to
-* // permit persons to whom the Software is furnished to do so, subject to
-* // the following conditions:
-* //
-* // The above copyright notice and this permission notice shall be included
-* // in all copies or substantial portions of the Software.
-* //
-* // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-* --------------------------------------------------------------------------------
-*
-* XTENSA INFORMATION FOR RTOS TICK TIMER AND CLOCK FREQUENCY
-*
-* This header contains definitions and macros for use primarily by Xtensa
-* RTOS assembly coded source files. It includes and uses the Xtensa hardware
-* abstraction layer (HAL) to deal with config specifics. It may also be
-* included in C source files.
-*
-* User may edit to modify timer selection and to specify clock frequency and
-* tick duration to match timer interrupt to the real-time tick duration.
-*
-* If the RTOS has no timer interrupt, then there is no tick timer and the
-* clock frequency is irrelevant, so all of these macros are left undefined
-* and the Xtensa core configuration need not have a timer.
-*
-*******************************************************************************/
-
-#ifndef XTENSA_TIMER_H
-#define XTENSA_TIMER_H
-
-#ifdef __ASSEMBLER__
- #include <xtensa/coreasm.h>
-#endif
-
-#include <xtensa/corebits.h>
-#include <xtensa/config/system.h>
-
-#include "xtensa_rtos.h" /* in case this wasn't included directly */
-
-#include "FreeRTOSConfig.h"
-
-/*
- * Select timer to use for periodic tick, and determine its interrupt number
- * and priority. User may specify a timer by defining XT_TIMER_INDEX with -D,
- * in which case its validity is checked (it must exist in this core and must
- * not be on a high priority interrupt - an error will be reported in invalid).
- * Otherwise select the first low or medium priority interrupt timer available.
- */
-#if XCHAL_NUM_TIMERS == 0
-
- #error "This Xtensa configuration is unsupported, it has no timers."
-
-#else
-
- #ifndef XT_TIMER_INDEX
- #if XCHAL_TIMER3_INTERRUPT != XTHAL_TIMER_UNCONFIGURED
- #if XCHAL_INT_LEVEL( XCHAL_TIMER3_INTERRUPT ) <= XCHAL_EXCM_LEVEL
- #undef XT_TIMER_INDEX
- #define XT_TIMER_INDEX 3
- #endif
- #endif
- #if XCHAL_TIMER2_INTERRUPT != XTHAL_TIMER_UNCONFIGURED
- #if XCHAL_INT_LEVEL( XCHAL_TIMER2_INTERRUPT ) <= XCHAL_EXCM_LEVEL
- #undef XT_TIMER_INDEX
- #define XT_TIMER_INDEX 2
- #endif
- #endif
- #if XCHAL_TIMER1_INTERRUPT != XTHAL_TIMER_UNCONFIGURED
- #if XCHAL_INT_LEVEL( XCHAL_TIMER1_INTERRUPT ) <= XCHAL_EXCM_LEVEL
- #undef XT_TIMER_INDEX
- #define XT_TIMER_INDEX 1
- #endif
- #endif
- #if XCHAL_TIMER0_INTERRUPT != XTHAL_TIMER_UNCONFIGURED
- #if XCHAL_INT_LEVEL( XCHAL_TIMER0_INTERRUPT ) <= XCHAL_EXCM_LEVEL
- #undef XT_TIMER_INDEX
- #define XT_TIMER_INDEX 0
- #endif
- #endif
- #endif /* ifndef XT_TIMER_INDEX */
- #ifndef XT_TIMER_INDEX
- #error "There is no suitable timer in this Xtensa configuration."
- #endif
-
- #define XT_CCOMPARE ( CCOMPARE + XT_TIMER_INDEX )
- #define XT_TIMER_INTNUM XCHAL_TIMER_INTERRUPT( XT_TIMER_INDEX )
- #define XT_TIMER_INTPRI XCHAL_INT_LEVEL( XT_TIMER_INTNUM )
- #define XT_TIMER_INTEN ( 1 << XT_TIMER_INTNUM )
-
- #if XT_TIMER_INTNUM == XTHAL_TIMER_UNCONFIGURED
- #error "The timer selected by XT_TIMER_INDEX does not exist in this core."
- #elif XT_TIMER_INTPRI > XCHAL_EXCM_LEVEL
- #error "The timer interrupt cannot be high priority (use medium or low)."
- #endif
-
-#endif /* XCHAL_NUM_TIMERS */
-
-/*
- * Set processor clock frequency, used to determine clock divisor for timer tick.
- * User should BE SURE TO ADJUST THIS for the Xtensa platform being used.
- * If using a supported board via the board-independent API defined in xtbsp.h,
- * this may be left undefined and frequency and tick divisor will be computed
- * and cached during run-time initialization.
- *
- * NOTE ON SIMULATOR:
- * Under the Xtensa instruction set simulator, the frequency can only be estimated
- * because it depends on the speed of the host and the version of the simulator.
- * Also because it runs much slower than hardware, it is not possible to achieve
- * real-time performance for most applications under the simulator. A frequency
- * too low does not allow enough time between timer interrupts, starving threads.
- * To obtain a more convenient but non-real-time tick duration on the simulator,
- * compile with xt-xcc option "-DXT_SIMULATOR".
- * Adjust this frequency to taste (it's not real-time anyway!).
- */
-#if defined( XT_SIMULATOR ) && !defined( XT_CLOCK_FREQ )
- #define XT_CLOCK_FREQ configCPU_CLOCK_HZ
-#endif
-
-#if !defined( XT_CLOCK_FREQ ) && !defined( XT_BOARD )
- #error "XT_CLOCK_FREQ must be defined for the target platform."
-#endif
-
-/*
- * Default number of timer "ticks" per second (default 100 for 10ms tick).
- * RTOS may define this in its own way (if applicable) in xtensa_rtos.h.
- * User may redefine this to an optimal value for the application, either by
- * editing this here or in xtensa_rtos.h, or compiling with xt-xcc option
- * "-DXT_TICK_PER_SEC=<value>" where <value> is a suitable number.
- */
-#ifndef XT_TICK_PER_SEC
- #define XT_TICK_PER_SEC configTICK_RATE_HZ /* 10 ms tick = 100 ticks per second */
-#endif
-
-/*
- * Derivation of clock divisor for timer tick and interrupt (one per tick).
- */
-#ifdef XT_CLOCK_FREQ
- #define XT_TICK_DIVISOR ( XT_CLOCK_FREQ / XT_TICK_PER_SEC )
-#endif
-
-#ifndef __ASSEMBLER__
- extern unsigned _xt_tick_divisor;
- extern void _xt_tick_divisor_init( void );
-#endif
-
-#endif /* XTENSA_TIMER_H */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c
deleted file mode 100644
index 992789a..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/port.c
+++ /dev/null
@@ -1,484 +0,0 @@
-/*
- * FreeRTOS V8.2.0 - Copyright (C) 2015 Real Time Engineers Ltd.
- * All rights reserved
- *
- * VISIT https://www.FreeRTOS.org TO ENSURE YOU ARE USING THE LATEST VERSION.
- *
- * This file is part of the FreeRTOS distribution.
- *
- * FreeRTOS is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License (version 2) as published by the
- * Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
- *
- ***************************************************************************
- * >>! NOTE: The modification to the GPL is included to allow you to !<<
- * >>! distribute a combined work that includes FreeRTOS without being !<<
- * >>! obliged to provide the source code for proprietary components !<<
- * >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
- *
- * FreeRTOS 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. Full license text is available on the following
- * link: https://www.FreeRTOS.org/a00114.html
- *
- ***************************************************************************
- * *
- * FreeRTOS provides completely free yet professionally developed, *
- * robust, strictly quality controlled, supported, and cross *
- * platform software that is more than just the market leader, it *
- * is the industry's de facto standard. *
- * *
- * Help yourself get started quickly while simultaneously helping *
- * to support the FreeRTOS project by purchasing a FreeRTOS *
- * tutorial book, reference manual, or both: *
- * https://www.FreeRTOS.org/Documentation *
- * *
- ***************************************************************************
- *
- * https://www.FreeRTOS.org/FAQHelp.html - Having a problem? Start by reading
- * the FAQ page "My application does not run, what could be wrong?". Have you
- * defined configASSERT()?
- *
- * https://www.FreeRTOS.org/support - In return for receiving this top quality
- * embedded software for free we request you assist our global community by
- * participating in the support forum.
- *
- * https://www.FreeRTOS.org/training - Investing in training allows your team
- * to be as productive as possible as early as possible. Now you can receive
- * FreeRTOS training directly from Richard Barry, CEO of Real Time Engineers
- * Ltd, and the world's leading authority on the world's leading RTOS.
- *
- * https://www.FreeRTOS.org/plus - A selection of FreeRTOS ecosystem products,
- * including FreeRTOS+Trace - an indispensable productivity tool, a DOS
- * compatible FAT file system, and our tiny thread aware UDP/IP stack.
- *
- * https://www.FreeRTOS.org/labs - Where new FreeRTOS products go to incubate.
- * Come and try FreeRTOS+TCP, our new open source TCP/IP stack for FreeRTOS.
- *
- * https://www.highintegritysystems.com/openrtos/ - Real Time Engineers ltd.
- * license FreeRTOS to High Integrity Systems ltd. to sell under the OpenRTOS
- * brand. Low cost OpenRTOS licenses offer ticketed support, indemnification
- * and commercial middleware.
- *
- * https://www.highintegritysystems.com/safertos/ - High Integrity Systems
- * also provide a safety engineered and independently SIL3 certified version
- * for use in safety and mission critical applications that require provable
- * dependability.
- *
- */
-
-/*******************************************************************************
- * // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
- * //
- * // Permission is hereby granted, free of charge, to any person obtaining
- * // a copy of this software and associated documentation files (the
- * // "Software"), to deal in the Software without restriction, including
- * // without limitation the rights to use, copy, modify, merge, publish,
- * // distribute, sublicense, and/or sell copies of the Software, and to
- * // permit persons to whom the Software is furnished to do so, subject to
- * // the following conditions:
- * //
- * // The above copyright notice and this permission notice shall be included
- * // in all copies or substantial portions of the Software.
- * //
- * // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- * -----------------------------------------------------------------------------
- */
-
-#include <stdlib.h>
-#include <xtensa/config/core.h>
-
-#include "xtensa_rtos.h"
-
-#include "rom/ets_sys.h"
-#include "soc/cpu.h"
-
-#include "FreeRTOS.h"
-#include "task.h"
-
-#include "esp_panic.h"
-#include "esp_heap_caps.h"
-#include "esp_crosscore_int.h"
-
-#include "esp_intr_alloc.h"
-
-/* Defined in portasm.h */
-extern void _frxt_tick_timer_init( void );
-
-/* Defined in xtensa_context.S */
-extern void _xt_coproc_init( void );
-
-
-#if CONFIG_FREERTOS_CORETIMER_0
- #define SYSTICK_INTR_ID ( ETS_INTERNAL_TIMER0_INTR_SOURCE + ETS_INTERNAL_INTR_SOURCE_OFF )
-#endif
-#if CONFIG_FREERTOS_CORETIMER_1
- #define SYSTICK_INTR_ID ( ETS_INTERNAL_TIMER1_INTR_SOURCE + ETS_INTERNAL_INTR_SOURCE_OFF )
-#endif
-
-/*-----------------------------------------------------------*/
-
-unsigned port_xSchedulerRunning[ portNUM_PROCESSORS ] = { 0 }; /* Duplicate of inaccessible xSchedulerRunning; needed at startup to avoid counting nesting */
-unsigned port_interruptNesting[ portNUM_PROCESSORS ] = { 0 }; /* Interrupt nesting level. Increased/decreased in portasm.c, _frxt_int_enter/_frxt_int_exit */
-
-/*-----------------------------------------------------------*/
-
-/* User exception dispatcher when exiting */
-void _xt_user_exit( void );
-
-/*
- * Stack initialization
- */
-/* *INDENT-OFF* */
-#if portUSING_MPU_WRAPPERS
- StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
- TaskFunction_t pxCode,
- void * pvParameters,
- BaseType_t xRunPrivileged )
-#else
- StackType_t * pxPortInitialiseStack( StackType_t * pxTopOfStack,
- TaskFunction_t pxCode,
- void * pvParameters )
-#endif
-/* *INDENT-ON* */
-{
- StackType_t * sp, * tp;
- XtExcFrame * frame;
-
- #if XCHAL_CP_NUM > 0
- uint32_t * p;
- #endif
-
- /* Create interrupt stack frame aligned to 16 byte boundary */
- sp = ( StackType_t * ) ( ( ( UBaseType_t ) pxTopOfStack - XT_CP_SIZE - XT_STK_FRMSZ ) & ~0xf );
-
- /* Clear the entire frame (do not use memset() because we don't depend on C library) */
- for( tp = sp; tp <= pxTopOfStack; ++tp )
- {
- *tp = 0;
- }
-
- frame = ( XtExcFrame * ) sp;
-
- /* Explicitly initialize certain saved registers */
- frame->pc = ( UBaseType_t ) pxCode; /* task entrypoint */
- frame->a0 = 0; /* to terminate GDB backtrace */
- frame->a1 = ( UBaseType_t ) sp + XT_STK_FRMSZ; /* physical top of stack frame */
- frame->exit = ( UBaseType_t ) _xt_user_exit; /* user exception exit dispatcher */
-
- /* Set initial PS to int level 0, EXCM disabled ('rfe' will enable), user mode. */
- /* Also set entry point argument parameter. */
- #ifdef __XTENSA_CALL0_ABI__
- frame->a2 = ( UBaseType_t ) pvParameters;
- frame->ps = PS_UM | PS_EXCM;
- #else
- /* + for windowed ABI also set WOE and CALLINC (pretend task was 'call4'd). */
- frame->a6 = ( UBaseType_t ) pvParameters;
- frame->ps = PS_UM | PS_EXCM | PS_WOE | PS_CALLINC( 1 );
- #endif
-
- #ifdef XT_USE_SWPRI
- /* Set the initial virtual priority mask value to all 1's. */
- frame->vpri = 0xFFFFFFFF;
- #endif
-
- #if XCHAL_CP_NUM > 0
- /* Init the coprocessor save area (see xtensa_context.h) */
-
- /* No access to TCB here, so derive indirectly. Stack growth is top to bottom.
- * //p = (uint32_t *) xMPUSettings->coproc_area;
- */
- p = ( uint32_t * ) ( ( ( uint32_t ) pxTopOfStack - XT_CP_SIZE ) & ~0xf );
- configASSERT( ( uint32_t ) p >= frame->a1 );
- p[ 0 ] = 0;
- p[ 1 ] = 0;
- p[ 2 ] = ( ( ( uint32_t ) p ) + 12 + XCHAL_TOTAL_SA_ALIGN - 1 ) & -XCHAL_TOTAL_SA_ALIGN;
- #endif
-
- return sp;
-}
-
-/*-----------------------------------------------------------*/
-
-void vPortEndScheduler( void )
-{
- /* It is unlikely that the Xtensa port will get stopped. If required simply
- * disable the tick interrupt here. */
-}
-
-/*-----------------------------------------------------------*/
-
-BaseType_t xPortStartScheduler( void )
-{
- /* Interrupts are disabled at this point and stack contains PS with enabled interrupts when task context is restored */
-
- #if XCHAL_CP_NUM > 0
- /* Initialize co-processor management for tasks. Leave CPENABLE alone. */
- _xt_coproc_init();
- #endif
-
- /* Init the tick divisor value */
- _xt_tick_divisor_init();
-
- /* Setup the hardware to generate the tick. */
- _frxt_tick_timer_init();
-
- port_xSchedulerRunning[ xPortGetCoreID() ] = 1;
-
- /* Cannot be directly called from C; never returns */
- __asm__ volatile ( "call0 _frxt_dispatch\n" );
-
- /* Should not get here. */
- return pdTRUE;
-}
-/*-----------------------------------------------------------*/
-
-BaseType_t xPortSysTickHandler( void )
-{
- BaseType_t ret;
- unsigned interruptMask;
-
- portbenchmarkIntLatency();
- traceISR_ENTER( SYSTICK_INTR_ID );
-
- /* Interrupts upto configMAX_SYSCALL_INTERRUPT_PRIORITY must be
- * disabled before calling xTaskIncrementTick as it access the
- * kernel lists. */
- interruptMask = portSET_INTERRUPT_MASK_FROM_ISR();
- {
- ret = xTaskIncrementTick();
- }
- portCLEAR_INTERRUPT_MASK_FROM_ISR( interruptMask );
-
- if( ret != pdFALSE )
- {
- portYIELD_FROM_ISR();
- }
- else
- {
- traceISR_EXIT();
- }
-
- return ret;
-}
-
-
-void vPortYieldOtherCore( BaseType_t coreid )
-{
- esp_crosscore_int_send_yield( coreid );
-}
-
-/*-----------------------------------------------------------*/
-
-/*
- * Used to set coprocessor area in stack. Current hack is to reuse MPU pointer for coprocessor area.
- */
-#if portUSING_MPU_WRAPPERS
- void vPortStoreTaskMPUSettings( xMPU_SETTINGS * xMPUSettings,
- const struct xMEMORY_REGION * const xRegions,
- StackType_t * pxBottomOfStack,
- uint32_t usStackDepth )
- {
- #if XCHAL_CP_NUM > 0
- xMPUSettings->coproc_area = ( StackType_t * ) ( ( uint32_t ) ( pxBottomOfStack + usStackDepth - 1 ));
- xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( portPOINTER_SIZE_TYPE ) xMPUSettings->coproc_area ) & ( ~( ( portPOINTER_SIZE_TYPE ) portBYTE_ALIGNMENT_MASK ) ) );
- xMPUSettings->coproc_area = ( StackType_t * ) ( ( ( uint32_t ) xMPUSettings->coproc_area - XT_CP_SIZE ) & ~0xf );
-
-
- /* NOTE: we cannot initialize the coprocessor save area here because FreeRTOS is going to
- * clear the stack area after we return. This is done in pxPortInitialiseStack().
- */
- #endif
- }
-
- void vPortReleaseTaskMPUSettings( xMPU_SETTINGS * xMPUSettings )
- {
- /* If task has live floating point registers somewhere, release them */
- _xt_coproc_release( xMPUSettings->coproc_area );
- }
-
-#endif /* if portUSING_MPU_WRAPPERS */
-
-/*
- * Returns true if the current core is in ISR context; low prio ISR, med prio ISR or timer tick ISR. High prio ISRs
- * aren't detected here, but they normally cannot call C code, so that should not be an issue anyway.
- */
-BaseType_t xPortInIsrContext()
-{
- unsigned int irqStatus;
- BaseType_t ret;
-
- irqStatus = portENTER_CRITICAL_NESTED();
- ret = ( port_interruptNesting[ xPortGetCoreID() ] != 0 );
- portEXIT_CRITICAL_NESTED( irqStatus );
- return ret;
-}
-
-/*
- * This function will be called in High prio ISRs. Returns true if the current core was in ISR context
- * before calling into high prio ISR context.
- */
-BaseType_t IRAM_ATTR xPortInterruptedFromISRContext()
-{
- return( port_interruptNesting[ xPortGetCoreID() ] != 0 );
-}
-
-void vPortAssertIfInISR()
-{
- if( xPortInIsrContext() )
- {
- ets_printf( "core=%d port_interruptNesting=%d\n\n", xPortGetCoreID(), port_interruptNesting[ xPortGetCoreID() ] );
- }
-
- configASSERT( !xPortInIsrContext() );
-}
-
-/*
- * For kernel use: Initialize a per-CPU mux. Mux will be initialized unlocked.
- */
-void vPortCPUInitializeMutex( portMUX_TYPE * mux )
-{
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- ets_printf( "Initializing mux %p\n", mux );
- mux->lastLockedFn = "(never locked)";
- mux->lastLockedLine = -1;
- #endif
- mux->owner = portMUX_FREE_VAL;
- mux->count = 0;
-}
-
-#include "portmux_impl.h"
-
-/*
- * For kernel use: Acquire a per-CPU mux. Spinlocks, so don't hold on to these muxes for too long.
- */
-#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- void vPortCPUAcquireMutex( portMUX_TYPE * mux,
- const char * fnName,
- int line )
- {
- unsigned int irqStatus = portENTER_CRITICAL_NESTED();
-
- vPortCPUAcquireMutexIntsDisabled( mux, portMUX_NO_TIMEOUT, fnName, line );
- portEXIT_CRITICAL_NESTED( irqStatus );
- }
-
- bool vPortCPUAcquireMutexTimeout( portMUX_TYPE * mux,
- int timeout_cycles,
- const char * fnName,
- int line )
- {
- unsigned int irqStatus = portENTER_CRITICAL_NESTED();
- bool result = vPortCPUAcquireMutexIntsDisabled( mux, timeout_cycles, fnName, line );
-
- portEXIT_CRITICAL_NESTED( irqStatus );
- return result;
- }
-
-#else /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */
- void vPortCPUAcquireMutex( portMUX_TYPE * mux )
- {
- unsigned int irqStatus = portENTER_CRITICAL_NESTED();
-
- vPortCPUAcquireMutexIntsDisabled( mux, portMUX_NO_TIMEOUT );
- portEXIT_CRITICAL_NESTED( irqStatus );
- }
-
- bool vPortCPUAcquireMutexTimeout( portMUX_TYPE * mux,
- int timeout_cycles )
- {
- unsigned int irqStatus = portENTER_CRITICAL_NESTED();
- bool result = vPortCPUAcquireMutexIntsDisabled( mux, timeout_cycles );
-
- portEXIT_CRITICAL_NESTED( irqStatus );
- return result;
- }
-#endif /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */
-
-
-/*
- * For kernel use: Release a per-CPU mux
- *
- * Mux must be already locked by this core
- */
-#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- void vPortCPUReleaseMutex( portMUX_TYPE * mux,
- const char * fnName,
- int line )
- {
- unsigned int irqStatus = portENTER_CRITICAL_NESTED();
-
- vPortCPUReleaseMutexIntsDisabled( mux, fnName, line );
- portEXIT_CRITICAL_NESTED( irqStatus );
- }
-#else
- void vPortCPUReleaseMutex( portMUX_TYPE * mux )
- {
- unsigned int irqStatus = portENTER_CRITICAL_NESTED();
-
- vPortCPUReleaseMutexIntsDisabled( mux );
- portEXIT_CRITICAL_NESTED( irqStatus );
- }
-#endif /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */
-
-void vPortSetStackWatchpoint( void * pxStackStart )
-{
- /*Set watchpoint 1 to watch the last 32 bytes of the stack. */
- /*Unfortunately, the Xtensa watchpoints can't set a watchpoint on a random [base - base+n] region because */
- /*the size works by masking off the lowest address bits. For that reason, we futz a bit and watch the lowest 32 */
- /*bytes of the stack we can actually watch. In general, this can cause the watchpoint to be triggered at most */
- /*28 bytes early. The value 32 is chosen because it's larger than the stack canary, which in FreeRTOS is 20 bytes. */
- /*This way, we make sure we trigger before/when the stack canary is corrupted, not after. */
- int addr = ( int ) pxStackStart;
-
- addr = ( addr + 31 ) & ( ~31 );
- esp_set_watchpoint( 1, ( char * ) addr, 32, ESP_WATCHPOINT_STORE );
-}
-
-#if defined( CONFIG_SPIRAM_SUPPORT )
-
-/*
- * Compare & set (S32C1) does not work in external RAM. Instead, this routine uses a mux (in internal memory) to fake it.
- */
- static portMUX_TYPE extram_mux = portMUX_INITIALIZER_UNLOCKED;
-
- void uxPortCompareSetExtram( volatile uint32_t * addr,
- uint32_t compare,
- uint32_t * set )
- {
- uint32_t prev;
-
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- vPortCPUAcquireMutexIntsDisabled( &extram_mux, portMUX_NO_TIMEOUT, __FUNCTION__, __LINE__ );
- #else
- vPortCPUAcquireMutexIntsDisabled( &extram_mux, portMUX_NO_TIMEOUT );
- #endif
- prev = *addr;
-
- if( prev == compare )
- {
- *addr = *set;
- }
-
- *set = prev;
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- vPortCPUReleaseMutexIntsDisabled( &extram_mux, __FUNCTION__, __LINE__ );
- #else
- vPortCPUReleaseMutexIntsDisabled( &extram_mux );
- #endif
- }
-#endif //defined(CONFIG_SPIRAM_SUPPORT)
-
-
-
-uint32_t xPortGetTickRateHz( void )
-{
- return ( uint32_t ) configTICK_RATE_HZ;
-}
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portasm.S b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portasm.S
deleted file mode 100644
index b43e9be..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portasm.S
+++ /dev/null
@@ -1,653 +0,0 @@
-/*
-//-----------------------------------------------------------------------------
-// Copyright (c) 2003-2015 Cadence Design Systems, Inc.
-//
-// Permission is hereby granted, free of charge, to any person obtaining
-// a copy of this software and associated documentation files (the
-// "Software"), to deal in the Software without restriction, including
-// without limitation the rights to use, copy, modify, merge, publish,
-// distribute, sublicense, and/or sell copies of the Software, and to
-// permit persons to whom the Software is furnished to do so, subject to
-// the following conditions:
-//
-// The above copyright notice and this permission notice shall be included
-// in all copies or substantial portions of the Software.
-//
-// THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-// EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-// MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-// IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-// CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-// TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-// SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-//-----------------------------------------------------------------------------
-*/
-
-#include "xtensa_rtos.h"
-#include "sdkconfig.h"
-
-#define TOPOFSTACK_OFFS 0x00 /* StackType_t *pxTopOfStack */
-#define CP_TOPOFSTACK_OFFS 0x04 /* xMPU_SETTINGS.coproc_area */
-
-.extern pxCurrentTCB
-
-/*
-*******************************************************************************
-* Interrupt stack. The size of the interrupt stack is determined by the config
-* parameter "configISR_STACK_SIZE" in FreeRTOSConfig.h
-*******************************************************************************
-*/
-
- .data
- .align 16
- .global port_IntStack
- .global port_IntStackTop
- .global port_switch_flag
-port_IntStack:
- .space configISR_STACK_SIZE*portNUM_PROCESSORS /* This allocates stacks for each individual CPU. */
-port_IntStackTop:
- .word 0
-port_switch_flag:
- .space portNUM_PROCESSORS*4 /* One flag for each individual CPU. */
-
- .text
-
-/*
-*******************************************************************************
-* _frxt_setup_switch
-* void _frxt_setup_switch(void);
-*
-* Sets an internal flag indicating that a task switch is required on return
-* from interrupt handling.
-*
-*******************************************************************************
-*/
- .global _frxt_setup_switch
- .type _frxt_setup_switch,@function
- .align 4
-_frxt_setup_switch:
-
- ENTRY(16)
-
- getcoreid a3
- movi a2, port_switch_flag
- addx4 a2, a3, a2
-
- movi a3, 1
- s32i a3, a2, 0
-
- RET(16)
-
-
-
-
-
-
-/*
-*******************************************************************************
-* _frxt_int_enter
-* void _frxt_int_enter(void)
-*
-* Implements the Xtensa RTOS porting layer's XT_RTOS_INT_ENTER function for
-* freeRTOS. Saves the rest of the interrupt context (not already saved).
-* May only be called from assembly code by the 'call0' instruction, with
-* interrupts disabled.
-* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h.
-*
-*******************************************************************************
-*/
- .globl _frxt_int_enter
- .type _frxt_int_enter,@function
- .align 4
-_frxt_int_enter:
-
- /* Save a12-13 in the stack frame as required by _xt_context_save. */
- s32i a12, a1, XT_STK_A12
- s32i a13, a1, XT_STK_A13
-
- /* Save return address in a safe place (free a0). */
- mov a12, a0
-
- /* Save the rest of the interrupted context (preserves A12-13). */
- call0 _xt_context_save
-
- /*
- Save interrupted task's SP in TCB only if not nesting.
- Manage nesting directly rather than call the generic IntEnter()
- (in windowed ABI we can't call a C function here anyway because PS.EXCM is still set).
- */
- getcoreid a4
- movi a2, port_xSchedulerRunning
- addx4 a2, a4, a2
- movi a3, port_interruptNesting
- addx4 a3, a4, a3
- l32i a2, a2, 0 /* a2 = port_xSchedulerRunning */
- beqz a2, 1f /* scheduler not running, no tasks */
- l32i a2, a3, 0 /* a2 = port_interruptNesting */
- addi a2, a2, 1 /* increment nesting count */
- s32i a2, a3, 0 /* save nesting count */
- bnei a2, 1, .Lnested /* !=0 before incr, so nested */
-
- movi a2, pxCurrentTCB
- addx4 a2, a4, a2
- l32i a2, a2, 0 /* a2 = current TCB */
- beqz a2, 1f
- s32i a1, a2, TOPOFSTACK_OFFS /* pxCurrentTCB->pxTopOfStack = SP */
- movi a1, port_IntStack+configISR_STACK_SIZE /* a1 = top of intr stack for CPU 0 */
- movi a2, configISR_STACK_SIZE /* add configISR_STACK_SIZE * cpu_num to arrive at top of stack for cpu_num */
- mull a2, a4, a2
- add a1, a1, a2 /* for current proc */
-
-.Lnested:
-1:
- mov a0, a12 /* restore return addr and return */
- ret
-
-/*
-*******************************************************************************
-* _frxt_int_exit
-* void _frxt_int_exit(void)
-*
-* Implements the Xtensa RTOS porting layer's XT_RTOS_INT_EXIT function for
-* FreeRTOS. If required, calls vPortYieldFromInt() to perform task context
-* switching, restore the (possibly) new task's context, and return to the
-* exit dispatcher saved in the task's stack frame at XT_STK_EXIT.
-* May only be called from assembly code by the 'call0' instruction. Does not
-* return to caller.
-* See the description of the XT_RTOS_ENTER macro in xtensa_rtos.h.
-*
-*******************************************************************************
-*/
- .globl _frxt_int_exit
- .type _frxt_int_exit,@function
- .align 4
-_frxt_int_exit:
-
- getcoreid a4
- movi a2, port_xSchedulerRunning
- addx4 a2, a4, a2
- movi a3, port_interruptNesting
- addx4 a3, a4, a3
- rsil a0, XCHAL_EXCM_LEVEL /* lock out interrupts */
- l32i a2, a2, 0 /* a2 = port_xSchedulerRunning */
- beqz a2, .Lnoswitch /* scheduler not running, no tasks */
- l32i a2, a3, 0 /* a2 = port_interruptNesting */
- addi a2, a2, -1 /* decrement nesting count */
- s32i a2, a3, 0 /* save nesting count */
- bnez a2, .Lnesting /* !=0 after decr so still nested */
-
- movi a2, pxCurrentTCB
- addx4 a2, a4, a2
- l32i a2, a2, 0 /* a2 = current TCB */
- beqz a2, 1f /* no task ? go to dispatcher */
- l32i a1, a2, TOPOFSTACK_OFFS /* SP = pxCurrentTCB->pxTopOfStack */
-
- movi a2, port_switch_flag /* address of switch flag */
- addx4 a2, a4, a2 /* point to flag for this cpu */
- l32i a3, a2, 0 /* a3 = port_switch_flag */
- beqz a3, .Lnoswitch /* flag = 0 means no switch reqd */
- movi a3, 0
- s32i a3, a2, 0 /* zero out the flag for next time */
-
-1:
- /*
- Call0 ABI callee-saved regs a12-15 need to be saved before possible preemption.
- However a12-13 were already saved by _frxt_int_enter().
- */
- #ifdef __XTENSA_CALL0_ABI__
- s32i a14, a1, XT_STK_A14
- s32i a15, a1, XT_STK_A15
- #endif
-
- #ifdef __XTENSA_CALL0_ABI__
- call0 vPortYieldFromInt /* call dispatch inside the function; never returns */
- #else
- call4 vPortYieldFromInt /* this one returns */
- call0 _frxt_dispatch /* tail-call dispatcher */
- /* Never returns here. */
- #endif
-
-.Lnoswitch:
- /*
- If we came here then about to resume the interrupted task.
- */
-
-.Lnesting:
- /*
- We come here only if there was no context switch, that is if this
- is a nested interrupt, or the interrupted task was not preempted.
- In either case there's no need to load the SP.
- */
-
- /* Restore full context from interrupt stack frame */
- call0 _xt_context_restore
-
- /*
- Must return via the exit dispatcher corresponding to the entrypoint from which
- this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt
- stack frame is deallocated in the exit dispatcher.
- */
- l32i a0, a1, XT_STK_EXIT
- ret
-
-
-/*
-**********************************************************************************************************
-* _frxt_timer_int
-* void _frxt_timer_int(void)
-*
-* Implements the Xtensa RTOS porting layer's XT_RTOS_TIMER_INT function for FreeRTOS.
-* Called every timer interrupt.
-* Manages the tick timer and calls xPortSysTickHandler() every tick.
-* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h.
-*
-* Callable from C (obeys ABI conventions). Implemented in assmebly code for performance.
-*
-**********************************************************************************************************
-*/
- .globl _frxt_timer_int
- .type _frxt_timer_int,@function
- .align 4
-_frxt_timer_int:
-
- /*
- Xtensa timers work by comparing a cycle counter with a preset value. Once the match occurs
- an interrupt is generated, and the handler has to set a new cycle count into the comparator.
- To avoid clock drift due to interrupt latency, the new cycle count is computed from the old,
- not the time the interrupt was serviced. However if a timer interrupt is ever serviced more
- than one tick late, it is necessary to process multiple ticks until the new cycle count is
- in the future, otherwise the next timer interrupt would not occur until after the cycle
- counter had wrapped (2^32 cycles later).
-
- do {
- ticks++;
- old_ccompare = read_ccompare_i();
- write_ccompare_i( old_ccompare + divisor );
- service one tick;
- diff = read_ccount() - old_ccompare;
- } while ( diff > divisor );
- */
-
- ENTRY(16)
-
- #ifdef CONFIG_PM_TRACE
- movi a6, 1 /* = ESP_PM_TRACE_TICK */
- getcoreid a7
- call4 esp_pm_trace_enter
- #endif // CONFIG_PM_TRACE
-
-.L_xt_timer_int_catchup:
-
- /* Update the timer comparator for the next tick. */
- #ifdef XT_CLOCK_FREQ
- movi a2, XT_TICK_DIVISOR /* a2 = comparator increment */
- #else
- movi a3, _xt_tick_divisor
- l32i a2, a3, 0 /* a2 = comparator increment */
- #endif
- rsr a3, XT_CCOMPARE /* a3 = old comparator value */
- add a4, a3, a2 /* a4 = new comparator value */
- wsr a4, XT_CCOMPARE /* update comp. and clear interrupt */
- esync
-
- #ifdef __XTENSA_CALL0_ABI__
- /* Preserve a2 and a3 across C calls. */
- s32i a2, sp, 4
- s32i a3, sp, 8
- #endif
-
- /* Call the FreeRTOS tick handler (see port.c). */
- #ifdef __XTENSA_CALL0_ABI__
- call0 xPortSysTickHandler
- #else
- call4 xPortSysTickHandler
- #endif
-
- #ifdef __XTENSA_CALL0_ABI__
- /* Restore a2 and a3. */
- l32i a2, sp, 4
- l32i a3, sp, 8
- #endif
-
- /* Check if we need to process more ticks to catch up. */
- esync /* ensure comparator update complete */
- rsr a4, CCOUNT /* a4 = cycle count */
- sub a4, a4, a3 /* diff = ccount - old comparator */
- blt a2, a4, .L_xt_timer_int_catchup /* repeat while diff > divisor */
-
-#ifdef CONFIG_PM_TRACE
- movi a6, 1 /* = ESP_PM_TRACE_TICK */
- getcoreid a7
- call4 esp_pm_trace_exit
-#endif // CONFIG_PM_TRACE
-
- RET(16)
-
- /*
-**********************************************************************************************************
-* _frxt_tick_timer_init
-* void _frxt_tick_timer_init(void)
-*
-* Initialize timer and timer interrrupt handler (_xt_tick_divisor_init() has already been been called).
-* Callable from C (obeys ABI conventions on entry).
-*
-**********************************************************************************************************
-*/
- .globl _frxt_tick_timer_init
- .type _frxt_tick_timer_init,@function
- .align 4
-_frxt_tick_timer_init:
-
- ENTRY(16)
-
-
- /* Set up the periodic tick timer (assume enough time to complete init). */
- #ifdef XT_CLOCK_FREQ
- movi a3, XT_TICK_DIVISOR
- #else
- movi a2, _xt_tick_divisor
- l32i a3, a2, 0
- #endif
- rsr a2, CCOUNT /* current cycle count */
- add a2, a2, a3 /* time of first timer interrupt */
- wsr a2, XT_CCOMPARE /* set the comparator */
-
- /*
- Enable the timer interrupt at the device level. Don't write directly
- to the INTENABLE register because it may be virtualized.
- */
- #ifdef __XTENSA_CALL0_ABI__
- movi a2, XT_TIMER_INTEN
- call0 xt_ints_on
- #else
- movi a6, XT_TIMER_INTEN
- call4 xt_ints_on
- #endif
-
- RET(16)
-
-/*
-**********************************************************************************************************
-* DISPATCH THE HIGH READY TASK
-* void _frxt_dispatch(void)
-*
-* Switch context to the highest priority ready task, restore its state and dispatch control to it.
-*
-* This is a common dispatcher that acts as a shared exit path for all the context switch functions
-* including vPortYield() and vPortYieldFromInt(), all of which tail-call this dispatcher
-* (for windowed ABI vPortYieldFromInt() calls it indirectly via _frxt_int_exit() ).
-*
-* The Xtensa port uses different stack frames for solicited and unsolicited task suspension (see
-* comments on stack frames in xtensa_context.h). This function restores the state accordingly.
-* If restoring a task that solicited entry, restores the minimal state and leaves CPENABLE clear.
-* If restoring a task that was preempted, restores all state including the task's CPENABLE.
-*
-* Entry:
-* pxCurrentTCB points to the TCB of the task to suspend,
-* Because it is tail-called without a true function entrypoint, it needs no 'entry' instruction.
-*
-* Exit:
-* If incoming task called vPortYield() (solicited), this function returns as if from vPortYield().
-* If incoming task was preempted by an interrupt, this function jumps to exit dispatcher.
-*
-**********************************************************************************************************
-*/
- .globl _frxt_dispatch
- .type _frxt_dispatch,@function
- .align 4
-_frxt_dispatch:
-
- #ifdef __XTENSA_CALL0_ABI__
- call0 vTaskSwitchContext // Get next TCB to resume
- movi a2, pxCurrentTCB
- getcoreid a3
- addx4 a2, a3, a2
- #else
- call4 vTaskSwitchContext // Get next TCB to resume
- movi a2, pxCurrentTCB
- getcoreid a3
- addx4 a2, a3, a2
- #endif
- l32i a3, a2, 0
- l32i sp, a3, TOPOFSTACK_OFFS /* SP = next_TCB->pxTopOfStack; */
- s32i a3, a2, 0
-
- /* Determine the type of stack frame. */
- l32i a2, sp, XT_STK_EXIT /* exit dispatcher or solicited flag */
- bnez a2, .L_frxt_dispatch_stk
-
-.L_frxt_dispatch_sol:
-
- /* Solicited stack frame. Restore minimal context and return from vPortYield(). */
- l32i a3, sp, XT_SOL_PS
- #ifdef __XTENSA_CALL0_ABI__
- l32i a12, sp, XT_SOL_A12
- l32i a13, sp, XT_SOL_A13
- l32i a14, sp, XT_SOL_A14
- l32i a15, sp, XT_SOL_A15
- #endif
- l32i a0, sp, XT_SOL_PC
- #if XCHAL_CP_NUM > 0
- /* Ensure wsr.CPENABLE is complete (should be, it was cleared on entry). */
- rsync
- #endif
- /* As soons as PS is restored, interrupts can happen. No need to sync PS. */
- wsr a3, PS
- #ifdef __XTENSA_CALL0_ABI__
- addi sp, sp, XT_SOL_FRMSZ
- ret
- #else
- retw
- #endif
-
-.L_frxt_dispatch_stk:
-
- #if XCHAL_CP_NUM > 0
- /* Restore CPENABLE from task's co-processor save area. */
- movi a3, pxCurrentTCB /* cp_state = */
- getcoreid a2
- addx4 a3, a2, a3
- l32i a3, a3, 0
- l32i a2, a3, CP_TOPOFSTACK_OFFS /* StackType_t *pxStack; */
- l16ui a3, a2, XT_CPENABLE /* CPENABLE = cp_state->cpenable; */
- wsr a3, CPENABLE
- #endif
-
- /* Interrupt stack frame. Restore full context and return to exit dispatcher. */
- call0 _xt_context_restore
-
- /* In Call0 ABI, restore callee-saved regs (A12, A13 already restored). */
- #ifdef __XTENSA_CALL0_ABI__
- l32i a14, sp, XT_STK_A14
- l32i a15, sp, XT_STK_A15
- #endif
-
- #if XCHAL_CP_NUM > 0
- /* Ensure wsr.CPENABLE has completed. */
- rsync
- #endif
-
- /*
- Must return via the exit dispatcher corresponding to the entrypoint from which
- this was called. Interruptee's A0, A1, PS, PC are restored and the interrupt
- stack frame is deallocated in the exit dispatcher.
- */
- l32i a0, sp, XT_STK_EXIT
- ret
-
-
-/*
-**********************************************************************************************************
-* PERFORM A SOLICTED CONTEXT SWITCH (from a task)
-* void vPortYield(void)
-*
-* This function saves the minimal state needed for a solicited task suspension, clears CPENABLE,
-* then tail-calls the dispatcher _frxt_dispatch() to perform the actual context switch
-*
-* At Entry:
-* pxCurrentTCB points to the TCB of the task to suspend
-* Callable from C (obeys ABI conventions on entry).
-*
-* Does not return to caller.
-*
-**********************************************************************************************************
-*/
- .globl vPortYield
- .type vPortYield,@function
- .align 4
-vPortYield:
-
- #ifdef __XTENSA_CALL0_ABI__
- addi sp, sp, -XT_SOL_FRMSZ
- #else
- entry sp, XT_SOL_FRMSZ
- #endif
-
- rsr a2, PS
- s32i a0, sp, XT_SOL_PC
- s32i a2, sp, XT_SOL_PS
- #ifdef __XTENSA_CALL0_ABI__
- s32i a12, sp, XT_SOL_A12 /* save callee-saved registers */
- s32i a13, sp, XT_SOL_A13
- s32i a14, sp, XT_SOL_A14
- s32i a15, sp, XT_SOL_A15
- #else
- /* Spill register windows. Calling xthal_window_spill() causes extra */
- /* spills and reloads, so we will set things up to call the _nw version */
- /* instead to save cycles. */
- movi a6, ~(PS_WOE_MASK|PS_INTLEVEL_MASK) /* spills a4-a7 if needed */
- and a2, a2, a6 /* clear WOE, INTLEVEL */
- addi a2, a2, XCHAL_EXCM_LEVEL /* set INTLEVEL */
- wsr a2, PS
- rsync
- call0 xthal_window_spill_nw
- l32i a2, sp, XT_SOL_PS /* restore PS */
- wsr a2, PS
- #endif
-
- rsil a2, XCHAL_EXCM_LEVEL /* disable low/med interrupts */
-
- #if XCHAL_CP_NUM > 0
- /* Save coprocessor callee-saved state (if any). At this point CPENABLE */
- /* should still reflect which CPs were in use (enabled). */
- call0 _xt_coproc_savecs
- #endif
-
- movi a2, pxCurrentTCB
- getcoreid a3
- addx4 a2, a3, a2
- l32i a2, a2, 0 /* a2 = pxCurrentTCB */
- movi a3, 0
- s32i a3, sp, XT_SOL_EXIT /* 0 to flag as solicited frame */
- s32i sp, a2, TOPOFSTACK_OFFS /* pxCurrentTCB->pxTopOfStack = SP */
-
- #if XCHAL_CP_NUM > 0
- /* Clear CPENABLE, also in task's co-processor state save area. */
- l32i a2, a2, CP_TOPOFSTACK_OFFS /* a2 = pxCurrentTCB->cp_state */
- movi a3, 0
- wsr a3, CPENABLE
- beqz a2, 1f
- s16i a3, a2, XT_CPENABLE /* clear saved cpenable */
-1:
- #endif
-
- /* Tail-call dispatcher. */
- call0 _frxt_dispatch
- /* Never reaches here. */
-
-
-/*
-**********************************************************************************************************
-* PERFORM AN UNSOLICITED CONTEXT SWITCH (from an interrupt)
-* void vPortYieldFromInt(void)
-*
-* This calls the context switch hook (removed), saves and clears CPENABLE, then tail-calls the dispatcher
-* _frxt_dispatch() to perform the actual context switch.
-*
-* At Entry:
-* Interrupted task context has been saved in an interrupt stack frame at pxCurrentTCB->pxTopOfStack.
-* pxCurrentTCB points to the TCB of the task to suspend,
-* Callable from C (obeys ABI conventions on entry).
-*
-* At Exit:
-* Windowed ABI defers the actual context switch until the stack is unwound to interrupt entry.
-* Call0 ABI tail-calls the dispatcher directly (no need to unwind) so does not return to caller.
-*
-**********************************************************************************************************
-*/
- .globl vPortYieldFromInt
- .type vPortYieldFromInt,@function
- .align 4
-vPortYieldFromInt:
-
- ENTRY(16)
-
- #if XCHAL_CP_NUM > 0
- /* Save CPENABLE in task's co-processor save area, and clear CPENABLE. */
- movi a3, pxCurrentTCB /* cp_state = */
- getcoreid a2
- addx4 a3, a2, a3
- l32i a3, a3, 0
-
- l32i a2, a3, CP_TOPOFSTACK_OFFS
-
- rsr a3, CPENABLE
- s16i a3, a2, XT_CPENABLE /* cp_state->cpenable = CPENABLE; */
- movi a3, 0
- wsr a3, CPENABLE /* disable all co-processors */
- #endif
-
- #ifdef __XTENSA_CALL0_ABI__
- /* Tail-call dispatcher. */
- call0 _frxt_dispatch
- /* Never reaches here. */
- #else
- RET(16)
- #endif
-
-/*
-**********************************************************************************************************
-* _frxt_task_coproc_state
-* void _frxt_task_coproc_state(void)
-*
-* Implements the Xtensa RTOS porting layer's XT_RTOS_CP_STATE function for FreeRTOS.
-*
-* May only be called when a task is running, not within an interrupt handler (returns 0 in that case).
-* May only be called from assembly code by the 'call0' instruction. Does NOT obey ABI conventions.
-* Returns in A15 a pointer to the base of the co-processor state save area for the current task.
-* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h.
-*
-**********************************************************************************************************
-*/
-#if XCHAL_CP_NUM > 0
-
- .globl _frxt_task_coproc_state
- .type _frxt_task_coproc_state,@function
- .align 4
-_frxt_task_coproc_state:
-
-
- /* We can use a3 as a scratchpad, the instances of code calling XT_RTOS_CP_STATE don't seem to need it saved. */
- getcoreid a3
- movi a15, port_xSchedulerRunning /* if (port_xSchedulerRunning */
- addx4 a15, a3,a15
- l32i a15, a15, 0
- beqz a15, 1f
- movi a15, port_interruptNesting /* && port_interruptNesting == 0 */
- addx4 a15, a3, a15
- l32i a15, a15, 0
- bnez a15, 1f
-
- movi a15, pxCurrentTCB
- addx4 a15, a3, a15
- l32i a15, a15, 0 /* && pxCurrentTCB != 0) { */
-
-
- beqz a15, 2f
- l32i a15, a15, CP_TOPOFSTACK_OFFS
- ret
-
-1: movi a15, 0
-2: ret
-
-#endif /* XCHAL_CP_NUM > 0 */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.h
deleted file mode 100644
index 4c2f9dc..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.h
+++ /dev/null
@@ -1,113 +0,0 @@
-/*
- * Copyright (C) 2016-2017 Espressif Shanghai PTE LTD
- * Copyright (C) 2015 Real Time Engineers Ltd.
- *
- * All rights reserved
- *
- * FreeRTOS is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License (version 2) as published by the
- * Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
- *
- ***************************************************************************
- * >>! NOTE: The modification to the GPL is included to allow you to !<<
- * >>! distribute a combined work that includes FreeRTOS without being !<<
- * >>! obliged to provide the source code for proprietary components !<<
- * >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
- *
- * FreeRTOS 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. Full license text is available on the following
- * link: https://www.FreeRTOS.org/a00114.html
- */
-
-/* This header exists for performance reasons, in order to inline the
- * implementation of vPortCPUAcquireMutexIntsDisabled and
- * vPortCPUReleaseMutexIntsDisabled into the
- * vTaskEnterCritical/vTaskExitCritical functions in task.c as well as the
- * vPortCPUAcquireMutex/vPortCPUReleaseMutex implementations.
- *
- * Normally this kind of performance hack is over the top, but
- * vTaskEnterCritical/vTaskExitCritical is called a great
- * deal by FreeRTOS internals.
- *
- * It should be #included by freertos port.c or tasks.c, in esp-idf.
- *
- * The way it works is that it essentially uses portmux_impl.inc.h as a
- * generator template of sorts. When no external memory is used, this
- * template is only used to generate the vPortCPUAcquireMutexIntsDisabledInternal
- * and vPortCPUReleaseMutexIntsDisabledInternal functions, which use S32C1 to
- * do an atomic compare & swap. When external memory is used the functions
- * vPortCPUAcquireMutexIntsDisabledExtram and vPortCPUReleaseMutexIntsDisabledExtram
- * are also generated, which use uxPortCompareSetExtram to fake the S32C1 instruction.
- * The wrapper functions vPortCPUAcquireMutexIntsDisabled and
- * vPortCPUReleaseMutexIntsDisabled will then use the appropriate function to do the
- * actual lock/unlock.
- */
-#include "soc/cpu.h"
-#include "portable.h"
-
-/* XOR one core ID with this value to get the other core ID */
-#define CORE_ID_XOR_SWAP ( CORE_ID_PRO ^ CORE_ID_APP )
-
-
-
-/*Define the mux routines for use with muxes in internal RAM */
-#define PORTMUX_AQUIRE_MUX_FN_NAME vPortCPUAcquireMutexIntsDisabledInternal
-#define PORTMUX_RELEASE_MUX_FN_NAME vPortCPUReleaseMutexIntsDisabledInternal
-#define PORTMUX_COMPARE_SET_FN_NAME uxPortCompareSet
-#include "portmux_impl.inc.h"
-#undef PORTMUX_AQUIRE_MUX_FN_NAME
-#undef PORTMUX_RELEASE_MUX_FN_NAME
-#undef PORTMUX_COMPARE_SET_FN_NAME
-
-
-#if defined( CONFIG_SPIRAM_SUPPORT )
-
- #define PORTMUX_AQUIRE_MUX_FN_NAME vPortCPUAcquireMutexIntsDisabledExtram
- #define PORTMUX_RELEASE_MUX_FN_NAME vPortCPUReleaseMutexIntsDisabledExtram
- #define PORTMUX_COMPARE_SET_FN_NAME uxPortCompareSetExtram
- #include "portmux_impl.inc.h"
- #undef PORTMUX_AQUIRE_MUX_FN_NAME
- #undef PORTMUX_RELEASE_MUX_FN_NAME
- #undef PORTMUX_COMPARE_SET_FN_NAME
-
-#endif
-
-
-#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- #define PORTMUX_AQUIRE_MUX_FN_ARGS portMUX_TYPE * mux, int timeout_cycles, const char * fnName, int line
- #define PORTMUX_RELEASE_MUX_FN_ARGS portMUX_TYPE * mux, const char * fnName, int line
- #define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( x ) x, timeout_cycles, fnName, line
- #define PORTMUX_RELEASE_MUX_FN_CALL_ARGS( x ) x, fnName, line
-#else
- #define PORTMUX_AQUIRE_MUX_FN_ARGS portMUX_TYPE * mux, int timeout_cycles
- #define PORTMUX_RELEASE_MUX_FN_ARGS portMUX_TYPE * mux
- #define PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( x ) x, timeout_cycles
- #define PORTMUX_RELEASE_MUX_FN_CALL_ARGS( x ) x
-#endif
-
-
-static inline bool __attribute__( ( always_inline ) ) vPortCPUAcquireMutexIntsDisabled( PORTMUX_AQUIRE_MUX_FN_ARGS )
-{
- #if defined( CONFIG_SPIRAM_SUPPORT )
- if( esp_ptr_external_ram( mux ) )
- {
- return vPortCPUAcquireMutexIntsDisabledExtram( PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( mux ) );
- }
- #endif
- return vPortCPUAcquireMutexIntsDisabledInternal( PORTMUX_AQUIRE_MUX_FN_CALL_ARGS( mux ) );
-}
-
-
-static inline void vPortCPUReleaseMutexIntsDisabled( PORTMUX_RELEASE_MUX_FN_ARGS )
-{
- #if defined( CONFIG_SPIRAM_SUPPORT )
- if( esp_ptr_external_ram( mux ) )
- {
- vPortCPUReleaseMutexIntsDisabledExtram( PORTMUX_RELEASE_MUX_FN_CALL_ARGS( mux ) );
- return;
- }
- #endif
- vPortCPUReleaseMutexIntsDisabledInternal( PORTMUX_RELEASE_MUX_FN_CALL_ARGS( mux ) );
-}
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.inc.h b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.inc.h
deleted file mode 100644
index e98d488..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/portmux_impl.inc.h
+++ /dev/null
@@ -1,200 +0,0 @@
-/*
- * Copyright (C) 2016-2017 Espressif Shanghai PTE LTD
- * Copyright (C) 2015 Real Time Engineers Ltd.
- *
- * All rights reserved
- *
- * FreeRTOS is free software; you can redistribute it and/or modify it under
- * the terms of the GNU General Public License (version 2) as published by the
- * Free Software Foundation >>!AND MODIFIED BY!<< the FreeRTOS exception.
- *
- ***************************************************************************
- * >>! NOTE: The modification to the GPL is included to allow you to !<<
- * >>! distribute a combined work that includes FreeRTOS without being !<<
- * >>! obliged to provide the source code for proprietary components !<<
- * >>! outside of the FreeRTOS kernel. !<<
- ***************************************************************************
- *
- * FreeRTOS 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. Full license text is available on the following
- * link: https://www.FreeRTOS.org/a00114.html
- */
-
-
-/*
- * Warning: funky preprocessor hackery ahead. Including these headers will generate two
- * functions, which names are defined by the preprocessor macros
- * PORTMUX_AQUIRE_MUX_FN_NAME and PORTMUX_RELEASE_MUX_FN_NAME. In order to do the compare
- * and exchange function, they will use whatever PORTMUX_COMPARE_SET_FN_NAME resolves to.
- *
- * In some scenarios, this header is included *twice* in portmux_impl.h: one time
- * for the 'normal' mux code which uses a compare&exchange routine, another time
- * to generate code for a second set of these routines that use a second mux
- * (in internal ram) to fake a compare&exchange on a variable in external memory.
- */
-
-
-
-static inline bool __attribute__( ( always_inline ) )
-#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- PORTMUX_AQUIRE_MUX_FN_NAME( portMUX_TYPE * mux,
- int timeout_cycles,
- const char * fnName,
- int line )
- {
-#else
- PORTMUX_AQUIRE_MUX_FN_NAME( portMUX_TYPE * mux, int timeout_cycles )
- {
- #endif
-
-
- #if !CONFIG_FREERTOS_UNICORE
- uint32_t res;
- portBASE_TYPE coreID, otherCoreID;
- uint32_t ccount_start;
- bool set_timeout = timeout_cycles > portMUX_NO_TIMEOUT;
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- if( !set_timeout )
- {
- timeout_cycles = 10000; /* Always set a timeout in debug mode */
- set_timeout = true;
- }
- #endif
-
- if( set_timeout ) /* Timeout */
- {
- RSR( CCOUNT, ccount_start );
- }
-
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- uint32_t owner = mux->owner;
-
- if( ( owner != portMUX_FREE_VAL ) && ( owner != CORE_ID_PRO ) && ( owner != CORE_ID_APP ) )
- {
- ets_printf( "ERROR: vPortCPUAcquireMutex: mux %p is uninitialized (0x%X)! Called from %s line %d.\n", mux, owner, fnName, line );
- mux->owner = portMUX_FREE_VAL;
- }
- #endif
-
- /* Spin until we own the core */
-
- RSR( PRID, coreID );
-
- /* Note: coreID is the full 32 bit core ID (CORE_ID_PRO/CORE_ID_APP),
- * not the 0/1 value returned by xPortGetCoreID()
- */
- otherCoreID = CORE_ID_XOR_SWAP ^ coreID;
-
- do
- {
- /* mux->owner should be one of portMUX_FREE_VAL, CORE_ID_PRO,
- * CORE_ID_APP:
- *
- * - If portMUX_FREE_VAL, we want to atomically set to 'coreID'.
- * - If "our" coreID, we can drop through immediately.
- * - If "otherCoreID", we spin here.
- */
- res = coreID;
- PORTMUX_COMPARE_SET_FN_NAME( &mux->owner, portMUX_FREE_VAL, &res );
-
- if( res != otherCoreID )
- {
- break; /* mux->owner is "our" coreID */
- }
-
- if( set_timeout )
- {
- uint32_t ccount_now;
- RSR( CCOUNT, ccount_now );
-
- if( ccount_now - ccount_start > ( unsigned ) timeout_cycles )
- {
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- ets_printf( "Timeout on mux! last non-recursive lock %s line %d, curr %s line %d\n", mux->lastLockedFn, mux->lastLockedLine, fnName, line );
- ets_printf( "Owner 0x%x count %d\n", mux->owner, mux->count );
- #endif
- return false;
- }
- }
- } while( 1 );
-
- assert( res == coreID || res == portMUX_FREE_VAL ); /* any other value implies memory corruption or uninitialized mux */
- assert( ( res == portMUX_FREE_VAL ) == ( mux->count == 0 ) ); /* we're first to lock iff count is zero */
- assert( mux->count < 0xFF ); /* Bad count value implies memory corruption */
-
- /* now we own it, we can increment the refcount */
- mux->count++;
-
-
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- if( res == portMUX_FREE_VAL ) /*initial lock */
- {
- mux->lastLockedFn = fnName;
- mux->lastLockedLine = line;
- }
- else
- {
- ets_printf( "Recursive lock: count=%d last non-recursive lock %s line %d, curr %s line %d\n", mux->count - 1,
- mux->lastLockedFn, mux->lastLockedLine, fnName, line );
- }
- #endif /* CONFIG_FREERTOS_PORTMUX_DEBUG */
- #endif /* CONFIG_FREERTOS_UNICORE */
- return true;
- }
-
-#ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- static inline void PORTMUX_RELEASE_MUX_FN_NAME( portMUX_TYPE * mux,
- const char * fnName,
- int line )
- {
-#else
- static inline void PORTMUX_RELEASE_MUX_FN_NAME( portMUX_TYPE * mux )
- {
- #endif
-
-
- #if !CONFIG_FREERTOS_UNICORE
- portBASE_TYPE coreID;
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- const char * lastLockedFn = mux->lastLockedFn;
- int lastLockedLine = mux->lastLockedLine;
- mux->lastLockedFn = fnName;
- mux->lastLockedLine = line;
- uint32_t owner = mux->owner;
-
- if( ( owner != portMUX_FREE_VAL ) && ( owner != CORE_ID_PRO ) && ( owner != CORE_ID_APP ) )
- {
- ets_printf( "ERROR: vPortCPUReleaseMutex: mux %p is invalid (0x%x)!\n", mux, mux->owner );
- }
- #endif /* ifdef CONFIG_FREERTOS_PORTMUX_DEBUG */
-
- #if CONFIG_FREERTOS_PORTMUX_DEBUG || !defined( NDEBUG )
- RSR( PRID, coreID );
- #endif
-
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG
- if( coreID != mux->owner )
- {
- ets_printf( "ERROR: vPortCPUReleaseMutex: mux %p was already unlocked!\n", mux );
- ets_printf( "Last non-recursive unlock %s line %d, curr unlock %s line %d\n", lastLockedFn, lastLockedLine, fnName, line );
- }
- #endif
-
- assert( coreID == mux->owner ); /* This is a mutex we didn't lock, or it's corrupt */
-
- mux->count--;
-
- if( mux->count == 0 )
- {
- mux->owner = portMUX_FREE_VAL;
- }
- else
- {
- assert( mux->count < 0x100 ); /* Indicates memory corruption */
- #ifdef CONFIG_FREERTOS_PORTMUX_DEBUG_RECURSIVE
- ets_printf( "Recursive unlock: count=%d last locked %s line %d, curr %s line %d\n", mux->count, lastLockedFn, lastLockedLine, fnName, line );
- #endif
- }
- #endif //!CONFIG_FREERTOS_UNICORE
- }
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_context.S b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_context.S
deleted file mode 100644
index fedf428..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_context.S
+++ /dev/null
@@ -1,648 +0,0 @@
-/*******************************************************************************
-Copyright (c) 2006-2015 Cadence Design Systems Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------------------------------
-
- XTENSA CONTEXT SAVE AND RESTORE ROUTINES
-
-Low-level Call0 functions for handling generic context save and restore of
-registers not specifically addressed by the interrupt vectors and handlers.
-Those registers (not handled by these functions) are PC, PS, A0, A1 (SP).
-Except for the calls to RTOS functions, this code is generic to Xtensa.
-
-Note that in Call0 ABI, interrupt handlers are expected to preserve the callee-
-save regs (A12-A15), which is always the case if the handlers are coded in C.
-However A12, A13 are made available as scratch registers for interrupt dispatch
-code, so are presumed saved anyway, and are always restored even in Call0 ABI.
-Only A14, A15 are truly handled as callee-save regs.
-
-Because Xtensa is a configurable architecture, this port supports all user
-generated configurations (except restrictions stated in the release notes).
-This is accomplished by conditional compilation using macros and functions
-defined in the Xtensa HAL (hardware adaptation layer) for your configuration.
-Only the processor state included in your configuration is saved and restored,
-including any processor state added by user configuration options or TIE.
-
-*******************************************************************************/
-
-/* Warn nicely if this file gets named with a lowercase .s instead of .S: */
-#define NOERROR #
-NOERROR: .error "C preprocessor needed for this file: make sure its filename\
- ends in uppercase .S, or use xt-xcc's -x assembler-with-cpp option."
-
-
-#include "xtensa_rtos.h"
-#include "xtensa_context.h"
-
-#ifdef XT_USE_OVLY
-#include <xtensa/overlay_os_asm.h>
-#endif
-
- .text
-
-
-
-/*******************************************************************************
-
-_xt_context_save
-
- !! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !!
-
-Saves all Xtensa processor state except PC, PS, A0, A1 (SP), A12, A13, in the
-interrupt stack frame defined in xtensa_rtos.h.
-Its counterpart is _xt_context_restore (which also restores A12, A13).
-
-Caller is expected to have saved PC, PS, A0, A1 (SP), A12, A13 in the frame.
-This function preserves A12 & A13 in order to provide the caller with 2 scratch
-regs that need not be saved over the call to this function. The choice of which
-2 regs to provide is governed by xthal_window_spill_nw and xthal_save_extra_nw,
-to avoid moving data more than necessary. Caller can assign regs accordingly.
-
-Entry Conditions:
- A0 = Return address in caller.
- A1 = Stack pointer of interrupted thread or handler ("interruptee").
- Original A12, A13 have already been saved in the interrupt stack frame.
- Other processor state except PC, PS, A0, A1 (SP), A12, A13, is as at the
- point of interruption.
- If windowed ABI, PS.EXCM = 1 (exceptions disabled).
-
-Exit conditions:
- A0 = Return address in caller.
- A1 = Stack pointer of interrupted thread or handler ("interruptee").
- A12, A13 as at entry (preserved).
- If windowed ABI, PS.EXCM = 1 (exceptions disabled).
-
-*******************************************************************************/
-
- .global _xt_context_save
- .type _xt_context_save,@function
- .align 4
- .literal_position
- .align 4
-_xt_context_save:
-
- s32i a2, sp, XT_STK_A2
- s32i a3, sp, XT_STK_A3
- s32i a4, sp, XT_STK_A4
- s32i a5, sp, XT_STK_A5
- s32i a6, sp, XT_STK_A6
- s32i a7, sp, XT_STK_A7
- s32i a8, sp, XT_STK_A8
- s32i a9, sp, XT_STK_A9
- s32i a10, sp, XT_STK_A10
- s32i a11, sp, XT_STK_A11
-
- /*
- Call0 ABI callee-saved regs a12-15 do not need to be saved here.
- a12-13 are the caller's responsibility so it can use them as scratch.
- So only need to save a14-a15 here for Windowed ABI (not Call0).
- */
- #ifndef __XTENSA_CALL0_ABI__
- s32i a14, sp, XT_STK_A14
- s32i a15, sp, XT_STK_A15
- #endif
-
- rsr a3, SAR
- s32i a3, sp, XT_STK_SAR
-
- #if XCHAL_HAVE_LOOPS
- rsr a3, LBEG
- s32i a3, sp, XT_STK_LBEG
- rsr a3, LEND
- s32i a3, sp, XT_STK_LEND
- rsr a3, LCOUNT
- s32i a3, sp, XT_STK_LCOUNT
- #endif
-
- #ifdef XT_USE_SWPRI
- /* Save virtual priority mask */
- movi a3, _xt_vpri_mask
- l32i a3, a3, 0
- s32i a3, sp, XT_STK_VPRI
- #endif
-
- #if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__)
- mov a9, a0 /* preserve ret addr */
- #endif
-
- #ifndef __XTENSA_CALL0_ABI__
- /*
- To spill the reg windows, temp. need pre-interrupt stack ptr and a4-15.
- Need to save a9,12,13 temporarily (in frame temps) and recover originals.
- Interrupts need to be disabled below XCHAL_EXCM_LEVEL and window overflow
- and underflow exceptions disabled (assured by PS.EXCM == 1).
- */
- s32i a12, sp, XT_STK_TMP0 /* temp. save stuff in stack frame */
- s32i a13, sp, XT_STK_TMP1
- s32i a9, sp, XT_STK_TMP2
-
- /*
- Save the overlay state if we are supporting overlays. Since we just saved
- three registers, we can conveniently use them here. Note that as of now,
- overlays only work for windowed calling ABI.
- */
- #ifdef XT_USE_OVLY
- l32i a9, sp, XT_STK_PC /* recover saved PC */
- _xt_overlay_get_state a9, a12, a13
- s32i a9, sp, XT_STK_OVLY /* save overlay state */
- #endif
-
- l32i a12, sp, XT_STK_A12 /* recover original a9,12,13 */
- l32i a13, sp, XT_STK_A13
- l32i a9, sp, XT_STK_A9
- addi sp, sp, XT_STK_FRMSZ /* restore the interruptee's SP */
- call0 xthal_window_spill_nw /* preserves only a4,5,8,9,12,13 */
- addi sp, sp, -XT_STK_FRMSZ
- l32i a12, sp, XT_STK_TMP0 /* recover stuff from stack frame */
- l32i a13, sp, XT_STK_TMP1
- l32i a9, sp, XT_STK_TMP2
- #endif
-
- #if XCHAL_EXTRA_SA_SIZE > 0
- /*
- NOTE: Normally the xthal_save_extra_nw macro only affects address
- registers a2-a5. It is theoretically possible for Xtensa processor
- designers to write TIE that causes more address registers to be
- affected, but it is generally unlikely. If that ever happens,
- more registers need to be saved/restored around this macro invocation.
- Here we assume a9,12,13 are preserved.
- Future Xtensa tools releases might limit the regs that can be affected.
- */
- addi a2, sp, XT_STK_EXTRA /* where to save it */
- # if XCHAL_EXTRA_SA_ALIGN > 16
- movi a3, -XCHAL_EXTRA_SA_ALIGN
- and a2, a2, a3 /* align dynamically >16 bytes */
- # endif
- call0 xthal_save_extra_nw /* destroys a0,2,3,4,5 */
- #endif
-
- #if XCHAL_EXTRA_SA_SIZE > 0 || !defined(__XTENSA_CALL0_ABI__)
- mov a0, a9 /* retrieve ret addr */
- #endif
-
- ret
-
-/*******************************************************************************
-
-_xt_context_restore
-
- !! MUST BE CALLED ONLY BY 'CALL0' INSTRUCTION !!
-
-Restores all Xtensa processor state except PC, PS, A0, A1 (SP) (and in Call0
-ABI, A14, A15 which are preserved by all interrupt handlers) from an interrupt
-stack frame defined in xtensa_rtos.h .
-Its counterpart is _xt_context_save (whose caller saved A12, A13).
-
-Caller is responsible to restore PC, PS, A0, A1 (SP).
-
-Entry Conditions:
- A0 = Return address in caller.
- A1 = Stack pointer of interrupted thread or handler ("interruptee").
-
-Exit conditions:
- A0 = Return address in caller.
- A1 = Stack pointer of interrupted thread or handler ("interruptee").
- Other processor state except PC, PS, A0, A1 (SP), is as at the point
- of interruption.
-
-*******************************************************************************/
-
- .global _xt_context_restore
- .type _xt_context_restore,@function
- .align 4
- .literal_position
- .align 4
-_xt_context_restore:
-
- #if XCHAL_EXTRA_SA_SIZE > 0
- /*
- NOTE: Normally the xthal_restore_extra_nw macro only affects address
- registers a2-a5. It is theoretically possible for Xtensa processor
- designers to write TIE that causes more address registers to be
- affected, but it is generally unlikely. If that ever happens,
- more registers need to be saved/restored around this macro invocation.
- Here we only assume a13 is preserved.
- Future Xtensa tools releases might limit the regs that can be affected.
- */
- mov a13, a0 /* preserve ret addr */
- addi a2, sp, XT_STK_EXTRA /* where to find it */
- # if XCHAL_EXTRA_SA_ALIGN > 16
- movi a3, -XCHAL_EXTRA_SA_ALIGN
- and a2, a2, a3 /* align dynamically >16 bytes */
- # endif
- call0 xthal_restore_extra_nw /* destroys a0,2,3,4,5 */
- mov a0, a13 /* retrieve ret addr */
- #endif
-
- #if XCHAL_HAVE_LOOPS
- l32i a2, sp, XT_STK_LBEG
- l32i a3, sp, XT_STK_LEND
- wsr a2, LBEG
- l32i a2, sp, XT_STK_LCOUNT
- wsr a3, LEND
- wsr a2, LCOUNT
- #endif
-
- #ifdef XT_USE_OVLY
- /*
- If we are using overlays, this is a good spot to check if we need
- to restore an overlay for the incoming task. Here we have a bunch
- of registers to spare. Note that this step is going to use a few
- bytes of storage below SP (SP-20 to SP-32) if an overlay is going
- to be restored.
- */
- l32i a2, sp, XT_STK_PC /* retrieve PC */
- l32i a3, sp, XT_STK_PS /* retrieve PS */
- l32i a4, sp, XT_STK_OVLY /* retrieve overlay state */
- l32i a5, sp, XT_STK_A1 /* retrieve stack ptr */
- _xt_overlay_check_map a2, a3, a4, a5, a6
- s32i a2, sp, XT_STK_PC /* save updated PC */
- s32i a3, sp, XT_STK_PS /* save updated PS */
- #endif
-
- #ifdef XT_USE_SWPRI
- /* Restore virtual interrupt priority and interrupt enable */
- movi a3, _xt_intdata
- l32i a4, a3, 0 /* a4 = _xt_intenable */
- l32i a5, sp, XT_STK_VPRI /* a5 = saved _xt_vpri_mask */
- and a4, a4, a5
- wsr a4, INTENABLE /* update INTENABLE */
- s32i a5, a3, 4 /* restore _xt_vpri_mask */
- #endif
-
- l32i a3, sp, XT_STK_SAR
- l32i a2, sp, XT_STK_A2
- wsr a3, SAR
- l32i a3, sp, XT_STK_A3
- l32i a4, sp, XT_STK_A4
- l32i a5, sp, XT_STK_A5
- l32i a6, sp, XT_STK_A6
- l32i a7, sp, XT_STK_A7
- l32i a8, sp, XT_STK_A8
- l32i a9, sp, XT_STK_A9
- l32i a10, sp, XT_STK_A10
- l32i a11, sp, XT_STK_A11
-
- /*
- Call0 ABI callee-saved regs a12-15 do not need to be restored here.
- However a12-13 were saved for scratch before XT_RTOS_INT_ENTER(),
- so need to be restored anyway, despite being callee-saved in Call0.
- */
- l32i a12, sp, XT_STK_A12
- l32i a13, sp, XT_STK_A13
- #ifndef __XTENSA_CALL0_ABI__
- l32i a14, sp, XT_STK_A14
- l32i a15, sp, XT_STK_A15
- #endif
-
- ret
-
-
-/*******************************************************************************
-
-_xt_coproc_init
-
-Initializes global co-processor management data, setting all co-processors
-to "unowned". Leaves CPENABLE as it found it (does NOT clear it).
-
-Called during initialization of the RTOS, before any threads run.
-
-This may be called from normal Xtensa single-threaded application code which
-might use co-processors. The Xtensa run-time initialization enables all
-co-processors. They must remain enabled here, else a co-processor exception
-might occur outside of a thread, which the exception handler doesn't expect.
-
-Entry Conditions:
- Xtensa single-threaded run-time environment is in effect.
- No thread is yet running.
-
-Exit conditions:
- None.
-
-Obeys ABI conventions per prototype:
- void _xt_coproc_init(void)
-
-*******************************************************************************/
-
-#if XCHAL_CP_NUM > 0
-
- .global _xt_coproc_init
- .type _xt_coproc_init,@function
- .align 4
- .literal_position
- .align 4
-_xt_coproc_init:
- ENTRY0
-
- /* Initialize thread co-processor ownerships to 0 (unowned). */
- movi a2, _xt_coproc_owner_sa /* a2 = base of owner array */
- addi a3, a2, (XCHAL_CP_MAX*portNUM_PROCESSORS) << 2 /* a3 = top+1 of owner array */
- movi a4, 0 /* a4 = 0 (unowned) */
-1: s32i a4, a2, 0
- addi a2, a2, 4
- bltu a2, a3, 1b
-
- RET0
-
-#endif
-
-
-/*******************************************************************************
-
-_xt_coproc_release
-
-Releases any and all co-processors owned by a given thread. The thread is
-identified by it's co-processor state save area defined in xtensa_context.h .
-
-Must be called before a thread's co-proc save area is deleted to avoid
-memory corruption when the exception handler tries to save the state.
-May be called when a thread terminates or completes but does not delete
-the co-proc save area, to avoid the exception handler having to save the
-thread's co-proc state before another thread can use it (optimization).
-
-Needs to be called on the processor the thread was running on. Unpinned threads
-won't have an entry here because they get pinned as soon they use a coprocessor.
-
-Entry Conditions:
- A2 = Pointer to base of co-processor state save area.
-
-Exit conditions:
- None.
-
-Obeys ABI conventions per prototype:
- void _xt_coproc_release(void * coproc_sa_base)
-
-*******************************************************************************/
-
-#if XCHAL_CP_NUM > 0
-
- .global _xt_coproc_release
- .type _xt_coproc_release,@function
- .align 4
- .literal_position
- .align 4
-_xt_coproc_release:
- ENTRY0 /* a2 = base of save area */
-
- getcoreid a5
- movi a3, XCHAL_CP_MAX << 2
- mull a5, a5, a3
- movi a3, _xt_coproc_owner_sa /* a3 = base of owner array */
- add a3, a3, a5
-
- addi a4, a3, XCHAL_CP_MAX << 2 /* a4 = top+1 of owner array */
- movi a5, 0 /* a5 = 0 (unowned) */
-
- rsil a6, XCHAL_EXCM_LEVEL /* lock interrupts */
-
-1: l32i a7, a3, 0 /* a7 = owner at a3 */
- bne a2, a7, 2f /* if (coproc_sa_base == owner) */
- s32i a5, a3, 0 /* owner = unowned */
-2: addi a3, a3, 1<<2 /* a3 = next entry in owner array */
- bltu a3, a4, 1b /* repeat until end of array */
-
-3: wsr a6, PS /* restore interrupts */
-
- RET0
-
-#endif
-
-
-/*******************************************************************************
-_xt_coproc_savecs
-
-If there is a current thread and it has a coprocessor state save area, then
-save all callee-saved state into this area. This function is called from the
-solicited context switch handler. It calls a system-specific function to get
-the coprocessor save area base address.
-
-Entry conditions:
- - The thread being switched out is still the current thread.
- - CPENABLE state reflects which coprocessors are active.
- - Registers have been saved/spilled already.
-
-Exit conditions:
- - All necessary CP callee-saved state has been saved.
- - Registers a2-a7, a13-a15 have been trashed.
-
-Must be called from assembly code only, using CALL0.
-*******************************************************************************/
-#if XCHAL_CP_NUM > 0
-
- .extern _xt_coproc_sa_offset /* external reference */
-
- .global _xt_coproc_savecs
- .type _xt_coproc_savecs,@function
- .align 4
- .literal_position
- .align 4
-_xt_coproc_savecs:
-
- /* At entry, CPENABLE should be showing which CPs are enabled. */
-
- rsr a2, CPENABLE /* a2 = which CPs are enabled */
- beqz a2, .Ldone /* quick exit if none */
- mov a14, a0 /* save return address */
- call0 XT_RTOS_CP_STATE /* get address of CP save area */
- mov a0, a14 /* restore return address */
- beqz a15, .Ldone /* if none then nothing to do */
- s16i a2, a15, XT_CP_CS_ST /* save mask of CPs being stored */
- movi a13, _xt_coproc_sa_offset /* array of CP save offsets */
- l32i a15, a15, XT_CP_ASA /* a15 = base of aligned save area */
-
-#if XCHAL_CP0_SA_SIZE
- bbci.l a2, 0, 2f /* CP 0 not enabled */
- l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[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:
-#endif
-
-#if XCHAL_CP1_SA_SIZE
- bbci.l a2, 1, 2f /* CP 1 not enabled */
- l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[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:
-#endif
-
-#if XCHAL_CP2_SA_SIZE
- bbci.l a2, 2, 2f
- l32i a14, a13, 8
- add a3, a14, a15
- xchal_cp2_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:
-#endif
-
-#if XCHAL_CP3_SA_SIZE
- bbci.l a2, 3, 2f
- l32i a14, a13, 12
- add a3, a14, a15
- xchal_cp3_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:
-#endif
-
-#if XCHAL_CP4_SA_SIZE
- bbci.l a2, 4, 2f
- l32i a14, a13, 16
- add a3, a14, a15
- xchal_cp4_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:
-#endif
-
-#if XCHAL_CP5_SA_SIZE
- bbci.l a2, 5, 2f
- l32i a14, a13, 20
- add a3, a14, a15
- xchal_cp5_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:
-#endif
-
-#if XCHAL_CP6_SA_SIZE
- bbci.l a2, 6, 2f
- l32i a14, a13, 24
- add a3, a14, a15
- xchal_cp6_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:
-#endif
-
-#if XCHAL_CP7_SA_SIZE
- bbci.l a2, 7, 2f
- l32i a14, a13, 28
- add a3, a14, a15
- xchal_cp7_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:
-#endif
-
-.Ldone:
- ret
-#endif
-
-
-/*******************************************************************************
-_xt_coproc_restorecs
-
-Restore any callee-saved coprocessor state for the incoming thread.
-This function is called from coprocessor exception handling, when giving
-ownership to a thread that solicited a context switch earlier. It calls a
-system-specific function to get the coprocessor save area base address.
-
-Entry conditions:
- - The incoming thread is set as the current thread.
- - CPENABLE is set up correctly for all required coprocessors.
- - a2 = mask of coprocessors to be restored.
-
-Exit conditions:
- - All necessary CP callee-saved state has been restored.
- - CPENABLE - unchanged.
- - Registers a2-a7, a13-a15 have been trashed.
-
-Must be called from assembly code only, using CALL0.
-*******************************************************************************/
-#if XCHAL_CP_NUM > 0
-
- .global _xt_coproc_restorecs
- .type _xt_coproc_restorecs,@function
- .align 4
- .literal_position
- .align 4
-_xt_coproc_restorecs:
-
- mov a14, a0 /* save return address */
- call0 XT_RTOS_CP_STATE /* get address of CP save area */
- mov a0, a14 /* restore return address */
- beqz a15, .Ldone2 /* if none then nothing to do */
- l16ui a3, a15, XT_CP_CS_ST /* a3 = which CPs have been saved */
- xor a3, a3, a2 /* clear the ones being restored */
- s32i a3, a15, XT_CP_CS_ST /* update saved CP mask */
- movi a13, _xt_coproc_sa_offset /* array of CP save offsets */
- l32i a15, a15, XT_CP_ASA /* a15 = base of aligned save area */
-
-#if XCHAL_CP0_SA_SIZE
- bbci.l a2, 0, 2f /* CP 0 not enabled */
- l32i a14, a13, 0 /* a14 = _xt_coproc_sa_offset[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:
-#endif
-
-#if XCHAL_CP1_SA_SIZE
- bbci.l a2, 1, 2f /* CP 1 not enabled */
- l32i a14, a13, 4 /* a14 = _xt_coproc_sa_offset[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:
-#endif
-
-#if XCHAL_CP2_SA_SIZE
- bbci.l a2, 2, 2f
- l32i a14, a13, 8
- add a3, a14, a15
- xchal_cp2_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:
-#endif
-
-#if XCHAL_CP3_SA_SIZE
- bbci.l a2, 3, 2f
- l32i a14, a13, 12
- add a3, a14, a15
- xchal_cp3_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:
-#endif
-
-#if XCHAL_CP4_SA_SIZE
- bbci.l a2, 4, 2f
- l32i a14, a13, 16
- add a3, a14, a15
- xchal_cp4_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:
-#endif
-
-#if XCHAL_CP5_SA_SIZE
- bbci.l a2, 5, 2f
- l32i a14, a13, 20
- add a3, a14, a15
- xchal_cp5_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:
-#endif
-
-#if XCHAL_CP6_SA_SIZE
- bbci.l a2, 6, 2f
- l32i a14, a13, 24
- add a3, a14, a15
- xchal_cp6_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:
-#endif
-
-#if XCHAL_CP7_SA_SIZE
- bbci.l a2, 7, 2f
- l32i a14, a13, 28
- add a3, a14, a15
- xchal_cp7_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:
-#endif
-
-.Ldone2:
- ret
-
-#endif
-
-
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_init.c b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_init.c
deleted file mode 100644
index 6aaea0b..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_init.c
+++ /dev/null
@@ -1,54 +0,0 @@
-/*******************************************************************************
-* // Copyright (c) 2003-2015 Cadence Design Systems, Inc.
-* //
-* // Permission is hereby granted, free of charge, to any person obtaining
-* // a copy of this software and associated documentation files (the
-* // "Software"), to deal in the Software without restriction, including
-* // without limitation the rights to use, copy, modify, merge, publish,
-* // distribute, sublicense, and/or sell copies of the Software, and to
-* // permit persons to whom the Software is furnished to do so, subject to
-* // the following conditions:
-* //
-* // The above copyright notice and this permission notice shall be included
-* // in all copies or substantial portions of the Software.
-* //
-* // THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-* // EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-* // MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-* // IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-* // CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-* // TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-* // SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-* --------------------------------------------------------------------------------
-*
-* XTENSA INITIALIZATION ROUTINES CODED IN C
-*
-* This file contains miscellaneous Xtensa RTOS-generic initialization functions
-* that are implemented in C.
-*
-*******************************************************************************/
-
-
-#ifdef XT_BOARD
- #include <xtensa/xtbsp.h>
-#endif
-
-#include "xtensa_rtos.h"
-#include "esp_clk.h"
-
-#ifdef XT_RTOS_TIMER_INT
-
- unsigned _xt_tick_divisor = 0; /* cached number of cycles per tick */
-
- void _xt_tick_divisor_init( void )
- {
- _xt_tick_divisor = esp_clk_cpu_freq() / XT_TICK_PER_SEC;
- }
-
-/* Deprecated, to be removed */
- int xt_clock_freq( void )
- {
- return esp_clk_cpu_freq();
- }
-
-#endif /* XT_RTOS_TIMER_INT */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr.c b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr.c
deleted file mode 100644
index 6d05ae5..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr.c
+++ /dev/null
@@ -1,174 +0,0 @@
-/*******************************************************************************
- * Copyright (c) 2006-2015 Cadence Design Systems Inc.
- *
- * Permission is hereby granted, free of charge, to any person obtaining
- * a copy of this software and associated documentation files (the
- * "Software"), to deal in the Software without restriction, including
- * without limitation the rights to use, copy, modify, merge, publish,
- * distribute, sublicense, and/or sell copies of the Software, and to
- * permit persons to whom the Software is furnished to do so, subject to
- * the following conditions:
- *
- * The above copyright notice and this permission notice shall be included
- * in all copies or substantial portions of the Software.
- *
- * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
- * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
- * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
- * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
- * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
- * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
- * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
- ******************************************************************************/
-
-/******************************************************************************
-* Xtensa-specific interrupt and exception functions for RTOS ports.
-* Also see xtensa_intr_asm.S.
-******************************************************************************/
-
-#include <stdlib.h>
-
-#include <xtensa/config/core.h>
-
-#include "freertos/FreeRTOS.h"
-#include "freertos/xtensa_api.h"
-#include "freertos/portable.h"
-
-#include "rom/ets_sys.h"
-
-#if XCHAL_HAVE_EXCEPTIONS
-
-/* Handler table is in xtensa_intr_asm.S */
-
- extern xt_exc_handler _xt_exception_table[ XCHAL_EXCCAUSE_NUM * portNUM_PROCESSORS ];
-
-
-/*
- * Default handler for unhandled exceptions.
- * CHANGED: We do this in panic.c now
- */
-
-/*void xt_unhandled_exception(XtExcFrame *frame) */
-/*{ */
- /*exit(-1); */
-/*} */
- extern void xt_unhandled_exception( XtExcFrame * frame );
-
-
-/*
- * This function registers a handler for the specified exception.
- * The function returns the address of the previous handler.
- * On error, it returns 0.
- */
- xt_exc_handler xt_set_exception_handler( int n,
- xt_exc_handler f )
- {
- xt_exc_handler old;
-
- if( ( n < 0 ) || ( n >= XCHAL_EXCCAUSE_NUM ) )
- {
- return 0; /* invalid exception number */
- }
-
- /* Convert exception number to _xt_exception_table name */
- n = n * portNUM_PROCESSORS + xPortGetCoreID();
- old = _xt_exception_table[ n ];
-
- if( f )
- {
- _xt_exception_table[ n ] = f;
- }
- else
- {
- _xt_exception_table[ n ] = &xt_unhandled_exception;
- }
-
- return( ( old == &xt_unhandled_exception ) ? 0 : old );
- }
-
-#endif /* if XCHAL_HAVE_EXCEPTIONS */
-
-#if XCHAL_HAVE_INTERRUPTS
-
-/* Handler table is in xtensa_intr_asm.S */
-
- typedef struct xt_handler_table_entry
- {
- void * handler;
- void * arg;
- } xt_handler_table_entry;
-
- extern xt_handler_table_entry _xt_interrupt_table[ XCHAL_NUM_INTERRUPTS * portNUM_PROCESSORS ];
-
-
-/*
- * Default handler for unhandled interrupts.
- */
- void xt_unhandled_interrupt( void * arg )
- {
- ets_printf( "Unhandled interrupt %d on cpu %d!\n", ( int ) arg, xPortGetCoreID() );
- }
-
-
-/*
- * This function registers a handler for the specified interrupt. The "arg"
- * parameter specifies the argument to be passed to the handler when it is
- * invoked. The function returns the address of the previous handler.
- * On error, it returns 0.
- */
- xt_handler xt_set_interrupt_handler( int n,
- xt_handler f,
- void * arg )
- {
- xt_handler_table_entry * entry;
- xt_handler old;
-
- if( ( n < 0 ) || ( n >= XCHAL_NUM_INTERRUPTS ) )
- {
- return 0; /* invalid interrupt number */
- }
-
- if( Xthal_intlevel[ n ] > XCHAL_EXCM_LEVEL )
- {
- return 0; /* priority level too high to safely handle in C */
- }
-
- /* Convert exception number to _xt_exception_table name */
- n = n * portNUM_PROCESSORS + xPortGetCoreID();
-
- entry = _xt_interrupt_table + n;
- old = entry->handler;
-
- if( f )
- {
- entry->handler = f;
- entry->arg = arg;
- }
- else
- {
- entry->handler = &xt_unhandled_interrupt;
- entry->arg = ( void * ) n;
- }
-
- return( ( old == &xt_unhandled_interrupt ) ? 0 : old );
- }
-
- #if CONFIG_SYSVIEW_ENABLE
- void * xt_get_interrupt_handler_arg( int n )
- {
- xt_handler_table_entry * entry;
-
- if( ( n < 0 ) || ( n >= XCHAL_NUM_INTERRUPTS ) )
- {
- return 0; /* invalid interrupt number */
- }
-
- /* Convert exception number to _xt_exception_table name */
- n = n * portNUM_PROCESSORS + xPortGetCoreID();
-
- entry = _xt_interrupt_table + n;
- return entry->arg;
- }
- #endif /* if CONFIG_SYSVIEW_ENABLE */
-
-#endif /* XCHAL_HAVE_INTERRUPTS */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr_asm.S b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr_asm.S
deleted file mode 100644
index ddfe4ba..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_intr_asm.S
+++ /dev/null
@@ -1,225 +0,0 @@
-/*******************************************************************************
-Copyright (c) 2006-2015 Cadence Design Systems Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
-******************************************************************************/
-
-/******************************************************************************
- Xtensa interrupt handling data and assembly routines.
- Also see xtensa_intr.c and xtensa_vectors.S.
-******************************************************************************/
-
-#include <xtensa/hal.h>
-#include <xtensa/config/core.h>
-
-#include "xtensa_context.h"
-#include "FreeRTOSConfig.h"
-
-#if XCHAL_HAVE_INTERRUPTS
-
-/*
--------------------------------------------------------------------------------
- INTENABLE virtualization information.
--------------------------------------------------------------------------------
-*/
-
-
-#if XT_USE_SWPRI
-/* Warning - this is not multicore-compatible. */
- .data
- .global _xt_intdata
- .align 8
-_xt_intdata:
- .global _xt_intenable
- .type _xt_intenable,@object
- .size _xt_intenable,4
- .global _xt_vpri_mask
- .type _xt_vpri_mask,@object
- .size _xt_vpri_mask,4
-
-_xt_intenable: .word 0 /* Virtual INTENABLE */
-_xt_vpri_mask: .word 0xFFFFFFFF /* Virtual priority mask */
-#endif
-
-/*
--------------------------------------------------------------------------------
- Table of C-callable interrupt handlers for each interrupt. Note that not all
- slots can be filled, because interrupts at level > EXCM_LEVEL will not be
- dispatched to a C handler by default.
-
- Stored as:
- int 0 cpu 0
- int 0 cpu 1
- ...
- int 0 cpu n
- int 1 cpu 0
- int 1 cpu 1
- etc
--------------------------------------------------------------------------------
-*/
-
- .data
- .global _xt_interrupt_table
- .align 8
-
-_xt_interrupt_table:
-
- .set i, 0
- .rept XCHAL_NUM_INTERRUPTS*portNUM_PROCESSORS
- .word xt_unhandled_interrupt /* handler address */
- .word i /* handler arg (default: intnum) */
- .set i, i+1
- .endr
-
-#endif /* XCHAL_HAVE_INTERRUPTS */
-
-
-#if XCHAL_HAVE_EXCEPTIONS
-
-/*
--------------------------------------------------------------------------------
- Table of C-callable exception handlers for each exception. Note that not all
- slots will be active, because some exceptions (e.g. coprocessor exceptions)
- are always handled by the OS and cannot be hooked by user handlers.
-
- Stored as:
- exc 0 cpu 0
- exc 0 cpu 1
- ...
- exc 0 cpu n
- exc 1 cpu 0
- exc 1 cpu 1
- etc
--------------------------------------------------------------------------------
-*/
-
- .data
- .global _xt_exception_table
- .align 4
-
-_xt_exception_table:
- .rept XCHAL_EXCCAUSE_NUM * portNUM_PROCESSORS
- .word xt_unhandled_exception /* handler address */
- .endr
-
-#endif
-
-
-/*
--------------------------------------------------------------------------------
- unsigned int xt_ints_on ( unsigned int mask )
-
- Enables a set of interrupts. Does not simply set INTENABLE directly, but
- computes it as a function of the current virtual priority if XT_USE_SWPRI is
- enabled.
- Can be called from interrupt handlers.
--------------------------------------------------------------------------------
-*/
-
- .text
- .align 4
- .global xt_ints_on
- .type xt_ints_on,@function
-
-xt_ints_on:
-
- ENTRY0
-
-#if XCHAL_HAVE_INTERRUPTS
-#if XT_USE_SWPRI
- movi a3, 0
- movi a4, _xt_intdata
- xsr a3, INTENABLE /* Disables all interrupts */
- rsync
- l32i a3, a4, 0 /* a3 = _xt_intenable */
- l32i a6, a4, 4 /* a6 = _xt_vpri_mask */
- or a5, a3, a2 /* a5 = _xt_intenable | mask */
- s32i a5, a4, 0 /* _xt_intenable |= mask */
- and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */
- wsr a5, INTENABLE /* Reenable interrupts */
- mov a2, a3 /* Previous mask */
-#else
- movi a3, 0
- xsr a3, INTENABLE /* Disables all interrupts */
- rsync
- or a2, a3, a2 /* set bits in mask */
- wsr a2, INTENABLE /* Re-enable ints */
- rsync
- mov a2, a3 /* return prev mask */
-#endif
-#else
- movi a2, 0 /* Return zero */
-#endif
- RET0
-
- .size xt_ints_on, . - xt_ints_on
-
-
-/*
--------------------------------------------------------------------------------
- unsigned int xt_ints_off ( unsigned int mask )
-
- Disables a set of interrupts. Does not simply set INTENABLE directly,
- but computes it as a function of the current virtual priority if XT_USE_SWPRI is
- enabled.
- Can be called from interrupt handlers.
--------------------------------------------------------------------------------
-*/
-
- .text
- .align 4
- .global xt_ints_off
- .type xt_ints_off,@function
-
-xt_ints_off:
-
- ENTRY0
-#if XCHAL_HAVE_INTERRUPTS
-#if XT_USE_SWPRI
- movi a3, 0
- movi a4, _xt_intdata
- xsr a3, INTENABLE /* Disables all interrupts */
- rsync
- l32i a3, a4, 0 /* a3 = _xt_intenable */
- l32i a6, a4, 4 /* a6 = _xt_vpri_mask */
- or a5, a3, a2 /* a5 = _xt_intenable | mask */
- xor a5, a5, a2 /* a5 = _xt_intenable & ~mask */
- s32i a5, a4, 0 /* _xt_intenable &= ~mask */
- and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */
- wsr a5, INTENABLE /* Reenable interrupts */
- mov a2, a3 /* Previous mask */
-#else
- movi a4, 0
- xsr a4, INTENABLE /* Disables all interrupts */
- rsync
- or a3, a4, a2 /* set bits in mask */
- xor a3, a3, a2 /* invert bits in mask set in mask, essentially clearing them */
- wsr a3, INTENABLE /* Re-enable ints */
- rsync
- mov a2, a4 /* return prev mask */
-#endif
-#else
- movi a2, 0 /* return zero */
-#endif
- RET0
-
- .size xt_ints_off, . - xt_ints_off
-
-
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_loadstore_handler.S b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_loadstore_handler.S
deleted file mode 100644
index 32d7a8a..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_loadstore_handler.S
+++ /dev/null
@@ -1,559 +0,0 @@
-/*
- Copyright 2019 Espressif Systems (Shanghai) PTE LTD
-
- Licensed 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.
-*/
-
-/*
- * LoadStoreErrorCause: Occurs when trying to access 32 bit addressable memory region as 8 bit or 16 bit
- * LoadStoreAlignmentCause: Occurs when trying to access in an unaligned manner
- *
- * xxxx xxxx = imm8 field
- * yyyy = imm4 field
- * ssss = s field
- * tttt = t field
- *
- * 16 0
- * -------------------
- * L32I.N yyyy ssss tttt 1000
- * S32I.N yyyy ssss tttt 1001
- *
- * 23 0
- * -----------------------------
- * L8UI xxxx xxxx 0000 ssss tttt 0010 <- LoadStoreError
- * L16UI xxxx xxxx 0001 ssss tttt 0010 <- LoadStoreError, LoadStoreAlignment
- * L16SI xxxx xxxx 1001 ssss tttt 0010 <- LoadStoreError, LoadStoreAlignment
- * L32I xxxx xxxx 0010 ssss tttt 0010 <- LoadStoreAlignment
- *
- * S8I xxxx xxxx 0100 ssss tttt 0010 <- LoadStoreError
- * S16I xxxx xxxx 0101 ssss tttt 0010 <- LoadStoreError, LoadStoreAlignment
- * S32I xxxx xxxx 0110 ssss tttt 0010 <- LoadStoreAlignment
- *
- * ******* UNSUPPORTED *******
- *
- * L32E 0000 1001 rrrr ssss tttt 0000
- * S32E 0100 1001 rrrr ssss tttt 0000
- * -----------------------------
- */
-
-#include "xtensa_rtos.h"
-#include "sdkconfig.h"
-#include "soc/soc.h"
-
-#define LOADSTORE_HANDLER_STACK_SZ 8
- .section .bss, "aw"
- .balign 16
-LoadStoreHandlerStack:
- .rept LOADSTORE_HANDLER_STACK_SZ
- .word 0
- .endr
-
-
-/* LoadStoreErrorCause handler:
- *
- * Completes 8-bit or 16-bit load/store instructions from 32-bit aligned memory region
- * Called from UserExceptionVector if EXCCAUSE is LoadStoreErrorCause
- */
-
- .global LoadStoreErrorHandler
- .section .iram1, "ax"
-
- .literal_position
-
- .balign 4
-LoadStoreErrorHandler:
- .type LoadStoreErrorHandler, @function
-
- wsr a0, depc // Save return address in depc
- mov a0, sp
- movi sp, LoadStoreHandlerStack
- s32i a0, sp, 0x04 // Since a0 contains value of a1
- s32i a2, sp, 0x08
- s32i a3, sp, 0x0c
- s32i a4, sp, 0x10
-
- rsr a0, sar // Save SAR in a0 to restore later
-
- /* Check whether the address lies in the valid range */
- rsr a3, excvaddr
- movi a4, _iram_text_end // End of code section of IRAM
- bge a3, a4, 1f
- movi a4, SOC_CACHE_APP_LOW // Check if in APP cache region
- blt a3, a4, .LS_wrong_opcode
- movi a4, SOC_CACHE_APP_HIGH
- bge a3, a4, .LS_wrong_opcode
- j 2f
-
-1:
- movi a4, SOC_IRAM_HIGH // End of IRAM address range
- bge a3, a4, .LS_wrong_opcode
-
-2:
- /* Examine the opcode which generated the exception */
- /* Note: Instructions are in this order to avoid pipeline stalls. */
- rsr a2, epc1
- movi a4, ~3
- ssa8l a2 // sar is now correct shift for aligned read
- and a2, a2, a4 // a2 now 4-byte aligned address of instruction
- l32i a4, a2, 0
- l32i a2, a2, 4
-
- src a2, a2, a4 // a2 now instruction that failed
- bbci a2, 1, .LS_wrong_opcode
- bbsi a2, 14, .LSE_store_op // Store instruction
-
- /* l8/l16ui/l16si */
- movi a4, ~3
- and a4, a3, a4 // a4 now word aligned read address
-
- ssa8l a3 // sar is now shift to extract a3's byte
- l32i a4, a4, 0 // perform the actual read
- srl a4, a4 // shift right correct distance
- extui a3, a2, 12, 4
- bnez a3, 1f // l16ui/l16si
- extui a4, a4, 0, 8 // mask off bits needed for an l8
- j 2f
-
-1:
- extui a4, a4, 0, 16
- bbci a2, 15, 2f // l16ui
-
- /* Sign adjustment */
- slli a4, a4, 16
- srai a4, a4, 16 // a4 contains the value
-
-2:
- /* a4 contains the value */
- rsr a3, epc1
- addi a3, a3, 3
- wsr a3, epc1
- wsr a0, sar
- rsr a0, excsave1
-
- extui a2, a2, 3, 5
- blti a2, 10, .LSE_stack_reg
-
- movi a3, .LS_jumptable_base
- addx8 a2, a2, a3 // a2 is now the address to jump to
- l32i a3, sp, 0x0c
- jx a2
-
-.LSE_stack_reg:
- addx2 a2, a2, sp
- s32i a4, a2, 0
-
- /* Restore all values */
- l32i a4, sp, 0x10
- l32i a3, sp, 0x0c
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
-.LSE_store_op:
- s32i a5, a1, 0x14
- s32i a6, a1, 0x18
-
- /* a2 -> instruction that caused the error */
- /* a3 -> unaligned address */
- extui a4, a2, 4, 4
- blti a4, 7, 1f
- movi a5, .LSE_store_reg
- addx8 a5, a4, a5
- jx a5
-
-1:
- addx4 a4, a4, sp
- l32i a4, a4, 0
-
-.LSE_store_data:
- /* a4 contains the value */
- rsr a6, epc1
- addi a6, a6, 3
- wsr a6, epc1
-
- ssa8b a3
- movi a5, -1
- bbsi a2, 12, 1f // s16
- extui a4, a4, 0, 8
- movi a6, 0xff
- j 2f
-1:
- extui a4, a4, 0, 16
- movi a6, 0xffff
-2:
- sll a4, a4 // shift the value to proper offset
- sll a6, a6
- xor a5, a5, a6 // a5 contains the mask
-
- movi a6, ~3
- and a3, a3, a6 // a3 has the aligned address
- l32i a6, a3, 0 // a6 contains the data at the aligned address
- and a6, a6, a5
- or a4, a6, a4
- s32i a4, a3, 0
-
- /* Restore registers */
- wsr a0, sar
-
- l32i a6, sp, 0x18
- l32i a5, sp, 0x14
- l32i a4, sp, 0x10
- l32i a3, sp, 0x0c
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rsr a0, excsave1
-
- rfe
-
-.LSE_store_reg:
- .org .LSE_store_reg + (7 * 8)
- mov a4, a7
- j .LSE_store_data
-
- .org .LSE_store_reg + (8 * 8)
- mov a4, a8
- j .LSE_store_data
-
- .org .LSE_store_reg + (9 * 8)
- mov a4, a9
- j .LSE_store_data
-
- .org .LSE_store_reg + (10 * 8)
- mov a4, a10
- j .LSE_store_data
-
- .org .LSE_store_reg + (11 * 8)
- mov a4, a11
- j .LSE_store_data
-
- .org .LSE_store_reg + (12 * 8)
- mov a4, a12
- j .LSE_store_data
-
- .org .LSE_store_reg + (13 * 8)
- mov a4, a13
- j .LSE_store_data
-
- .org .LSE_store_reg + (14 * 8)
- mov a4, a14
- j .LSE_store_data
-
- .org .LSE_store_reg + (15 * 8)
- mov a4, a15
- j .LSE_store_data
-
-
-/* LoadStoreAlignmentCause handler:
- *
- * Completes unaligned 16-bit and 32-bit load/store instructions from 32-bit aligned memory region
- * Called from UserExceptionVector if EXCCAUSE is LoadStoreAlignmentCause
- */
-
- .global AlignmentErrorHandler
- .section .iram1, "ax"
-
- .literal_position
-
- .balign 4
-AlignmentErrorHandler:
- .type AlignmentErrorHandler, @function
-
- wsr a0, depc // Save return address in depc
- mov a0, sp
- movi sp, LoadStoreHandlerStack
- s32i a0, sp, 0x04 // Since a0 contains value of a1
- s32i a2, sp, 0x08
- s32i a3, sp, 0x0c
- s32i a4, sp, 0x10
-
- rsr a0, sar // Save SAR in a0 to restore later
-
- /* Check whether the address lies in the valid range */
- rsr a3, excvaddr
- movi a4, _iram_text_end // End of code section of IRAM
- bge a3, a4, 1f
- movi a4, SOC_CACHE_APP_LOW // Check if in APP cache region
- blt a3, a4, .LS_wrong_opcode
- movi a4, SOC_CACHE_APP_HIGH
- bge a3, a4, .LS_wrong_opcode
- j 2f
-
-1:
- movi a4, SOC_IRAM_HIGH // End of IRAM address range
- bge a3, a4, .LS_wrong_opcode
-
-2:
- /* Examine the opcode which generated the exception */
- /* Note: Instructions are in this order to avoid pipeline stalls. */
- rsr a2, epc1
- movi a4, ~3
- ssa8l a2 // sar is now correct shift for aligned read
- and a2, a2, a4 // a2 now 4-byte aligned address of instruction
- l32i a4, a2, 0
- l32i a2, a2, 4
-
- /* a2 has the instruction that caused the error */
- src a2, a2, a4
- extui a4, a2, 0, 4
- addi a4, a4, -9
- beqz a4, .LSA_store_op
- bbsi a2, 14, .LSA_store_op
-
- ssa8l a3 // a3 contains the unaligned address
- movi a4, ~3
- and a4, a3, a4 // a4 has the aligned address
- l32i a3, a4, 0
- l32i a4, a4, 4
- src a4, a4, a3
-
- rsr a3, epc1
- addi a3, a3, 2
- bbsi a2, 3, 1f // l32i.n
- bbci a2, 1, .LS_wrong_opcode
- addi a3, a3, 1
-
- bbsi a2, 13, 1f // l32
- extui a4, a4, 0, 16
- bbci a2, 15, 1f // l16ui
-
- /* Sign adjustment */
- slli a4, a4, 16
- srai a4, a4, 16 // a4 contains the value
-
-1:
- wsr a3, epc1
- wsr a0, sar
- rsr a0, excsave1
-
- extui a2, a2, 4, 4
- blti a2, 5, .LSA_stack_reg // a3 contains the target register
-
- movi a3, .LS_jumptable_base
- slli a2, a2, 4
- add a2, a2, a3 // a2 is now the address to jump to
- l32i a3, sp, 0x0c
- jx a2
-
-.LSA_stack_reg:
- addx4 a2, a2, sp
- s32i a4, a2, 0
-
- /* Restore all values */
- l32i a4, sp, 0x10
- l32i a3, sp, 0x0c
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
-/* Store instruction */
-.LSA_store_op:
- s32i a5, sp, 0x14
- s32i a6, sp, 0x18
- s32i a7, sp, 0x1c
-
- /* a2 -> instruction that caused the error */
- /* a3 -> unaligned address */
- extui a4, a2, 4, 4
- blti a4, 8, 1f
- movi a5, .LSA_store_reg
- addx8 a5, a4, a5
- jx a5
-
-1:
- addx4 a4, a4, sp
- l32i a4, a4, 0 // a4 contains the value
-
-.LSA_store_data:
- movi a6, 0
-
- rsr a7, epc1
- addi a7, a7 ,2
- bbsi a2, 3, 1f // s32i.n
- bbci a2, 1, .LS_wrong_opcode
-
- addi a7, a7, 1
- bbsi a2, 13, 1f // s32i
-
- movi a5, -1
- extui a4, a4, 0, 16
- slli a6, a5, 16 // 0xffff0000
-
-1:
- wsr a7, epc1
- movi a5, ~3
- and a5, a3, a5 // a5 has the aligned address
-
- ssa8b a3
- movi a3, -1
- src a7, a6, a3
- src a3, a3, a6
-
- /* Store data on lower address */
- l32i a6, a5, 0
- and a6, a6, a7
- sll a7, a4
- or a6, a6, a7
- s32i a6, a5, 0
-
- /* Store data on higher address */
- l32i a7, a5, 4
- srl a6, a4
- and a3, a7, a3
- or a3, a3, a6
- s32i a3, a5, 4
-
- /* Restore registers */
- wsr a0, sar
- rsr a0, excsave1
-
- l32i a7, sp, 0x1c
- l32i a6, sp, 0x18
- l32i a5, sp, 0x14
- l32i a4, sp, 0x10
- l32i a3, sp, 0x0c
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
-.LSA_store_reg:
- .org .LSA_store_reg + (8 * 8)
- mov a4, a8
- j .LSA_store_data
-
- .org .LSA_store_reg + (9 * 8)
- mov a4, a9
- j .LSA_store_data
-
- .org .LSA_store_reg + (10 * 8)
- mov a4, a10
- j .LSA_store_data
-
- .org .LSA_store_reg + (11 * 8)
- mov a4, a11
- j .LSA_store_data
-
- .org .LSA_store_reg + (12 * 8)
- mov a4, a12
- j .LSA_store_data
-
- .org .LSA_store_reg + (13 * 8)
- mov a4, a13
- j .LSA_store_data
-
- .org .LSA_store_reg + (14 * 8)
- mov a4, a14
- j .LSA_store_data
-
- .org .LSA_store_reg + (15 * 8)
- mov a4, a15
- j .LSA_store_data
-
-/*
- * Common routines for both the exception handlers
- */
- .balign 4
-.LS_jumptable:
- /* The first 5 entries (80 bytes) of this table are unused (registers
- a0..a4 are handled separately above). Rather than have a whole bunch
- of wasted space, just pretend that the table starts 80 bytes
- earlier in memory. */
- .set .LS_jumptable_base, .LS_jumptable - (16 * 5)
-
- .org .LS_jumptable_base + (16 * 5)
- mov a5, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 6)
- mov a6, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 7)
- mov a7, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 8)
- mov a8, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 9)
- mov a9, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 10)
- mov a10, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 11)
- mov a11, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 12)
- mov a12, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 13)
- mov a13, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 14)
- mov a14, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
- .org .LS_jumptable_base + (16 * 15)
- mov a15, a4
- l32i a4, sp, 0x10
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rfe
-
-.LS_wrong_opcode:
- /* Reaches here if the address is in invalid range or the opcode isn't supported.
- * Restore registers and jump back to _xt_user_exc
- */
- wsr a0, sar
- l32i a4, sp, 0x10
- l32i a3, sp, 0x0c
- l32i a2, sp, 0x08
- l32i a1, sp, 0x04
- rsr a0, depc
- ret // Equivalent to jx a0
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_overlay_os_hook.c b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_overlay_os_hook.c
deleted file mode 100644
index ef893a7..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_overlay_os_hook.c
+++ /dev/null
@@ -1,67 +0,0 @@
-/* xtensa_overlay_os_hook.c -- Overlay manager OS hooks for FreeRTOS. */
-
-/* Copyright (c) 2015-2015 Cadence Design Systems Inc. */
-/* */
-/* Permission is hereby granted, free of charge, to any person obtaining */
-/* a copy of this software and associated documentation files (the */
-/* "Software"), to deal in the Software without restriction, including */
-/* without limitation the rights to use, copy, modify, merge, publish, */
-/* distribute, sublicense, and/or sell copies of the Software, and to */
-/* permit persons to whom the Software is furnished to do so, subject to */
-/* the following conditions: */
-/* */
-/* The above copyright notice and this permission notice shall be included */
-/* in all copies or substantial portions of the Software. */
-/* */
-/* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, */
-/* EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF */
-/* MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. */
-/* IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY */
-/* CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, */
-/* TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE */
-/* SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. */
-
-
-#include "FreeRTOS.h"
-#include "semphr.h"
-
-#if configUSE_MUTEX
-
-/* Mutex object that controls access to the overlay. Currently only one
- * overlay region is supported so one mutex suffices.
- */
- static SemaphoreHandle_t xt_overlay_mutex;
-
-
-/* This function should be overridden to provide OS specific init such
- * as the creation of a mutex lock that can be used for overlay locking.
- * Typically this mutex would be set up with priority inheritance. See
- * overlay manager documentation for more details.
- */
- void xt_overlay_init_os( void )
- {
- /* Create the mutex for overlay access. Priority inheritance is
- * required.
- */
- xt_overlay_mutex = xSemaphoreCreateMutex();
- }
-
-
-/* This function locks access to shared overlay resources, typically
- * by acquiring a mutex.
- */
- void xt_overlay_lock( void )
- {
- xSemaphoreTake( xt_overlay_mutex, 0 );
- }
-
-
-/* This function releases access to shared overlay resources, typically
- * by unlocking a mutex.
- */
- void xt_overlay_unlock( void )
- {
- xSemaphoreGive( xt_overlay_mutex );
- }
-
-#endif /* if configUSE_MUTEX */
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vector_defaults.S b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vector_defaults.S
deleted file mode 100644
index f6c34a3..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vector_defaults.S
+++ /dev/null
@@ -1,164 +0,0 @@
-// Copyright 2015-2017 Espressif Systems (Shanghai) PTE LTD
-//
-// Licensed 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.
-
-#include "xtensa_rtos.h"
-#include "esp_panic.h"
-#include "sdkconfig.h"
-#include "soc/soc.h"
-
-/*
-This file contains the default handlers for the high interrupt levels as well as some specialized exceptions.
-The default behaviour is to just exit the interrupt or call the panic handler on the exceptions
-*/
-
-
-#if XCHAL_HAVE_DEBUG
- .global xt_debugexception
- .weak xt_debugexception
- .set xt_debugexception, _xt_debugexception
- .section .iram1,"ax"
- .type _xt_debugexception,@function
- .align 4
-
-_xt_debugexception:
- movi a0,PANIC_RSN_DEBUGEXCEPTION
- wsr a0,EXCCAUSE
- /* _xt_panic assumes a level 1 exception. As we're
- crashing anyhow, copy EPC & EXCSAVE from DEBUGLEVEL
- to level 1. */
- rsr a0,(EPC + XCHAL_DEBUGLEVEL)
- wsr a0,EPC_1
- rsr a0,(EXCSAVE + XCHAL_DEBUGLEVEL)
- wsr a0,EXCSAVE_1
- call0 _xt_panic /* does not return */
- rfi XCHAL_DEBUGLEVEL
-
-#endif /* Debug exception */
-
-
-#if XCHAL_NUM_INTLEVELS >=2 && XCHAL_EXCM_LEVEL <2 && XCHAL_DEBUGLEVEL !=2
- .global xt_highint2
- .weak xt_highint2
- .set xt_highint2, _xt_highint2
- .section .iram1,"ax"
- .type _xt_highint2,@function
- .align 4
-_xt_highint2:
-
- /* Default handler does nothing; just returns */
- .align 4
-.L_xt_highint2_exit:
- rsr a0, EXCSAVE_2 /* restore a0 */
- rfi 2
-
-#endif /* Level 2 */
-
-#if XCHAL_NUM_INTLEVELS >=3 && XCHAL_EXCM_LEVEL <3 && XCHAL_DEBUGLEVEL !=3
-
- .global xt_highint3
- .weak xt_highint3
- .set xt_highint3, _xt_highint3
- .section .iram1,"ax"
- .type _xt_highint3,@function
- .align 4
-_xt_highint3:
-
- /* Default handler does nothing; just returns */
-
- .align 4
-.L_xt_highint3_exit:
- rsr a0, EXCSAVE_3 /* restore a0 */
- rfi 3
-
-#endif /* Level 3 */
-
-#if XCHAL_NUM_INTLEVELS >=4 && XCHAL_EXCM_LEVEL <4 && XCHAL_DEBUGLEVEL !=4
-
- .global xt_highint4
- .weak xt_highint4
- .set xt_highint4, _xt_highint4
- .section .iram1,"ax"
- .type _xt_highint4,@function
- .align 4
-_xt_highint4:
-
- /* Default handler does nothing; just returns */
-
- .align 4
-.L_xt_highint4_exit:
- rsr a0, EXCSAVE_4 /* restore a0 */
- rfi 4
-
-#endif /* Level 4 */
-
-#if XCHAL_NUM_INTLEVELS >=5 && XCHAL_EXCM_LEVEL <5 && XCHAL_DEBUGLEVEL !=5
-
- .global xt_highint5
- .weak xt_highint5
- .set xt_highint5, _xt_highint5
- .section .iram1,"ax"
- .type _xt_highint5,@function
- .align 4
-_xt_highint5:
-
- /* Default handler does nothing; just returns */
-
- .align 4
-.L_xt_highint5_exit:
- rsr a0, EXCSAVE_5 /* restore a0 */
- rfi 5
-
-
-#endif /* Level 5 */
-
-#if XCHAL_NUM_INTLEVELS >=6 && XCHAL_EXCM_LEVEL <6 && XCHAL_DEBUGLEVEL !=6
-
- .global _xt_highint6
- .global xt_highint6
- .weak xt_highint6
- .set xt_highint6, _xt_highint6
- .section .iram1,"ax"
- .type _xt_highint6,@function
- .align 4
-_xt_highint6:
-
- /* Default handler does nothing; just returns */
-
- .align 4
-.L_xt_highint6_exit:
- rsr a0, EXCSAVE_6 /* restore a0 */
- rfi 6
-
-#endif /* Level 6 */
-
-#if XCHAL_HAVE_NMI
-
- .global _xt_nmi
- .global xt_nmi
- .weak xt_nmi
- .set xt_nmi, _xt_nmi
- .section .iram1,"ax"
- .type _xt_nmi,@function
- .align 4
-_xt_nmi:
-
- /* Default handler does nothing; just returns */
-
- .align 4
-.L_xt_nmi_exit:
- rsr a0, EXCSAVE + XCHAL_NMILEVEL /* restore a0 */
- rfi XCHAL_NMILEVEL
-
-#endif /* NMI */
-
diff --git a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vectors.S b/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vectors.S
deleted file mode 100644
index 5c8601d..0000000
--- a/portable/ThirdParty/GCC/Xtensa_ESP32_IDF3/xtensa_vectors.S
+++ /dev/null
@@ -1,1919 +0,0 @@
-/*******************************************************************************
-Copyright (c) 2006-2015 Cadence Design Systems Inc.
-
-Permission is hereby granted, free of charge, to any person obtaining
-a copy of this software and associated documentation files (the
-"Software"), to deal in the Software without restriction, including
-without limitation the rights to use, copy, modify, merge, publish,
-distribute, sublicense, and/or sell copies of the Software, and to
-permit persons to whom the Software is furnished to do so, subject to
-the following conditions:
-
-The above copyright notice and this permission notice shall be included
-in all copies or substantial portions of the Software.
-
-THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
-EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
-MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
-IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
-CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
-TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
-SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
---------------------------------------------------------------------------------
-
- XTENSA VECTORS AND LOW LEVEL HANDLERS FOR AN RTOS
-
- Xtensa low level exception and interrupt vectors and handlers for an RTOS.
-
- Interrupt handlers and user exception handlers support interaction with
- the RTOS by calling XT_RTOS_INT_ENTER and XT_RTOS_INT_EXIT before and
- after user's specific interrupt handlers. These macros are defined in
- xtensa_<rtos>.h to call suitable functions in a specific RTOS.
-
- Users can install application-specific interrupt handlers for low and
- medium level interrupts, by calling xt_set_interrupt_handler(). These
- handlers can be written in C, and must obey C calling convention. The
- handler table is indexed by the interrupt number. Each handler may be
- provided with an argument.
-
- Note that the system timer interrupt is handled specially, and is
- dispatched to the RTOS-specific handler. This timer cannot be hooked
- by application code.
-
- Optional hooks are also provided to install a handler per level at
- run-time, made available by compiling this source file with
- '-DXT_INTEXC_HOOKS' (useful for automated testing).
-
-!! This file is a template that usually needs to be modified to handle !!
-!! application specific interrupts. Search USER_EDIT for helpful comments !!
-!! on where to insert handlers and how to write them. !!
-
- Users can also install application-specific exception handlers in the
- same way, by calling xt_set_exception_handler(). One handler slot is
- provided for each exception type. Note that some exceptions are handled
- by the porting layer itself, and cannot be taken over by application
- code in this manner. These are the alloca, syscall, and coprocessor
- exceptions.
-
- The exception handlers can be written in C, and must follow C calling
- convention. Each handler is passed a pointer to an exception frame as
- its single argument. The exception frame is created on the stack, and
- holds the saved context of the thread that took the exception. If the
- handler returns, the context will be restored and the instruction that
- caused the exception will be retried. If the handler makes any changes
- to the saved state in the exception frame, the changes will be applied
- when restoring the context.
-
- Because Xtensa is a configurable architecture, this port supports all user
- generated configurations (except restrictions stated in the release notes).
- This is accomplished by conditional compilation using macros and functions
- defined in the Xtensa HAL (hardware adaptation layer) for your configuration.
- Only the relevant parts of this file will be included in your RTOS build.
- For example, this file provides interrupt vector templates for all types and
- all priority levels, but only the ones in your configuration are built.
-
- NOTES on the use of 'call0' for long jumps instead of 'j':
- 1. This file should be assembled with the -mlongcalls option to xt-xcc.
- 2. The -mlongcalls compiler option causes 'call0 dest' to be expanded to
- a sequence 'l32r a0, dest' 'callx0 a0' which works regardless of the
- distance from the call to the destination. The linker then relaxes
- it back to 'call0 dest' if it determines that dest is within range.
- This allows more flexibility in locating code without the performance
- overhead of the 'l32r' literal data load in cases where the destination
- is in range of 'call0'. There is an additional benefit in that 'call0'
- has a longer range than 'j' due to the target being word-aligned, so
- the 'l32r' sequence is less likely needed.
- 3. The use of 'call0' with -mlongcalls requires that register a0 not be
- live at the time of the call, which is always the case for a function
- call but needs to be ensured if 'call0' is used as a jump in lieu of 'j'.
- 4. This use of 'call0' is independent of the C function call ABI.
-
-*******************************************************************************/
-
-#include "xtensa_rtos.h"
-#include "esp_panic.h"
-#include "sdkconfig.h"
-#include "soc/soc.h"
-#include "soc/dport_reg.h"
-
-/*
- Define for workaround: pin no-cpu-affinity tasks to a cpu when fpu is used.
- Please change this when the tcb structure is changed
-*/
-#define TASKTCB_XCOREID_OFFSET (0x38+configMAX_TASK_NAME_LEN+3)&~3
-.extern pxCurrentTCB
-
-/* Enable stack backtrace across exception/interrupt - see below */
-#ifdef CONFIG_FREERTOS_INTERRUPT_BACKTRACE
-#define XT_DEBUG_BACKTRACE 1
-#endif
-
-
-/*
---------------------------------------------------------------------------------
- Defines used to access _xtos_interrupt_table.
---------------------------------------------------------------------------------
-*/
-#define XIE_HANDLER 0
-#define XIE_ARG 4
-#define XIE_SIZE 8
-
-
-/*
- Macro get_percpu_entry_for - convert a per-core ID into a multicore entry.
- Basically does reg=reg*portNUM_PROCESSORS+current_core_id
- Multiple versions here to optimize for specific portNUM_PROCESSORS values.
-*/
- .macro get_percpu_entry_for reg scratch
-#if (portNUM_PROCESSORS == 1)
- /* No need to do anything */
-#elif (portNUM_PROCESSORS == 2)
- /* Optimized 2-core code. */
- getcoreid \scratch
- addx2 \reg,\reg,\scratch
-#else
- /* Generalized n-core code. Untested! */
- movi \scratch,portNUM_PROCESSORS
- mull \scratch,\reg,\scratch
- getcoreid \reg
- add \reg,\scratch,\reg
-#endif
- .endm
-/*
---------------------------------------------------------------------------------
- Macro extract_msb - return the input with only the highest bit set.
-
- Input : "ain" - Input value, clobbered.
- Output : "aout" - Output value, has only one bit set, MSB of "ain".
- The two arguments must be different AR registers.
---------------------------------------------------------------------------------
-*/
-
- .macro extract_msb aout ain
-1:
- addi \aout, \ain, -1 /* aout = ain - 1 */
- and \ain, \ain, \aout /* ain = ain & aout */
- bnez \ain, 1b /* repeat until ain == 0 */
- addi \aout, \aout, 1 /* return aout + 1 */
- .endm
-
-/*
---------------------------------------------------------------------------------
- Macro dispatch_c_isr - dispatch interrupts to user ISRs.
- This will dispatch to user handlers (if any) that are registered in the
- XTOS dispatch table (_xtos_interrupt_table). These handlers would have
- been registered by calling _xtos_set_interrupt_handler(). There is one
- exception - the timer interrupt used by the OS will not be dispatched
- to a user handler - this must be handled by the caller of this macro.
-
- Level triggered and software interrupts are automatically deasserted by
- this code.
-
- ASSUMPTIONS:
- -- PS.INTLEVEL is set to "level" at entry
- -- PS.EXCM = 0, C calling enabled
-
- NOTE: For CALL0 ABI, a12-a15 have not yet been saved.
-
- NOTE: This macro will use registers a0 and a2-a7. The arguments are:
- level -- interrupt level
- mask -- interrupt bitmask for this level
---------------------------------------------------------------------------------
-*/
-
- .macro dispatch_c_isr level mask
-
- #ifdef CONFIG_PM_TRACE
- movi a6, 0 /* = ESP_PM_TRACE_IDLE */
- getcoreid a7
- call4 esp_pm_trace_exit
- #endif // CONFIG_PM_TRACE
-
- /* Get mask of pending, enabled interrupts at this level into a2. */
-
-.L_xt_user_int_&level&:
- rsr a2, INTENABLE
- rsr a3, INTERRUPT
- movi a4, \mask
- and a2, a2, a3
- and a2, a2, a4
- beqz a2, 9f /* nothing to do */
-
- /* This bit of code provides a nice debug backtrace in the debugger.
- It does take a few more instructions, so undef XT_DEBUG_BACKTRACE
- if you want to save the cycles.
- */
- #ifdef XT_DEBUG_BACKTRACE
- #ifndef __XTENSA_CALL0_ABI__
- rsr a0, EPC_1 + \level - 1 /* return address */
- movi a4, 0xC0000000 /* constant with top 2 bits set (call size) */
- or a0, a0, a4 /* set top 2 bits */
- addx2 a0, a4, a0 /* clear top bit -- simulating call4 size */
- #endif
- #endif
-
- #ifdef CONFIG_PM_ENABLE
- call4 esp_pm_impl_isr_hook
- #endif
-
- #ifdef XT_INTEXC_HOOKS
- /* Call interrupt hook if present to (pre)handle interrupts. */
- movi a4, _xt_intexc_hooks
- l32i a4, a4, \level << 2
- beqz a4, 2f
- #ifdef __XTENSA_CALL0_ABI__
- callx0 a4
- beqz a2, 9f
- #else
- mov a6, a2
- callx4 a4
- beqz a6, 9f
- mov a2, a6
- #endif
-2:
- #endif
-
- /* Now look up in the dispatch table and call user ISR if any. */
- /* If multiple bits are set then MSB has highest priority. */
-
- extract_msb a4, a2 /* a4 = MSB of a2, a2 trashed */
-
- #ifdef XT_USE_SWPRI
- /* Enable all interrupts at this level that are numerically higher
- than the one we just selected, since they are treated as higher
- priority.
- */
- movi a3, \mask /* a3 = all interrupts at this level */
- add a2, a4, a4 /* a2 = a4 << 1 */
- addi a2, a2, -1 /* a2 = mask of 1's <= a4 bit */
- and a2, a2, a3 /* a2 = mask of all bits <= a4 at this level */
- movi a3, _xt_intdata
- l32i a6, a3, 4 /* a6 = _xt_vpri_mask */
- neg a2, a2
- addi a2, a2, -1 /* a2 = mask to apply */
- and a5, a6, a2 /* mask off all bits <= a4 bit */
- s32i a5, a3, 4 /* update _xt_vpri_mask */
- rsr a3, INTENABLE
- and a3, a3, a2 /* mask off all bits <= a4 bit */
- wsr a3, INTENABLE
- rsil a3, \level - 1 /* lower interrupt level by 1 */
- #endif
-
- movi a3, XT_TIMER_INTEN /* a3 = timer interrupt bit */
- wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */
- beq a3, a4, 7f /* if timer interrupt then skip table */
-
- find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */
-
- get_percpu_entry_for a3, a12
- movi a4, _xt_interrupt_table
- addx8 a3, a3, a4 /* a3 = address of interrupt table entry */
- l32i a4, a3, XIE_HANDLER /* a4 = handler address */
- #ifdef __XTENSA_CALL0_ABI__
- mov a12, a6 /* save in callee-saved reg */
- l32i a2, a3, XIE_ARG /* a2 = handler arg */
- callx0 a4 /* call handler */
- mov a2, a12
- #else
- mov a2, a6 /* save in windowed reg */
- l32i a6, a3, XIE_ARG /* a6 = handler arg */
- callx4 a4 /* call handler */
- #endif
-
- #ifdef XT_USE_SWPRI
- j 8f
- #else
- j .L_xt_user_int_&level& /* check for more interrupts */
- #endif
-
-7:
-
- .ifeq XT_TIMER_INTPRI - \level
-.L_xt_user_int_timer_&level&:
- /*
- Interrupt handler for the RTOS tick timer if at this level.
- We'll be reading the interrupt state again after this call
- so no need to preserve any registers except a6 (vpri_mask).
- */
-
- #ifdef __XTENSA_CALL0_ABI__
- mov a12, a6
- call0 XT_RTOS_TIMER_INT
- mov a2, a12
- #else
- mov a2, a6
- call4 XT_RTOS_TIMER_INT
- #endif
- .endif
-
- #ifdef XT_USE_SWPRI
- j 8f
- #else
- j .L_xt_user_int_&level& /* check for more interrupts */
- #endif
-
- #ifdef XT_USE_SWPRI
-8:
- /* Restore old value of _xt_vpri_mask from a2. Also update INTENABLE from
- virtual _xt_intenable which _could_ have changed during interrupt
- processing. */
-
- movi a3, _xt_intdata
- l32i a4, a3, 0 /* a4 = _xt_intenable */
- s32i a2, a3, 4 /* update _xt_vpri_mask */
- and a4, a4, a2 /* a4 = masked intenable */
- wsr a4, INTENABLE /* update INTENABLE */
- #endif
-
-9:
- /* done */
-
- .endm
-
-
-/*
---------------------------------------------------------------------------------
- Panic handler.
- Should be reached by call0 (preferable) or jump only. If call0, a0 says where
- from. If on simulator, display panic message and abort, else loop indefinitely.
---------------------------------------------------------------------------------
-*/
-
- .section .iram1,"ax"
- .global panicHandler
-
- .global _xt_panic
- .type _xt_panic,@function
- .align 4
- .literal_position
- .align 4
-
-_xt_panic:
- /* Allocate exception frame and save minimal context. */
- mov a0, sp
- addi sp, sp, -XT_STK_FRMSZ
- s32i a0, sp, XT_STK_A1
- #if XCHAL_HAVE_WINDOWED
- s32e a0, sp, -12 /* for debug backtrace */
- #endif
- rsr a0, PS /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_1 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- #if XCHAL_HAVE_WINDOWED
- s32e a0, sp, -16 /* for debug backtrace */
- #endif
- s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */
- s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
- call0 _xt_context_save
-
- /* Save exc cause and vaddr into exception frame */
- rsr a0, EXCCAUSE
- s32i a0, sp, XT_STK_EXCCAUSE
- rsr a0, EXCVADDR
- s32i a0, sp, XT_STK_EXCVADDR
-
- /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */
- rsr a0, EXCSAVE_1 /* save interruptee's a0 */
-
- s32i a0, sp, XT_STK_A0
-
- /* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
- movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
- wsr a0, PS
-
- //Call panic handler
- mov a6,sp
- call4 panicHandler
-
-
- .align 4
-//Call using call0. Prints the hex char in a2. Kills a3, a4, a5
-panic_print_hex:
- movi a3,0x60000000
- movi a4,8
-panic_print_hex_loop:
- l32i a5, a3, 0x1c
- extui a5, a5, 16, 8
- bgei a5,64,panic_print_hex_loop
-
- srli a5,a2,28
- bgei a5,10,panic_print_hex_a
- addi a5,a5,'0'
- j panic_print_hex_ok
-panic_print_hex_a:
- addi a5,a5,'A'-10
-panic_print_hex_ok:
- s32i a5,a3,0
- slli a2,a2,4
-
- addi a4,a4,-1
- bnei a4,0,panic_print_hex_loop
- movi a5,' '
- s32i a5,a3,0
-
- ret
-
-
-
- .section .rodata, "a"
- .align 4
-
-
-
-/*
---------------------------------------------------------------------------------
- Hooks to dynamically install handlers for exceptions and interrupts.
- Allows automated regression frameworks to install handlers per test.
- Consists of an array of function pointers indexed by interrupt level,
- with index 0 containing the entry for user exceptions.
- Initialized with all 0s, meaning no handler is installed at each level.
- See comment in xtensa_rtos.h for more details.
-
- *WARNING* This array is for all CPUs, that is, installing a hook for
- one CPU will install it for all others as well!
---------------------------------------------------------------------------------
-*/
-
- #ifdef XT_INTEXC_HOOKS
- .data
- .global _xt_intexc_hooks
- .type _xt_intexc_hooks,@object
- .align 4
-
-_xt_intexc_hooks:
- .fill XT_INTEXC_HOOK_NUM, 4, 0
- #endif
-
-
-/*
---------------------------------------------------------------------------------
- EXCEPTION AND LEVEL 1 INTERRUPT VECTORS AND LOW LEVEL HANDLERS
- (except window exception vectors).
-
- Each vector goes at a predetermined location according to the Xtensa
- hardware configuration, which is ensured by its placement in a special
- section known to the Xtensa linker support package (LSP). It performs
- the minimum necessary before jumping to the handler in the .text section.
-
- The corresponding handler goes in the normal .text section. It sets up
- the appropriate stack frame, saves a few vector-specific registers and
- calls XT_RTOS_INT_ENTER to save the rest of the interrupted context
- and enter the RTOS, then sets up a C environment. It then calls the
- user's interrupt handler code (which may be coded in C) and finally
- calls XT_RTOS_INT_EXIT to transfer control to the RTOS for scheduling.
-
- While XT_RTOS_INT_EXIT does not return directly to the interruptee,
- eventually the RTOS scheduler will want to dispatch the interrupted
- task or handler. The scheduler will return to the exit point that was
- saved in the interrupt stack frame at XT_STK_EXIT.
---------------------------------------------------------------------------------
-*/
-
-
-/*
---------------------------------------------------------------------------------
-Debug Exception.
---------------------------------------------------------------------------------
-*/
-
-#if XCHAL_HAVE_DEBUG
-
- .begin literal_prefix .DebugExceptionVector
- .section .DebugExceptionVector.text, "ax"
- .global _DebugExceptionVector
- .align 4
- .global xt_debugexception
-_DebugExceptionVector:
- wsr a0, EXCSAVE+XCHAL_DEBUGLEVEL /* preserve a0 */
- call0 xt_debugexception /* load exception handler */
-
- .end literal_prefix
-
-#endif
-
-/*
---------------------------------------------------------------------------------
-Double Exception.
-Double exceptions are not a normal occurrence. They indicate a bug of some kind.
---------------------------------------------------------------------------------
-*/
-
-#ifdef XCHAL_DOUBLEEXC_VECTOR_VADDR
-
- .begin literal_prefix .DoubleExceptionVector
- .section .DoubleExceptionVector.text, "ax"
- .global _DoubleExceptionVector
- .align 4
-
-_DoubleExceptionVector:
-
- #if XCHAL_HAVE_DEBUG
- break 1, 4 /* unhandled double exception */
- #endif
- movi a0,PANIC_RSN_DOUBLEEXCEPTION
- wsr a0,EXCCAUSE
- call0 _xt_panic /* does not return */
- rfde /* make a0 point here not later */
-
- .end literal_prefix
-
-#endif /* XCHAL_DOUBLEEXC_VECTOR_VADDR */
-
-/*
---------------------------------------------------------------------------------
-Kernel Exception (including Level 1 Interrupt from kernel mode).
---------------------------------------------------------------------------------
-*/
-
- .begin literal_prefix .KernelExceptionVector
- .section .KernelExceptionVector.text, "ax"
- .global _KernelExceptionVector
- .align 4
-
-_KernelExceptionVector:
-
- wsr a0, EXCSAVE_1 /* preserve a0 */
- call0 _xt_kernel_exc /* kernel exception handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
- .section .iram1,"ax"
- .align 4
-
-_xt_kernel_exc:
- #if XCHAL_HAVE_DEBUG
- break 1, 0 /* unhandled kernel exception */
- #endif
- movi a0,PANIC_RSN_KERNELEXCEPTION
- wsr a0,EXCCAUSE
- call0 _xt_panic /* does not return */
- rfe /* make a0 point here not there */
-
-
-/*
---------------------------------------------------------------------------------
-User Exception (including Level 1 Interrupt from user mode).
---------------------------------------------------------------------------------
-*/
-
- .begin literal_prefix .UserExceptionVector
- .section .UserExceptionVector.text, "ax"
- .global _UserExceptionVector
- .type _UserExceptionVector,@function
- .align 4
-
-_UserExceptionVector:
-
- wsr a0, EXCSAVE_1 /* preserve a0 */
- call0 _xt_user_exc /* user exception handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
-/*
---------------------------------------------------------------------------------
- Insert some waypoints for jumping beyond the signed 8-bit range of
- conditional branch instructions, so the conditional branchces to specific
- exception handlers are not taken in the mainline. Saves some cycles in the
- mainline.
---------------------------------------------------------------------------------
-*/
-
-#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY
- .global LoadStoreErrorHandler
- .global AlignmentErrorHandler
-#endif
-
- .section .iram1,"ax"
-
- #if XCHAL_HAVE_WINDOWED
- .align 4
-_xt_to_alloca_exc:
- call0 _xt_alloca_exc /* in window vectors section */
- /* never returns here - call0 is used as a jump (see note at top) */
- #endif
-
- .align 4
-_xt_to_syscall_exc:
- call0 _xt_syscall_exc
- /* never returns here - call0 is used as a jump (see note at top) */
-
- #if XCHAL_CP_NUM > 0
- .align 4
-_xt_to_coproc_exc:
- call0 _xt_coproc_exc
- /* never returns here - call0 is used as a jump (see note at top) */
- #endif
-
-#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY
- .align 4
-_call_loadstore_handler:
- call0 LoadStoreErrorHandler
- /* This will return only if wrong opcode or address out of range*/
- j .LS_exit
-
- .align 4
-_call_alignment_handler:
- call0 AlignmentErrorHandler
- /* This will return only if wrong opcode or address out of range*/
- addi a0, a0, 1
- j .LS_exit
-#endif
-
-/*
---------------------------------------------------------------------------------
- User exception handler.
---------------------------------------------------------------------------------
-*/
-
- .type _xt_user_exc,@function
- .align 4
-
-_xt_user_exc:
-
- /* If level 1 interrupt then jump to the dispatcher */
- rsr a0, EXCCAUSE
- beqi a0, EXCCAUSE_LEVEL1INTERRUPT, _xt_lowint1
-
- /* Handle any coprocessor exceptions. Rely on the fact that exception
- numbers above EXCCAUSE_CP0_DISABLED all relate to the coprocessors.
- */
- #if XCHAL_CP_NUM > 0
- bgeui a0, EXCCAUSE_CP0_DISABLED, _xt_to_coproc_exc
- #endif
-
- /* Handle alloca and syscall exceptions */
- #if XCHAL_HAVE_WINDOWED
- beqi a0, EXCCAUSE_ALLOCA, _xt_to_alloca_exc
- #endif
- beqi a0, EXCCAUSE_SYSCALL, _xt_to_syscall_exc
-
-#ifdef CONFIG_ESP32_IRAM_AS_8BIT_ACCESSIBLE_MEMORY
- beqi a0, EXCCAUSE_LOAD_STORE_ERROR, _call_loadstore_handler
-
- addi a0, a0, -1
- beqi a0, 8, _call_alignment_handler
- addi a0, a0, 1
-.LS_exit:
-#endif
-
- /* Handle all other exceptions. All can have user-defined handlers. */
- /* NOTE: we'll stay on the user stack for exception handling. */
-
- /* Allocate exception frame and save minimal context. */
- mov a0, sp
- addi sp, sp, -XT_STK_FRMSZ
- s32i a0, sp, XT_STK_A1
- #if XCHAL_HAVE_WINDOWED
- s32e a0, sp, -12 /* for debug backtrace */
- #endif
- rsr a0, PS /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_1 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- #if XCHAL_HAVE_WINDOWED
- s32e a0, sp, -16 /* for debug backtrace */
- #endif
- s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */
- s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
- call0 _xt_context_save
-
- /* Save exc cause and vaddr into exception frame */
- rsr a0, EXCCAUSE
- s32i a0, sp, XT_STK_EXCCAUSE
- rsr a0, EXCVADDR
- s32i a0, sp, XT_STK_EXCVADDR
-
- /* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */
- rsr a0, EXCSAVE_1 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
-
- /* Set up PS for C, reenable hi-pri interrupts, and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(XCHAL_EXCM_LEVEL) | PS_UM
- #else
- movi a0, PS_INTLEVEL(XCHAL_EXCM_LEVEL) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
-
- #ifdef XT_DEBUG_BACKTRACE
- #ifndef __XTENSA_CALL0_ABI__
- rsr a0, EPC_1 /* return address for debug backtrace */
- movi a5, 0xC0000000 /* constant with top 2 bits set (call size) */
- rsync /* wait for WSR.PS to complete */
- or a0, a0, a5 /* set top 2 bits */
- addx2 a0, a5, a0 /* clear top bit -- thus simulating call4 size */
- #else
- rsync /* wait for WSR.PS to complete */
- #endif
- #endif
-
- rsr a2, EXCCAUSE /* recover exc cause */
-
- #ifdef XT_INTEXC_HOOKS
- /*
- Call exception hook to pre-handle exceptions (if installed).
- Pass EXCCAUSE in a2, and check result in a2 (if -1, skip default handling).
- */
- movi a4, _xt_intexc_hooks
- l32i a4, a4, 0 /* user exception hook index 0 */
- beqz a4, 1f
-.Ln_xt_user_exc_call_hook:
- #ifdef __XTENSA_CALL0_ABI__
- callx0 a4
- beqi a2, -1, .L_xt_user_done
- #else
- mov a6, a2
- callx4 a4
- beqi a6, -1, .L_xt_user_done
- mov a2, a6
- #endif
-1:
- #endif
-
- rsr a2, EXCCAUSE /* recover exc cause */
- movi a3, _xt_exception_table
- get_percpu_entry_for a2, a4
- addx4 a4, a2, a3 /* a4 = address of exception table entry */
- l32i a4, a4, 0 /* a4 = handler address */
- #ifdef __XTENSA_CALL0_ABI__
- mov a2, sp /* a2 = pointer to exc frame */
- callx0 a4 /* call handler */
- #else
- mov a6, sp /* a6 = pointer to exc frame */
- callx4 a4 /* call handler */
- #endif
-
-.L_xt_user_done:
-
- /* Restore context and return */
- call0 _xt_context_restore
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, PS
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_1
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove exception frame */
- rsync /* ensure PS and EPC written */
- rfe /* PS.EXCM is cleared */
-
-
-/*
---------------------------------------------------------------------------------
- Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT
- on entry and used to return to a thread or interrupted interrupt handler.
---------------------------------------------------------------------------------
-*/
-
- .global _xt_user_exit
- .type _xt_user_exit,@function
- .align 4
-_xt_user_exit:
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, PS
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_1
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
- rsync /* ensure PS and EPC written */
- rfe /* PS.EXCM is cleared */
-
-
-/*
-
---------------------------------------------------------------------------------
-Syscall Exception Handler (jumped to from User Exception Handler).
-Syscall 0 is required to spill the register windows (no-op in Call 0 ABI).
-Only syscall 0 is handled here. Other syscalls return -1 to caller in a2.
---------------------------------------------------------------------------------
-*/
-
- .section .iram1,"ax"
- .type _xt_syscall_exc,@function
- .align 4
-_xt_syscall_exc:
-
- #ifdef __XTENSA_CALL0_ABI__
- /*
- Save minimal regs for scratch. Syscall 0 does nothing in Call0 ABI.
- Use a minimal stack frame (16B) to save A2 & A3 for scratch.
- PS.EXCM could be cleared here, but unlikely to improve worst-case latency.
- rsr a0, PS
- addi a0, a0, -PS_EXCM_MASK
- wsr a0, PS
- */
- addi sp, sp, -16
- s32i a2, sp, 8
- s32i a3, sp, 12
- #else /* Windowed ABI */
- /*
- Save necessary context and spill the register windows.
- PS.EXCM is still set and must remain set until after the spill.
- Reuse context save function though it saves more than necessary.
- For this reason, a full interrupt stack frame is allocated.
- */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a12, sp, XT_STK_A12 /* _xt_context_save requires A12- */
- s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
- call0 _xt_context_save
- #endif
-
- /*
- Grab the interruptee's PC and skip over the 'syscall' instruction.
- If it's at the end of a zero-overhead loop and it's not on the last
- iteration, decrement loop counter and skip to beginning of loop.
- */
- rsr a2, EPC_1 /* a2 = PC of 'syscall' */
- addi a3, a2, 3 /* ++PC */
- #if XCHAL_HAVE_LOOPS
- rsr a0, LEND /* if (PC == LEND */
- bne a3, a0, 1f
- rsr a0, LCOUNT /* && LCOUNT != 0) */
- beqz a0, 1f /* { */
- addi a0, a0, -1 /* --LCOUNT */
- rsr a3, LBEG /* PC = LBEG */
- wsr a0, LCOUNT /* } */
- #endif
-1: wsr a3, EPC_1 /* update PC */
-
- /* Restore interruptee's context and return from exception. */
- #ifdef __XTENSA_CALL0_ABI__
- l32i a2, sp, 8
- l32i a3, sp, 12
- addi sp, sp, 16
- #else
- call0 _xt_context_restore
- addi sp, sp, XT_STK_FRMSZ
- #endif
- movi a0, -1
- movnez a2, a0, a2 /* return -1 if not syscall 0 */
- rsr a0, EXCSAVE_1
- rfe
-
-/*
---------------------------------------------------------------------------------
-Co-Processor Exception Handler (jumped to from User Exception Handler).
-These exceptions are generated by co-processor instructions, which are only
-allowed in thread code (not in interrupts or kernel code). This restriction is
-deliberately imposed to reduce the burden of state-save/restore in interrupts.
---------------------------------------------------------------------------------
-*/
-#if XCHAL_CP_NUM > 0
-
- .section .rodata, "a"
-
-/* Offset to CP n save area in thread's CP save area. */
- .global _xt_coproc_sa_offset
- .type _xt_coproc_sa_offset,@object
- .align 16 /* minimize crossing cache boundaries */
-_xt_coproc_sa_offset:
- .word XT_CP0_SA, XT_CP1_SA, XT_CP2_SA, XT_CP3_SA
- .word XT_CP4_SA, XT_CP5_SA, XT_CP6_SA, XT_CP7_SA
-
-/* Bitmask for CP n's CPENABLE bit. */
- .type _xt_coproc_mask,@object
- .align 16,,8 /* try to keep it all in one cache line */
- .set i, 0
-_xt_coproc_mask:
- .rept XCHAL_CP_MAX
- .long (i<<16) | (1<<i) // upper 16-bits = i, lower = bitmask
- .set i, i+1
- .endr
-
- .data
-
-/* Owner thread of CP n, identified by thread's CP save area (0 = unowned). */
- .global _xt_coproc_owner_sa
- .type _xt_coproc_owner_sa,@object
- .align 16,,XCHAL_CP_MAX<<2 /* minimize crossing cache boundaries */
-_xt_coproc_owner_sa:
- .space (XCHAL_CP_MAX * portNUM_PROCESSORS) << 2
-
- .section .iram1,"ax"
-
-
- .align 4
-.L_goto_invalid:
- j .L_xt_coproc_invalid /* not in a thread (invalid) */
- .align 4
-.L_goto_done:
- j .L_xt_coproc_done
-
-
-/*
---------------------------------------------------------------------------------
- Coprocessor exception handler.
- At entry, only a0 has been saved (in EXCSAVE_1).
---------------------------------------------------------------------------------
-*/
-
- .type _xt_coproc_exc,@function
- .align 4
-
-_xt_coproc_exc:
-
- /* Allocate interrupt stack frame and save minimal context. */
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- #if XCHAL_HAVE_WINDOWED
- s32e a0, sp, -12 /* for debug backtrace */
- #endif
- rsr a0, PS /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_1 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_1 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- #if XCHAL_HAVE_WINDOWED
- s32e a0, sp, -16 /* for debug backtrace */
- #endif
- movi a0, _xt_user_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- rsr a0, EXCCAUSE
- s32i a5, sp, XT_STK_A5 /* save a5 */
- addi a5, a0, -EXCCAUSE_CP0_DISABLED /* a5 = CP index */
-
- /* Save a few more of interruptee's registers (a5 was already saved). */
- s32i a2, sp, XT_STK_A2
- s32i a3, sp, XT_STK_A3
- s32i a4, sp, XT_STK_A4
- s32i a15, sp, XT_STK_A15
-
- /* Get co-processor state save area of new owner thread. */
- call0 XT_RTOS_CP_STATE /* a15 = new owner's save area */
- beqz a15, .L_goto_invalid /* not in a thread (invalid) */
-
- /* Enable the co-processor's bit in CPENABLE. */
- movi a0, _xt_coproc_mask
- rsr a4, CPENABLE /* a4 = CPENABLE */
- addx4 a0, a5, a0 /* a0 = &_xt_coproc_mask[n] */
- l32i a0, a0, 0 /* a0 = (n << 16) | (1 << n) */
-
- /* FPU operations are incompatible with non-pinned tasks. If we have a FPU operation
- here, to keep the entire thing from crashing, it's better to pin the task to whatever
- core we're running on now. */
- movi a2, pxCurrentTCB
- getcoreid a3
- addx4 a2, a3, a2
- l32i a2, a2, 0 /* a2 = start of pxCurrentTCB[cpuid] */
- addi a2, a2, TASKTCB_XCOREID_OFFSET /* offset to xCoreID in tcb struct */
- s32i a3, a2, 0 /* store current cpuid */
-
- /* Grab correct xt_coproc_owner_sa for this core */
- movi a2, XCHAL_CP_MAX << 2
- mull a2, a2, a3 /* multiply by current processor id */
- movi a3, _xt_coproc_owner_sa /* a3 = base of owner array */
- add a3, a3, a2 /* a3 = owner area needed for this processor */
-
- extui a2, a0, 0, 16 /* coprocessor bitmask portion */
- or a4, a4, a2 /* a4 = CPENABLE | (1 << n) */
- wsr a4, CPENABLE
-
-/*
-Keep loading _xt_coproc_owner_sa[n] atomic (=load once, then use that value
-everywhere): _xt_coproc_release assumes it works like this in order not to need
-locking.
-*/
-
-
- /* Get old coprocessor owner thread (save area ptr) and assign new one. */
- addx4 a3, a5, a3 /* a3 = &_xt_coproc_owner_sa[n] */
- l32i a2, a3, 0 /* a2 = old owner's save area */
- s32i a15, a3, 0 /* _xt_coproc_owner_sa[n] = new */
- rsync /* ensure wsr.CPENABLE is complete */
-
- /* Only need to context switch if new owner != old owner. */
- beq a15, a2, .L_goto_done /* new owner == old, we're done */
-
- /* If no old owner then nothing to save. */
- beqz a2, .L_check_new
-
- /* If old owner not actively using CP then nothing to save. */
- l16ui a4, a2, XT_CPENABLE /* a4 = old owner's CPENABLE */
- bnone a4, a0, .L_check_new /* old owner not using CP */
-
-.L_save_old:
- /* Save old owner's coprocessor state. */
-
- movi a5, _xt_coproc_sa_offset
-
- /* Mark old owner state as no longer active (CPENABLE bit n clear). */
- xor a4, a4, a0 /* clear CP bit in CPENABLE */
- s16i a4, a2, XT_CPENABLE /* update old owner's CPENABLE */
-
- extui a4, a0, 16, 5 /* a4 = CP index = n */
- addx4 a5, a4, a5 /* a5 = &_xt_coproc_sa_offset[n] */
-
- /* Mark old owner state as saved (CPSTORED bit n set). */
- l16ui a4, a2, XT_CPSTORED /* a4 = old owner's CPSTORED */
- l32i a5, a5, 0 /* a5 = XT_CP[n]_SA offset */
- or a4, a4, a0 /* set CP in old owner's CPSTORED */
- s16i a4, a2, XT_CPSTORED /* update old owner's CPSTORED */
- l32i a2, a2, XT_CP_ASA /* ptr to actual (aligned) save area */
- extui a3, a0, 16, 5 /* a3 = CP index = n */
- add a2, a2, a5 /* a2 = old owner's area for CP n */
-
- /*
- The config-specific HAL macro invoked below destroys a2-5, preserves a0-1.
- It is theoretically possible for Xtensa processor designers to write TIE
- that causes more address registers to be affected, but it is generally
- unlikely. If that ever happens, more registers needs to be saved/restored
- around this macro invocation, and the value in a15 needs to be recomputed.
- */
- xchal_cpi_store_funcbody
-
-.L_check_new:
- /* Check if any state has to be restored for new owner. */
- /* NOTE: a15 = new owner's save area, cannot be zero when we get here. */
-
- l16ui a3, a15, XT_CPSTORED /* a3 = new owner's CPSTORED */
- movi a4, _xt_coproc_sa_offset
- bnone a3, a0, .L_check_cs /* full CP not saved, check callee-saved */
- xor a3, a3, a0 /* CPSTORED bit is set, clear it */
- s16i a3, a15, XT_CPSTORED /* update new owner's CPSTORED */
-
- /* Adjust new owner's save area pointers to area for CP n. */
- extui a3, a0, 16, 5 /* a3 = CP index = n */
- addx4 a4, a3, a4 /* a4 = &_xt_coproc_sa_offset[n] */
- l32i a4, a4, 0 /* a4 = XT_CP[n]_SA */
- l32i a5, a15, XT_CP_ASA /* ptr to actual (aligned) save area */
- add a2, a4, a5 /* a2 = new owner's area for CP */
-
- /*
- The config-specific HAL macro invoked below destroys a2-5, preserves a0-1.
- It is theoretically possible for Xtensa processor designers to write TIE
- that causes more address registers to be affected, but it is generally
- unlikely. If that ever happens, more registers needs to be saved/restored
- around this macro invocation.
- */
- xchal_cpi_load_funcbody
-
- /* Restore interruptee's saved registers. */
- /* Can omit rsync for wsr.CPENABLE here because _xt_user_exit does it. */
-.L_xt_coproc_done:
- l32i a15, sp, XT_STK_A15
- l32i a5, sp, XT_STK_A5
- l32i a4, sp, XT_STK_A4
- l32i a3, sp, XT_STK_A3
- l32i a2, sp, XT_STK_A2
- call0 _xt_user_exit /* return via exit dispatcher */
- /* Never returns here - call0 is used as a jump (see note at top) */
-
-.L_check_cs:
- /* a0 = CP mask in low bits, a15 = new owner's save area */
- l16ui a2, a15, XT_CP_CS_ST /* a2 = mask of CPs saved */
- bnone a2, a0, .L_xt_coproc_done /* if no match then done */
- and a2, a2, a0 /* a2 = which CPs to restore */
- extui a2, a2, 0, 8 /* extract low 8 bits */
- s32i a6, sp, XT_STK_A6 /* save extra needed regs */
- s32i a7, sp, XT_STK_A7
- s32i a13, sp, XT_STK_A13
- s32i a14, sp, XT_STK_A14
- call0 _xt_coproc_restorecs /* restore CP registers */
- l32i a6, sp, XT_STK_A6 /* restore saved registers */
- l32i a7, sp, XT_STK_A7
- l32i a13, sp, XT_STK_A13
- l32i a14, sp, XT_STK_A14
- j .L_xt_coproc_done
-
- /* Co-processor exception occurred outside a thread (not supported). */
-.L_xt_coproc_invalid:
- movi a0,PANIC_RSN_COPROCEXCEPTION
- wsr a0,EXCCAUSE
- call0 _xt_panic /* not in a thread (invalid) */
- /* never returns */
-
-
-#endif /* XCHAL_CP_NUM */
-
-
-/*
--------------------------------------------------------------------------------
- Level 1 interrupt dispatch. Assumes stack frame has not been allocated yet.
--------------------------------------------------------------------------------
-*/
-
- .section .iram1,"ax"
- .type _xt_lowint1,@function
- .align 4
-
-_xt_lowint1:
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- rsr a0, PS /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_1 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_1 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- movi a0, _xt_user_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- /* Save rest of interrupt context and enter RTOS. */
- call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
-
- /* !! We are now on the RTOS system stack !! */
-
- /* Set up PS for C, enable interrupts above this level and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(1) | PS_UM
- #else
- movi a0, PS_INTLEVEL(1) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
- rsync
-
- /* OK to call C code at this point, dispatch user ISRs */
-
- dispatch_c_isr 1 XCHAL_INTLEVEL1_MASK
-
- /* Done handling interrupts, transfer control to OS */
- call0 XT_RTOS_INT_EXIT /* does not return directly here */
-
-
-/*
--------------------------------------------------------------------------------
- MEDIUM PRIORITY (LEVEL 2+) INTERRUPT VECTORS AND LOW LEVEL HANDLERS.
-
- Medium priority interrupts are by definition those with priority greater
- than 1 and not greater than XCHAL_EXCM_LEVEL. These are disabled by
- setting PS.EXCM and therefore can easily support a C environment for
- handlers in C, and interact safely with an RTOS.
-
- Each vector goes at a predetermined location according to the Xtensa
- hardware configuration, which is ensured by its placement in a special
- section known to the Xtensa linker support package (LSP). It performs
- the minimum necessary before jumping to the handler in the .text section.
-
- The corresponding handler goes in the normal .text section. It sets up
- the appropriate stack frame, saves a few vector-specific registers and
- calls XT_RTOS_INT_ENTER to save the rest of the interrupted context
- and enter the RTOS, then sets up a C environment. It then calls the
- user's interrupt handler code (which may be coded in C) and finally
- calls XT_RTOS_INT_EXIT to transfer control to the RTOS for scheduling.
-
- While XT_RTOS_INT_EXIT does not return directly to the interruptee,
- eventually the RTOS scheduler will want to dispatch the interrupted
- task or handler. The scheduler will return to the exit point that was
- saved in the interrupt stack frame at XT_STK_EXIT.
--------------------------------------------------------------------------------
-*/
-
-#if XCHAL_EXCM_LEVEL >= 2
-
- .begin literal_prefix .Level2InterruptVector
- .section .Level2InterruptVector.text, "ax"
- .global _Level2Vector
- .type _Level2Vector,@function
- .align 4
-_Level2Vector:
- wsr a0, EXCSAVE_2 /* preserve a0 */
- call0 _xt_medint2 /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
- .section .iram1,"ax"
- .type _xt_medint2,@function
- .align 4
-_xt_medint2:
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- rsr a0, EPS_2 /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_2 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_2 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- movi a0, _xt_medint2_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- /* Save rest of interrupt context and enter RTOS. */
- call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
-
- /* !! We are now on the RTOS system stack !! */
-
- /* Set up PS for C, enable interrupts above this level and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(2) | PS_UM
- #else
- movi a0, PS_INTLEVEL(2) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
- rsync
-
- /* OK to call C code at this point, dispatch user ISRs */
-
- dispatch_c_isr 2 XCHAL_INTLEVEL2_MASK
-
- /* Done handling interrupts, transfer control to OS */
- call0 XT_RTOS_INT_EXIT /* does not return directly here */
-
- /*
- Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT
- on entry and used to return to a thread or interrupted interrupt handler.
- */
- .global _xt_medint2_exit
- .type _xt_medint2_exit,@function
- .align 4
-_xt_medint2_exit:
- /* Restore only level-specific regs (the rest were already restored) */
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, EPS_2
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_2
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
- rsync /* ensure EPS and EPC written */
- rfi 2
-
-#endif /* Level 2 */
-
-#if XCHAL_EXCM_LEVEL >= 3
-
- .begin literal_prefix .Level3InterruptVector
- .section .Level3InterruptVector.text, "ax"
- .global _Level3Vector
- .type _Level3Vector,@function
- .align 4
-_Level3Vector:
- wsr a0, EXCSAVE_3 /* preserve a0 */
- call0 _xt_medint3 /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
- .section .iram1,"ax"
- .type _xt_medint3,@function
- .align 4
-_xt_medint3:
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- rsr a0, EPS_3 /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_3 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_3 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- movi a0, _xt_medint3_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- /* Save rest of interrupt context and enter RTOS. */
- call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
-
- /* !! We are now on the RTOS system stack !! */
-
- /* Set up PS for C, enable interrupts above this level and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(3) | PS_UM
- #else
- movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
- rsync
-
- /* OK to call C code at this point, dispatch user ISRs */
-
- dispatch_c_isr 3 XCHAL_INTLEVEL3_MASK
-
- /* Done handling interrupts, transfer control to OS */
- call0 XT_RTOS_INT_EXIT /* does not return directly here */
-
- /*
- Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT
- on entry and used to return to a thread or interrupted interrupt handler.
- */
- .global _xt_medint3_exit
- .type _xt_medint3_exit,@function
- .align 4
-_xt_medint3_exit:
- /* Restore only level-specific regs (the rest were already restored) */
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, EPS_3
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_3
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
- rsync /* ensure EPS and EPC written */
- rfi 3
-
-#endif /* Level 3 */
-
-#if XCHAL_EXCM_LEVEL >= 4
-
- .begin literal_prefix .Level4InterruptVector
- .section .Level4InterruptVector.text, "ax"
- .global _Level4Vector
- .type _Level4Vector,@function
- .align 4
-_Level4Vector:
- wsr a0, EXCSAVE_4 /* preserve a0 */
- call0 _xt_medint4 /* load interrupt handler */
-
- .end literal_prefix
-
- .section .iram1,"ax"
- .type _xt_medint4,@function
- .align 4
-_xt_medint4:
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- rsr a0, EPS_4 /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_4 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_4 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- movi a0, _xt_medint4_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- /* Save rest of interrupt context and enter RTOS. */
- call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
-
- /* !! We are now on the RTOS system stack !! */
-
- /* Set up PS for C, enable interrupts above this level and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(4) | PS_UM
- #else
- movi a0, PS_INTLEVEL(4) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
- rsync
-
- /* OK to call C code at this point, dispatch user ISRs */
-
- dispatch_c_isr 4 XCHAL_INTLEVEL4_MASK
-
- /* Done handling interrupts, transfer control to OS */
- call0 XT_RTOS_INT_EXIT /* does not return directly here */
-
- /*
- Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT
- on entry and used to return to a thread or interrupted interrupt handler.
- */
- .global _xt_medint4_exit
- .type _xt_medint4_exit,@function
- .align 4
-_xt_medint4_exit:
- /* Restore only level-specific regs (the rest were already restored) */
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, EPS_4
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_4
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
- rsync /* ensure EPS and EPC written */
- rfi 4
-
-#endif /* Level 4 */
-
-#if XCHAL_EXCM_LEVEL >= 5
-
- .begin literal_prefix .Level5InterruptVector
- .section .Level5InterruptVector.text, "ax"
- .global _Level5Vector
- .type _Level5Vector,@function
- .align 4
-_Level5Vector:
- wsr a0, EXCSAVE_5 /* preserve a0 */
- call0 _xt_medint5 /* load interrupt handler */
-
- .end literal_prefix
-
- .section .iram1,"ax"
- .type _xt_medint5,@function
- .align 4
-_xt_medint5:
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- rsr a0, EPS_5 /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_5 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_5 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- movi a0, _xt_medint5_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- /* Save rest of interrupt context and enter RTOS. */
- call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
-
- /* !! We are now on the RTOS system stack !! */
-
- /* Set up PS for C, enable interrupts above this level and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(5) | PS_UM
- #else
- movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
- rsync
-
- /* OK to call C code at this point, dispatch user ISRs */
-
- dispatch_c_isr 5 XCHAL_INTLEVEL5_MASK
-
- /* Done handling interrupts, transfer control to OS */
- call0 XT_RTOS_INT_EXIT /* does not return directly here */
-
- /*
- Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT
- on entry and used to return to a thread or interrupted interrupt handler.
- */
- .global _xt_medint5_exit
- .type _xt_medint5_exit,@function
- .align 4
-_xt_medint5_exit:
- /* Restore only level-specific regs (the rest were already restored) */
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, EPS_5
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_5
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
- rsync /* ensure EPS and EPC written */
- rfi 5
-
-#endif /* Level 5 */
-
-#if XCHAL_EXCM_LEVEL >= 6
-
- .begin literal_prefix .Level6InterruptVector
- .section .Level6InterruptVector.text, "ax"
- .global _Level6Vector
- .type _Level6Vector,@function
- .align 4
-_Level6Vector:
- wsr a0, EXCSAVE_6 /* preserve a0 */
- call0 _xt_medint6 /* load interrupt handler */
-
- .end literal_prefix
-
- .section .iram1,"ax"
- .type _xt_medint6,@function
- .align 4
-_xt_medint6:
- mov a0, sp /* sp == a1 */
- addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
- s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
- rsr a0, EPS_6 /* save interruptee's PS */
- s32i a0, sp, XT_STK_PS
- rsr a0, EPC_6 /* save interruptee's PC */
- s32i a0, sp, XT_STK_PC
- rsr a0, EXCSAVE_6 /* save interruptee's a0 */
- s32i a0, sp, XT_STK_A0
- movi a0, _xt_medint6_exit /* save exit point for dispatch */
- s32i a0, sp, XT_STK_EXIT
-
- /* Save rest of interrupt context and enter RTOS. */
- call0 XT_RTOS_INT_ENTER /* common RTOS interrupt entry */
-
- /* !! We are now on the RTOS system stack !! */
-
- /* Set up PS for C, enable interrupts above this level and clear EXCM. */
- #ifdef __XTENSA_CALL0_ABI__
- movi a0, PS_INTLEVEL(6) | PS_UM
- #else
- movi a0, PS_INTLEVEL(6) | PS_UM | PS_WOE
- #endif
- wsr a0, PS
- rsync
-
- /* OK to call C code at this point, dispatch user ISRs */
-
- dispatch_c_isr 6 XCHAL_INTLEVEL6_MASK
-
- /* Done handling interrupts, transfer control to OS */
- call0 XT_RTOS_INT_EXIT /* does not return directly here */
-
- /*
- Exit point for dispatch. Saved in interrupt stack frame at XT_STK_EXIT
- on entry and used to return to a thread or interrupted interrupt handler.
- */
- .global _xt_medint6_exit
- .type _xt_medint6_exit,@function
- .align 4
-_xt_medint6_exit:
- /* Restore only level-specific regs (the rest were already restored) */
- l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
- wsr a0, EPS_6
- l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
- wsr a0, EPC_6
- l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
- l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
- rsync /* ensure EPS and EPC written */
- rfi 6
-
-#endif /* Level 6 */
-
-
-/*******************************************************************************
-
-HIGH PRIORITY (LEVEL > XCHAL_EXCM_LEVEL) INTERRUPT VECTORS AND HANDLERS
-
-High priority interrupts are by definition those with priorities greater
-than XCHAL_EXCM_LEVEL. This includes non-maskable (NMI). High priority
-interrupts cannot interact with the RTOS, that is they must save all regs
-they use and not call any RTOS function.
-
-A further restriction imposed by the Xtensa windowed architecture is that
-high priority interrupts must not modify the stack area even logically
-"above" the top of the interrupted stack (they need to provide their
-own stack or static save area).
-
-Cadence Design Systems recommends high priority interrupt handlers be coded in assembly
-and used for purposes requiring very short service times.
-
-Here are templates for high priority (level 2+) interrupt vectors.
-They assume only one interrupt per level to avoid the burden of identifying
-which interrupts at this level are pending and enabled. This allows for
-minimum latency and avoids having to save/restore a2 in addition to a0.
-If more than one interrupt per high priority level is configured, this burden
-is on the handler which in any case must provide a way to save and restore
-registers it uses without touching the interrupted stack.
-
-Each vector goes at a predetermined location according to the Xtensa
-hardware configuration, which is ensured by its placement in a special
-section known to the Xtensa linker support package (LSP). It performs
-the minimum necessary before jumping to the handler in the .text section.
-
-*******************************************************************************/
-
-/*
-These stubs just call xt_highintX/xt_nmi to handle the real interrupt. Please define
-these in an external assembly source file. If these symbols are not defined anywhere
-else, the defaults in xtensa_vector_defaults.S are used.
-*/
-
-#if XCHAL_NUM_INTLEVELS >=2 && XCHAL_EXCM_LEVEL <2 && XCHAL_DEBUGLEVEL !=2
-
- .begin literal_prefix .Level2InterruptVector
- .section .Level2InterruptVector.text, "ax"
- .global _Level2Vector
- .type _Level2Vector,@function
- .global xt_highint2
- .align 4
-_Level2Vector:
- wsr a0, EXCSAVE_2 /* preserve a0 */
- call0 xt_highint2 /* load interrupt handler */
-
- .end literal_prefix
-
-#endif /* Level 2 */
-
-#if XCHAL_NUM_INTLEVELS >=3 && XCHAL_EXCM_LEVEL <3 && XCHAL_DEBUGLEVEL !=3
-
- .begin literal_prefix .Level3InterruptVector
- .section .Level3InterruptVector.text, "ax"
- .global _Level3Vector
- .type _Level3Vector,@function
- .global xt_highint3
- .align 4
-_Level3Vector:
- wsr a0, EXCSAVE_3 /* preserve a0 */
- call0 xt_highint3 /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
-#endif /* Level 3 */
-
-#if XCHAL_NUM_INTLEVELS >=4 && XCHAL_EXCM_LEVEL <4 && XCHAL_DEBUGLEVEL !=4
-
- .begin literal_prefix .Level4InterruptVector
- .section .Level4InterruptVector.text, "ax"
- .global _Level4Vector
- .type _Level4Vector,@function
- .global xt_highint4
- .align 4
-_Level4Vector:
- wsr a0, EXCSAVE_4 /* preserve a0 */
- call0 xt_highint4 /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
-#endif /* Level 4 */
-
-#if XCHAL_NUM_INTLEVELS >=5 && XCHAL_EXCM_LEVEL <5 && XCHAL_DEBUGLEVEL !=5
-
- .begin literal_prefix .Level5InterruptVector
- .section .Level5InterruptVector.text, "ax"
- .global _Level5Vector
- .type _Level5Vector,@function
- .global xt_highint5
- .align 4
-_Level5Vector:
- wsr a0, EXCSAVE_5 /* preserve a0 */
- call0 xt_highint5 /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
-#endif /* Level 5 */
-
-#if XCHAL_NUM_INTLEVELS >=6 && XCHAL_EXCM_LEVEL <6 && XCHAL_DEBUGLEVEL !=6
-
- .begin literal_prefix .Level6InterruptVector
- .section .Level6InterruptVector.text, "ax"
- .global _Level6Vector
- .type _Level6Vector,@function
- .global xt_highint6
- .align 4
-_Level6Vector:
- wsr a0, EXCSAVE_6 /* preserve a0 */
- call0 xt_highint6 /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
-#endif /* Level 6 */
-
-#if XCHAL_HAVE_NMI
-
- .begin literal_prefix .NMIExceptionVector
- .section .NMIExceptionVector.text, "ax"
- .global _NMIExceptionVector
- .type _NMIExceptionVector,@function
- .global xt_nmi
- .align 4
-_NMIExceptionVector:
- wsr a0, EXCSAVE + XCHAL_NMILEVEL _ /* preserve a0 */
- call0 xt_nmi /* load interrupt handler */
- /* never returns here - call0 is used as a jump (see note at top) */
-
- .end literal_prefix
-
-#endif /* NMI */
-
-
-/*******************************************************************************
-
-WINDOW OVERFLOW AND UNDERFLOW EXCEPTION VECTORS AND ALLOCA EXCEPTION HANDLER
-
-Here is the code for each window overflow/underflow exception vector and
-(interspersed) efficient code for handling the alloca exception cause.
-Window exceptions are handled entirely in the vector area and are very
-tight for performance. The alloca exception is also handled entirely in
-the window vector area so comes at essentially no cost in code size.
-Users should never need to modify them and Cadence Design Systems recommends
-they do not.
-
-Window handlers go at predetermined vector locations according to the
-Xtensa hardware configuration, which is ensured by their placement in a
-special section known to the Xtensa linker support package (LSP). Since
-their offsets in that section are always the same, the LSPs do not define
-a section per vector.
-
-These things are coded for XEA2 only (XEA1 is not supported).
-
-Note on Underflow Handlers:
-The underflow handler for returning from call[i+1] to call[i]
-must preserve all the registers from call[i+1]'s window.
-In particular, a0 and a1 must be preserved because the RETW instruction
-will be reexecuted (and may even underflow if an intervening exception
-has flushed call[i]'s registers).
-Registers a2 and up may contain return values.
-
-*******************************************************************************/
-
-#if XCHAL_HAVE_WINDOWED
-
- .section .WindowVectors.text, "ax"
-
-/*
---------------------------------------------------------------------------------
-Window Overflow Exception for Call4.
-
-Invoked if a call[i] referenced a register (a4-a15)
-that contains data from ancestor call[j];
-call[j] had done a call4 to call[j+1].
-On entry here:
- window rotated to call[j] start point;
- a0-a3 are registers to be saved;
- a4-a15 must be preserved;
- a5 is call[j+1]'s stack pointer.
---------------------------------------------------------------------------------
-*/
-
- .org 0x0
- .global _WindowOverflow4
-_WindowOverflow4:
-
- 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 */
-
-/*
---------------------------------------------------------------------------------
-Window Underflow Exception for Call4
-
-Invoked by RETW returning from call[i+1] to call[i]
-where call[i]'s registers must be reloaded (not live in ARs);
-where call[i] had done a call4 to call[i+1].
-On entry here:
- window rotated to call[i] start point;
- a0-a3 are undefined, must be reloaded with call[i].reg[0..3];
- a4-a15 must be preserved (they are call[i+1].reg[0..11]);
- a5 is call[i+1]'s stack pointer.
---------------------------------------------------------------------------------
-*/
-
- .org 0x40
- .global _WindowUnderflow4
-_WindowUnderflow4:
-
- 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
-
-/*
---------------------------------------------------------------------------------
-Handle alloca exception generated by interruptee executing 'movsp'.
-This uses space between the window vectors, so is essentially "free".
-All interruptee's regs are intact except a0 which is saved in EXCSAVE_1,
-and PS.EXCM has been set by the exception hardware (can't be interrupted).
-The fact the alloca exception was taken means the registers associated with
-the base-save area have been spilled and will be restored by the underflow
-handler, so those 4 registers are available for scratch.
-The code is optimized to avoid unaligned branches and minimize cache misses.
---------------------------------------------------------------------------------
-*/
-
- .align 4
- .global _xt_alloca_exc
-_xt_alloca_exc:
-
- rsr a0, WINDOWBASE /* grab WINDOWBASE before rotw changes it */
- rotw -1 /* WINDOWBASE goes to a4, new a0-a3 are scratch */
- rsr a2, PS
- extui a3, a2, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS
- xor a3, a3, a4 /* bits changed from old to current windowbase */
- rsr a4, EXCSAVE_1 /* restore original a0 (now in a4) */
- slli a3, a3, XCHAL_PS_OWB_SHIFT
- xor a2, a2, a3 /* flip changed bits in old window base */
- wsr a2, PS /* update PS.OWB to new window base */
- rsync
-
- _bbci.l a4, 31, _WindowUnderflow4
- rotw -1 /* original a0 goes to a8 */
- _bbci.l a8, 30, _WindowUnderflow8
- rotw -1
- j _WindowUnderflow12
-
-/*
---------------------------------------------------------------------------------
-Window Overflow Exception for Call8
-
-Invoked if a call[i] referenced a register (a4-a15)
-that contains data from ancestor call[j];
-call[j] had done a call8 to call[j+1].
-On entry here:
- window rotated to call[j] start point;
- a0-a7 are registers to be saved;
- a8-a15 must be preserved;
- a9 is call[j+1]'s stack pointer.
---------------------------------------------------------------------------------
-*/
-
- .org 0x80
- .global _WindowOverflow8
-_WindowOverflow8:
-
- 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 */
-
-/*
---------------------------------------------------------------------------------
-Window Underflow Exception for Call8
-
-Invoked by RETW returning from call[i+1] to call[i]
-where call[i]'s registers must be reloaded (not live in ARs);
-where call[i] had done a call8 to call[i+1].
-On entry here:
- window rotated to call[i] start point;
- a0-a7 are undefined, must be reloaded with call[i].reg[0..7];
- a8-a15 must be preserved (they are call[i+1].reg[0..7]);
- a9 is call[i+1]'s stack pointer.
---------------------------------------------------------------------------------
-*/
-
- .org 0xC0
- .global _WindowUnderflow8
-_WindowUnderflow8:
-
- 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
-
-/*
---------------------------------------------------------------------------------
-Window Overflow Exception for Call12
-
-Invoked if a call[i] referenced a register (a4-a15)
-that contains data from ancestor call[j];
-call[j] had done a call12 to call[j+1].
-On entry here:
- window rotated to call[j] start point;
- a0-a11 are registers to be saved;
- a12-a15 must be preserved;
- a13 is call[j+1]'s stack pointer.
---------------------------------------------------------------------------------
-*/
-
- .org 0x100
- .global _WindowOverflow12
-_WindowOverflow12:
-
- 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 */
-
-/*
---------------------------------------------------------------------------------
-Window Underflow Exception for Call12
-
-Invoked by RETW returning from call[i+1] to call[i]
-where call[i]'s registers must be reloaded (not live in ARs);
-where call[i] had done a call12 to call[i+1].
-On entry here:
- window rotated to call[i] start point;
- a0-a11 are undefined, must be reloaded with call[i].reg[0..11];
- a12-a15 must be preserved (they are call[i+1].reg[0..3]);
- a13 is call[i+1]'s stack pointer.
---------------------------------------------------------------------------------
-*/
-
- .org 0x140
- .global _WindowUnderflow12
-_WindowUnderflow12:
-
- 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
-
-#endif /* XCHAL_HAVE_WINDOWED */
-
- .section .UserEnter.text, "ax"
- .global call_user_start
- .type call_user_start,@function
- .align 4
- .literal_position
-
-
-