mirror of
https://github.com/espressif/esp-idf.git
synced 2025-07-29 18:27:20 +02:00
Merge branch 'contrib/github_pr_16040' into 'master'
refactor(xtensa): Rename specreg.h register macros (GitHub PR) Closes IDFGH-11606 and IDFGH-15386 See merge request espressif/esp-idf!39649
This commit is contained in:
@ -167,7 +167,7 @@ esp_err_t bootloader_init(void)
|
|||||||
|
|
||||||
#if XCHAL_ERRATUM_572
|
#if XCHAL_ERRATUM_572
|
||||||
uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT;
|
uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT;
|
||||||
WSR(MEMCTL, memctl);
|
WSR(XT_REG_MEMCTL, memctl);
|
||||||
#endif // XCHAL_ERRATUM_572
|
#endif // XCHAL_ERRATUM_572
|
||||||
|
|
||||||
// In RAM_APP, memory will be initialized in `call_start_cpu0`
|
// In RAM_APP, memory will be initialized in `call_start_cpu0`
|
||||||
|
@ -144,7 +144,7 @@ esp_err_t bootloader_init(void)
|
|||||||
|
|
||||||
#if XCHAL_ERRATUM_572
|
#if XCHAL_ERRATUM_572
|
||||||
uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT;
|
uint32_t memctl = XCHAL_CACHE_MEMCTL_DEFAULT;
|
||||||
WSR(MEMCTL, memctl);
|
WSR(XT_REG_MEMCTL, memctl);
|
||||||
#endif // XCHAL_ERRATUM_572
|
#endif // XCHAL_ERRATUM_572
|
||||||
|
|
||||||
bootloader_ana_reset_config();
|
bootloader_ana_reset_config();
|
||||||
|
@ -57,17 +57,17 @@ xt_highint4:
|
|||||||
wsr a0, CCOMPARE2
|
wsr a0, CCOMPARE2
|
||||||
|
|
||||||
/* Enable Timer 2 interrupt */
|
/* Enable Timer 2 interrupt */
|
||||||
rsr a0, INTENABLE
|
rsr a0, XT_REG_INTENABLE
|
||||||
extui a0, a0, 16, 1
|
extui a0, a0, 16, 1
|
||||||
bnez a0, 1f
|
bnez a0, 1f
|
||||||
movi a0, 0
|
movi a0, 0
|
||||||
xsr a0, INTENABLE /* disable all interrupts */
|
xsr a0, XT_REG_INTENABLE /* disable all interrupts */
|
||||||
/* And a0 with (1 << 16) for Timer 2 interrupt mask */
|
/* And a0 with (1 << 16) for Timer 2 interrupt mask */
|
||||||
addmi a0, a0, (1<<14)
|
addmi a0, a0, (1<<14)
|
||||||
addmi a0, a0, (1<<14)
|
addmi a0, a0, (1<<14)
|
||||||
addmi a0, a0, (1<<14)
|
addmi a0, a0, (1<<14)
|
||||||
addmi a0, a0, (1<<14)
|
addmi a0, a0, (1<<14)
|
||||||
wsr a0, INTENABLE /* Enable Timer 2 */
|
wsr a0, XT_REG_INTENABLE /* Enable Timer 2 */
|
||||||
1:
|
1:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -76,37 +76,37 @@ xt_highint4:
|
|||||||
s32i a1, a0, 4
|
s32i a1, a0, 4
|
||||||
s32i a2, a0, 8
|
s32i a2, a0, 8
|
||||||
s32i a3, a0, 12
|
s32i a3, a0, 12
|
||||||
rsr a2, EXCSAVE_4 /* holds the value of a0 */
|
rsr a2, XT_REG_EXCSAVE_4 /* holds the value of a0 */
|
||||||
s32i a2, a0, 0
|
s32i a2, a0, 0
|
||||||
|
|
||||||
/* Save special registers */
|
/* Save special registers */
|
||||||
addi a0, a0, SPECREG_OFFSET
|
addi a0, a0, SPECREG_OFFSET
|
||||||
rsr a2, WINDOWBASE
|
rsr a2, XT_REG_WINDOWBASE
|
||||||
s32i a2, a0, 0
|
s32i a2, a0, 0
|
||||||
rsr a2, WINDOWSTART
|
rsr a2, XT_REG_WINDOWSTART
|
||||||
s32i a2, a0, 4
|
s32i a2, a0, 4
|
||||||
rsr a2, SAR
|
rsr a2, XT_REG_SAR
|
||||||
s32i a2, a0, 8
|
s32i a2, a0, 8
|
||||||
rsr a2, LBEG
|
rsr a2, XT_REG_LBEG
|
||||||
s32i a2, a0, 12
|
s32i a2, a0, 12
|
||||||
rsr a2, LEND
|
rsr a2, XT_REG_LEND
|
||||||
s32i a2, a0, 16
|
s32i a2, a0, 16
|
||||||
rsr a2, LCOUNT
|
rsr a2, XT_REG_LCOUNT
|
||||||
s32i a2, a0, 20
|
s32i a2, a0, 20
|
||||||
rsr a2, EPC1
|
rsr a2, EPC1
|
||||||
s32i a2, a0, 24
|
s32i a2, a0, 24
|
||||||
|
|
||||||
#if CONFIG_ESP32_ECO3_CACHE_LOCK_FIX
|
#if CONFIG_ESP32_ECO3_CACHE_LOCK_FIX
|
||||||
movi a0, 0
|
movi a0, 0
|
||||||
xsr a0, INTENABLE /* disable all interrupts */
|
xsr a0, XT_REG_INTENABLE /* disable all interrupts */
|
||||||
movi a2, ~(1<<16)
|
movi a2, ~(1<<16)
|
||||||
and a0, a2, a0
|
and a0, a2, a0
|
||||||
wsr a0, INTENABLE
|
wsr a0, XT_REG_INTENABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* disable exception mode, window overflow */
|
/* disable exception mode, window overflow */
|
||||||
movi a0, PS_INTLEVEL(5) | PS_EXCM
|
movi a0, PS_INTLEVEL(5) | PS_EXCM
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
/* Save the remaining physical registers.
|
/* Save the remaining physical registers.
|
||||||
@ -153,12 +153,12 @@ xt_highint4:
|
|||||||
/* a0 still points to _l4_save_ctx */
|
/* a0 still points to _l4_save_ctx */
|
||||||
|
|
||||||
/* Can clear WINDOWSTART now, all registers are saved */
|
/* Can clear WINDOWSTART now, all registers are saved */
|
||||||
rsr a2, WINDOWBASE
|
rsr a2, XT_REG_WINDOWBASE
|
||||||
/* WINDOWSTART = (1 << WINDOWBASE) */
|
/* WINDOWSTART = (1 << WINDOWBASE) */
|
||||||
movi a3, 1
|
movi a3, 1
|
||||||
ssl a2
|
ssl a2
|
||||||
sll a3, a3
|
sll a3, a3
|
||||||
wsr a3, WINDOWSTART
|
wsr a3, XT_REG_WINDOWSTART
|
||||||
|
|
||||||
_highint4_stack_switch:
|
_highint4_stack_switch:
|
||||||
movi a0, 0
|
movi a0, 0
|
||||||
@ -169,7 +169,7 @@ _highint4_stack_switch:
|
|||||||
|
|
||||||
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
||||||
movi a6, PS_INTLEVEL(4) | PS_UM | PS_WOE
|
movi a6, PS_INTLEVEL(4) | PS_UM | PS_WOE
|
||||||
wsr a6, PS
|
wsr a6, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
/* Call C handler */
|
/* Call C handler */
|
||||||
@ -180,7 +180,7 @@ _highint4_stack_switch:
|
|||||||
|
|
||||||
/* Done with C handler; re-enable exception mode, disabling window overflow */
|
/* Done with C handler; re-enable exception mode, disabling window overflow */
|
||||||
movi a2, PS_INTLEVEL(5) | PS_EXCM /* TOCHECK */
|
movi a2, PS_INTLEVEL(5) | PS_EXCM /* TOCHECK */
|
||||||
wsr a2, PS
|
wsr a2, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
/* Restore the special registers.
|
/* Restore the special registers.
|
||||||
@ -188,13 +188,13 @@ _highint4_stack_switch:
|
|||||||
*/
|
*/
|
||||||
movi a0, _l4_save_ctx + SPECREG_OFFSET
|
movi a0, _l4_save_ctx + SPECREG_OFFSET
|
||||||
l32i a2, a0, 8
|
l32i a2, a0, 8
|
||||||
wsr a2, SAR
|
wsr a2, XT_REG_SAR
|
||||||
l32i a2, a0, 12
|
l32i a2, a0, 12
|
||||||
wsr a2, LBEG
|
wsr a2, XT_REG_LBEG
|
||||||
l32i a2, a0, 16
|
l32i a2, a0, 16
|
||||||
wsr a2, LEND
|
wsr a2, XT_REG_LEND
|
||||||
l32i a2, a0, 20
|
l32i a2, a0, 20
|
||||||
wsr a2, LCOUNT
|
wsr a2, XT_REG_LCOUNT
|
||||||
l32i a2, a0, 24
|
l32i a2, a0, 24
|
||||||
wsr a2, EPC1
|
wsr a2, EPC1
|
||||||
|
|
||||||
@ -247,12 +247,12 @@ _highint4_stack_switch:
|
|||||||
movi a0, _l4_save_ctx
|
movi a0, _l4_save_ctx
|
||||||
|
|
||||||
l32i a2, a0, SPECREG_OFFSET + 4
|
l32i a2, a0, SPECREG_OFFSET + 4
|
||||||
wsr a2, WINDOWSTART
|
wsr a2, XT_REG_WINDOWSTART
|
||||||
|
|
||||||
l32i a1, a0, 4
|
l32i a1, a0, 4
|
||||||
l32i a2, a0, 8
|
l32i a2, a0, 8
|
||||||
l32i a3, a0, 12
|
l32i a3, a0, 12
|
||||||
rsr a0, EXCSAVE_4 /* holds the value of a0 before the interrupt handler */
|
rsr a0, XT_REG_EXCSAVE_4 /* holds the value of a0 before the interrupt handler */
|
||||||
|
|
||||||
/* Return from the interrupt, restoring PS from EPS_4 */
|
/* Return from the interrupt, restoring PS from EPS_4 */
|
||||||
rfi 4
|
rfi 4
|
||||||
|
@ -24,9 +24,9 @@ esp_gdbstub_int:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_1 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_1 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -35,21 +35,21 @@ esp_gdbstub_int:
|
|||||||
s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
|
s32i a13, sp, XT_STK_A13 /* A13 to have already been saved */
|
||||||
|
|
||||||
/* Save exc cause and vaddr into exception frame */
|
/* Save exc cause and vaddr into exception frame */
|
||||||
rsr a0, EXCCAUSE
|
rsr a0, XT_REG_EXCCAUSE
|
||||||
s32i a0, sp, XT_STK_EXCCAUSE
|
s32i a0, sp, XT_STK_EXCCAUSE
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
|
|
||||||
/* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */
|
/* _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 */
|
rsr a0, XT_REG_EXCSAVE_1 /* save interruptee's a0 */
|
||||||
|
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
|
|
||||||
/* Save context pointer as input parameter */
|
/* Save context pointer as input parameter */
|
||||||
rsr a6, excsave1
|
rsr a6, excsave1
|
||||||
|
|
||||||
rsr a3, EPS
|
rsr a3, XT_REG_EPS
|
||||||
s32i a3, sp, XT_STK_PS // store PS to the ps place
|
s32i a3, sp, XT_STK_PS // store PS to the ps place
|
||||||
movi a3, gdbstub_handle_uart_int
|
movi a3, gdbstub_handle_uart_int
|
||||||
callx0 a3
|
callx0 a3
|
||||||
|
@ -7,7 +7,7 @@
|
|||||||
#include <string.h>
|
#include <string.h>
|
||||||
#include "esp_gdbstub_common.h"
|
#include "esp_gdbstub_common.h"
|
||||||
#include "soc/soc_memory_layout.h"
|
#include "soc/soc_memory_layout.h"
|
||||||
#include "xtensa/config/specreg.h"
|
#include "xtensa/config/xt_specreg.h"
|
||||||
#include "sdkconfig.h"
|
#include "sdkconfig.h"
|
||||||
#include "esp_cpu.h"
|
#include "esp_cpu.h"
|
||||||
#include "esp_ipc_isr.h"
|
#include "esp_ipc_isr.h"
|
||||||
@ -35,8 +35,8 @@ static void update_regfile_common(esp_gdbstub_gdb_regfile_t *dst)
|
|||||||
}
|
}
|
||||||
dst->windowbase = 0;
|
dst->windowbase = 0;
|
||||||
dst->windowstart = 0x1;
|
dst->windowstart = 0x1;
|
||||||
RSR(CONFIGID0, dst->configid0);
|
RSR(XT_REG_CONFIGID0, dst->configid0);
|
||||||
RSR(CONFIGID1, dst->configid1);
|
RSR(XT_REG_CONFIGID1, dst->configid1);
|
||||||
}
|
}
|
||||||
|
|
||||||
#if XCHAL_HAVE_FP
|
#if XCHAL_HAVE_FP
|
||||||
@ -111,7 +111,7 @@ void esp_gdbstub_frame_to_regfile(const esp_gdbstub_frame_t *frame, esp_gdbstub_
|
|||||||
current_tcb_ptr = pxCurrentTCBs[esp_cpu_get_core_id()];
|
current_tcb_ptr = pxCurrentTCBs[esp_cpu_get_core_id()];
|
||||||
#endif
|
#endif
|
||||||
uint32_t cp_enabled;
|
uint32_t cp_enabled;
|
||||||
RSR(CPENABLE, cp_enabled);
|
RSR(XT_REG_CPENABLE, cp_enabled);
|
||||||
|
|
||||||
// Check if the co-processor is enabled
|
// Check if the co-processor is enabled
|
||||||
if (cp_enabled) {
|
if (cp_enabled) {
|
||||||
@ -182,7 +182,7 @@ void esp_gdbstub_tcb_frame_to_regfile(dummy_tcb_t *tcb, esp_gdbstub_gdb_regfile_
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
uint32_t cp_enabled;
|
uint32_t cp_enabled;
|
||||||
RSR(CPENABLE, cp_enabled);
|
RSR(XT_REG_CPENABLE, cp_enabled);
|
||||||
|
|
||||||
void *current_tcb_ptr = tcb;
|
void *current_tcb_ptr = tcb;
|
||||||
uint32_t *current_fpu_ptr = NULL;
|
uint32_t *current_fpu_ptr = NULL;
|
||||||
@ -309,8 +309,8 @@ void esp_gdbstub_stall_other_cpus_end(void)
|
|||||||
* */
|
* */
|
||||||
void esp_gdbstub_clear_step(void)
|
void esp_gdbstub_clear_step(void)
|
||||||
{
|
{
|
||||||
WSR(ICOUNT, 0);
|
WSR(XT_REG_ICOUNT, 0);
|
||||||
WSR(ICOUNTLEVEL, 0);
|
WSR(XT_REG_ICOUNTLEVEL, 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief GDB do step
|
/** @brief GDB do step
|
||||||
@ -326,8 +326,8 @@ void esp_gdbstub_do_step( esp_gdbstub_frame_t *frame)
|
|||||||
level &= 0x7;
|
level &= 0x7;
|
||||||
level += 1;
|
level += 1;
|
||||||
|
|
||||||
WSR(ICOUNTLEVEL, level);
|
WSR(XT_REG_ICOUNTLEVEL, level);
|
||||||
WSR(ICOUNT, -2);
|
WSR(XT_REG_ICOUNT, -2);
|
||||||
}
|
}
|
||||||
|
|
||||||
/** @brief GDB trigger other CPU
|
/** @brief GDB trigger other CPU
|
||||||
@ -364,7 +364,7 @@ void esp_gdbstub_set_register(esp_gdbstub_frame_t *frame, uint32_t reg_index, ui
|
|||||||
#if XCHAL_HAVE_FP
|
#if XCHAL_HAVE_FP
|
||||||
void *ptr1;
|
void *ptr1;
|
||||||
uint32_t cp_enabled;
|
uint32_t cp_enabled;
|
||||||
RSR(CPENABLE, cp_enabled);
|
RSR(XT_REG_CPENABLE, cp_enabled);
|
||||||
if (cp_enabled != 0) {
|
if (cp_enabled != 0) {
|
||||||
if (reg_index == 87) {
|
if (reg_index == 87) {
|
||||||
asm volatile ("lsi f0, %0, 0" :: "a" (ptr0));
|
asm volatile ("lsi f0, %0, 0" :: "a" (ptr0));
|
||||||
|
@ -22,9 +22,9 @@ _xt_panic_gdbstub:
|
|||||||
s32i a0, sp, XT_STK_EXIT
|
s32i a0, sp, XT_STK_EXIT
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
|
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_1 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_1 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
call0 _xt_context_save /* Save full context*/
|
call0 _xt_context_save /* Save full context*/
|
||||||
addi a7, sp, XT_STK_FRMSZ
|
addi a7, sp, XT_STK_FRMSZ
|
||||||
@ -33,29 +33,29 @@ _xt_panic_gdbstub:
|
|||||||
s32i a13, sp, XT_STK_A13
|
s32i a13, sp, XT_STK_A13
|
||||||
|
|
||||||
/* Save exc cause and vaddr into exception frame */
|
/* Save exc cause and vaddr into exception frame */
|
||||||
rsr a0, EXCCAUSE
|
rsr a0, XT_REG_EXCCAUSE
|
||||||
s32i a0, sp, XT_STK_EXCCAUSE
|
s32i a0, sp, XT_STK_EXCCAUSE
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
/* _xt_context_save seems to save the current a0, but we need the interuptees a0. Fix this. */
|
/* _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 */
|
rsr a0, XT_REG_EXCSAVE_1 /* save interruptee's a0 */
|
||||||
|
|
||||||
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
||||||
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
|
|
||||||
//Call gdbstub handler
|
//Call gdbstub handler
|
||||||
|
|
||||||
rsr a0,(EPC + XCHAL_DEBUGLEVEL)
|
rsr a0,(XT_REG_EPC + XCHAL_DEBUGLEVEL)
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
mov a6, sp
|
mov a6, sp
|
||||||
rsr a9, EPS_6
|
rsr a9, XT_REG_EPS_6
|
||||||
s32i a9, sp, XT_STK_PS // store PS to the ps place
|
s32i a9, sp, XT_STK_PS // store PS to the ps place
|
||||||
movi a11, gdbstub_handle_debug_int
|
movi a11, gdbstub_handle_debug_int
|
||||||
callx4 a11 /* Call interrupt handler */
|
callx4 a11 /* Call interrupt handler */
|
||||||
l32i a0, sp, XT_STK_PC
|
l32i a0, sp, XT_STK_PC
|
||||||
wsr a0,(EPC + XCHAL_DEBUGLEVEL)
|
wsr a0,(XT_REG_EPC + XCHAL_DEBUGLEVEL)
|
||||||
call0 _xt_context_restore /* Restore full context*/
|
call0 _xt_context_restore /* Restore full context*/
|
||||||
l32i a12, sp, XT_STK_A12
|
l32i a12, sp, XT_STK_A12
|
||||||
l32i a13, sp, XT_STK_A13
|
l32i a13, sp, XT_STK_A13
|
||||||
|
@ -307,11 +307,11 @@ TEST_CASE("test for DPORT access performance", "[esp32]")
|
|||||||
static uint32_t start, end;
|
static uint32_t start, end;
|
||||||
|
|
||||||
#define BENCHMARK_START() do { \
|
#define BENCHMARK_START() do { \
|
||||||
RSR(CCOUNT, start); \
|
RSR(XT_REG_CCOUNT, start); \
|
||||||
} while(0)
|
} while(0)
|
||||||
|
|
||||||
#define BENCHMARK_END(OPERATION) do { \
|
#define BENCHMARK_END(OPERATION) do { \
|
||||||
RSR(CCOUNT, end); \
|
RSR(XT_REG_CCOUNT, end); \
|
||||||
printf("%s took %"PRIu32" cycles/op (%"PRIu32" cycles for %d ops)\n", \
|
printf("%s took %"PRIu32" cycles/op (%"PRIu32" cycles for %d ops)\n", \
|
||||||
OPERATION, (end - start)/REPEAT_OPS, \
|
OPERATION, (end - start)/REPEAT_OPS, \
|
||||||
(end - start), REPEAT_OPS); \
|
(end - start), REPEAT_OPS); \
|
||||||
|
@ -40,7 +40,7 @@ xt_highint5:
|
|||||||
wsr a0, CCOMPARE2
|
wsr a0, CCOMPARE2
|
||||||
esync
|
esync
|
||||||
|
|
||||||
rsr a0, EXCSAVE_5 // restore a0
|
rsr a0, XT_REG_EXCSAVE_5 // restore a0
|
||||||
rfi 5
|
rfi 5
|
||||||
|
|
||||||
|
|
||||||
@ -74,7 +74,7 @@ xt_highint5:
|
|||||||
l32i a4, a0, L5_INTR_A4_OFFSET
|
l32i a4, a0, L5_INTR_A4_OFFSET
|
||||||
rsync
|
rsync
|
||||||
.L_xt_highint5_exit:
|
.L_xt_highint5_exit:
|
||||||
rsr a0, EXCSAVE_5 // restore a0
|
rsr a0, XT_REG_EXCSAVE_5 // restore a0
|
||||||
rfi 5
|
rfi 5
|
||||||
|
|
||||||
/* The linker has no reason to link in this file; all symbols it exports are already defined
|
/* The linker has no reason to link in this file; all symbols it exports are already defined
|
||||||
|
@ -215,13 +215,13 @@ float IRAM_ATTR test_fp_benchmark_fp_divide(int counts, unsigned *cycles)
|
|||||||
{
|
{
|
||||||
float f = MAXFLOAT;
|
float f = MAXFLOAT;
|
||||||
uint32_t before, after;
|
uint32_t before, after;
|
||||||
RSR(CCOUNT, before);
|
RSR(XT_REG_CCOUNT, before);
|
||||||
|
|
||||||
for (int i = 0; i < counts; i++) {
|
for (int i = 0; i < counts; i++) {
|
||||||
f /= 1.000432f;
|
f /= 1.000432f;
|
||||||
}
|
}
|
||||||
|
|
||||||
RSR(CCOUNT, after);
|
RSR(XT_REG_CCOUNT, after);
|
||||||
*cycles = (after - before) / counts;
|
*cycles = (after - before) / counts;
|
||||||
|
|
||||||
return f;
|
return f;
|
||||||
@ -254,13 +254,13 @@ float IRAM_ATTR test_fp_benchmark_fp_sqrt(int counts, unsigned *cycles)
|
|||||||
{
|
{
|
||||||
float f = MAXFLOAT;
|
float f = MAXFLOAT;
|
||||||
uint32_t before, after;
|
uint32_t before, after;
|
||||||
RSR(CCOUNT, before);
|
RSR(XT_REG_CCOUNT, before);
|
||||||
|
|
||||||
for (int i = 0; i < counts; i++) {
|
for (int i = 0; i < counts; i++) {
|
||||||
f = sqrtf(f);
|
f = sqrtf(f);
|
||||||
}
|
}
|
||||||
|
|
||||||
RSR(CCOUNT, after);
|
RSR(XT_REG_CCOUNT, after);
|
||||||
*cycles = (after - before) / counts;
|
*cycles = (after - before) / counts;
|
||||||
|
|
||||||
return f;
|
return f;
|
||||||
|
@ -21,7 +21,7 @@
|
|||||||
#define LX_INTR_A2_OFFSET 4
|
#define LX_INTR_A2_OFFSET 4
|
||||||
#define LX_INTR_A3_OFFSET 8
|
#define LX_INTR_A3_OFFSET 8
|
||||||
#define LX_INTR_A4_OFFSET 12
|
#define LX_INTR_A4_OFFSET 12
|
||||||
#define EXCSAVE_X EXCSAVE_5
|
#define XT_REG_EXCSAVE_X XT_REG_EXCSAVE_5
|
||||||
#define RFI_X 5
|
#define RFI_X 5
|
||||||
|
|
||||||
#elif CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4
|
#elif CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4
|
||||||
@ -31,7 +31,7 @@
|
|||||||
#define LX_INTR_A2_OFFSET 4
|
#define LX_INTR_A2_OFFSET 4
|
||||||
#define LX_INTR_A3_OFFSET 8
|
#define LX_INTR_A3_OFFSET 8
|
||||||
#define LX_INTR_A4_OFFSET 12
|
#define LX_INTR_A4_OFFSET 12
|
||||||
#define EXCSAVE_X EXCSAVE_4
|
#define XT_REG_EXCSAVE_X XT_REG_EXCSAVE_4
|
||||||
#define RFI_X 4
|
#define RFI_X 4
|
||||||
|
|
||||||
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
|
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
|
||||||
@ -55,14 +55,14 @@ esp_ipc_isr_handler:
|
|||||||
s32i a2, a0, LX_INTR_A2_OFFSET
|
s32i a2, a0, LX_INTR_A2_OFFSET
|
||||||
s32i a3, a0, LX_INTR_A3_OFFSET
|
s32i a3, a0, LX_INTR_A3_OFFSET
|
||||||
s32i a4, a0, LX_INTR_A4_OFFSET
|
s32i a4, a0, LX_INTR_A4_OFFSET
|
||||||
rsr a2, EXCSAVE_X
|
rsr a2, XT_REG_EXCSAVE_X
|
||||||
s32i a2, a0, LX_INTR_A0_OFFSET
|
s32i a2, a0, LX_INTR_A0_OFFSET
|
||||||
|
|
||||||
/* disable nested iterrupts */
|
/* disable nested interrupts */
|
||||||
/* PS.EXCM is changed from 1 to 0 . It allows using usually exception handler instead of the Double exception handler. */
|
/* PS.EXCM is changed from 1 to 0 . It allows using usually exception handler instead of the Double exception handler. */
|
||||||
/* PS_UM = 1 */
|
/* PS_UM = 1 */
|
||||||
movi a0, PS_INTLEVEL(5) | PS_UM
|
movi a0, PS_INTLEVEL(5) | PS_UM
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
/* restore PS will be done by rfi the end */
|
/* restore PS will be done by rfi the end */
|
||||||
|
|
||||||
@ -75,7 +75,7 @@ esp_ipc_isr_handler:
|
|||||||
#elif CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4
|
#elif CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_4
|
||||||
/* This int is edge-triggered and needs clearing. */
|
/* This int is edge-triggered and needs clearing. */
|
||||||
movi a3, (1 << ETS_IPC_ISR_INUM)
|
movi a3, (1 << ETS_IPC_ISR_INUM)
|
||||||
wsr a3, INTCLEAR
|
wsr a3, XT_REG_INTCLEAR
|
||||||
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
|
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
|
||||||
|
|
||||||
/* get CORE_ID */
|
/* get CORE_ID */
|
||||||
@ -118,6 +118,6 @@ esp_ipc_isr_handler:
|
|||||||
s32i a0, a0, 0
|
s32i a0, a0, 0
|
||||||
|
|
||||||
/* restore a0 */
|
/* restore a0 */
|
||||||
rsr a0, EXCSAVE_X
|
rsr a0, XT_REG_EXCSAVE_X
|
||||||
/* restores PS from EPS[X] and jumps to the address in EPC[X] */
|
/* restores PS from EPS[X] and jumps to the address in EPC[X] */
|
||||||
rfi RFI_X
|
rfi RFI_X
|
||||||
|
@ -1,3 +1,8 @@
|
|||||||
|
/*
|
||||||
|
* SPDX-FileCopyrightText: 2025 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
|
*/
|
||||||
#include "freertos/xtensa_rtos.h"
|
#include "freertos/xtensa_rtos.h"
|
||||||
#include "esp_private/panic_reason.h"
|
#include "esp_private/panic_reason.h"
|
||||||
#include "soc/soc.h"
|
#include "soc/soc.h"
|
||||||
@ -31,11 +36,11 @@ _xt_panic:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_1 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_1 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_1 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_1 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -45,14 +50,14 @@ _xt_panic:
|
|||||||
call0 _xt_context_save
|
call0 _xt_context_save
|
||||||
|
|
||||||
/* Save exc cause and vaddr into exception frame */
|
/* Save exc cause and vaddr into exception frame */
|
||||||
rsr a0, EXCCAUSE
|
rsr a0, XT_REG_EXCCAUSE
|
||||||
s32i a0, sp, XT_STK_EXCCAUSE
|
s32i a0, sp, XT_STK_EXCCAUSE
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
||||||
movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM | PS_WOE
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
|
|
||||||
//Call panic handler
|
//Call panic handler
|
||||||
mov a6,sp
|
mov a6,sp
|
||||||
|
@ -32,8 +32,8 @@ Interrupt , a high-priority interrupt, is used for several things:
|
|||||||
#define LX_INTR_A2_OFFSET 0
|
#define LX_INTR_A2_OFFSET 0
|
||||||
#define LX_INTR_A3_OFFSET 4
|
#define LX_INTR_A3_OFFSET 4
|
||||||
#define LX_INTR_A4_OFFSET 8
|
#define LX_INTR_A4_OFFSET 8
|
||||||
#define EPC_X EPC_5
|
#define XT_REG_EPC_X XT_REG_EPC_5
|
||||||
#define EXCSAVE_X EXCSAVE_5
|
#define XT_REG_EXCSAVE_X XT_REG_EXCSAVE_5
|
||||||
#define RFI_X 5
|
#define RFI_X 5
|
||||||
#define xt_highintx xt_highint5
|
#define xt_highintx xt_highint5
|
||||||
|
|
||||||
@ -43,8 +43,8 @@ Interrupt , a high-priority interrupt, is used for several things:
|
|||||||
#define LX_INTR_A2_OFFSET 0
|
#define LX_INTR_A2_OFFSET 0
|
||||||
#define LX_INTR_A3_OFFSET 4
|
#define LX_INTR_A3_OFFSET 4
|
||||||
#define LX_INTR_A4_OFFSET 8
|
#define LX_INTR_A4_OFFSET 8
|
||||||
#define EPC_X EPC_4
|
#define XT_REG_EPC_X XT_REG_EPC_4
|
||||||
#define EXCSAVE_X EXCSAVE_4
|
#define XT_REG_EXCSAVE_X XT_REG_EXCSAVE_4
|
||||||
#define RFI_X 4
|
#define RFI_X 4
|
||||||
#define xt_highintx xt_highint4
|
#define xt_highintx xt_highint4
|
||||||
|
|
||||||
@ -114,7 +114,7 @@ Interrupt , a high-priority interrupt, is used for several things:
|
|||||||
.endm
|
.endm
|
||||||
|
|
||||||
.macro get_int_status_tg1wdt reg
|
.macro get_int_status_tg1wdt reg
|
||||||
rsr \reg, INTERRUPT
|
rsr \reg, XT_REG_INTERRUPT
|
||||||
extui \reg, \reg, ETS_T1_WDT_CACHEERR_INUM, 1
|
extui \reg, \reg, ETS_T1_WDT_CACHEERR_INUM, 1
|
||||||
beqz \reg, 99f /* not ETS_T1_WDT_INUM or ETS_CACHEERR_INUM */
|
beqz \reg, 99f /* not ETS_T1_WDT_INUM or ETS_CACHEERR_INUM */
|
||||||
|
|
||||||
@ -165,7 +165,7 @@ xt_highintx:
|
|||||||
|
|
||||||
#ifndef CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
#ifndef CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
||||||
/* See if we're here for the IPC_ISR interrupt */
|
/* See if we're here for the IPC_ISR interrupt */
|
||||||
rsr a0, INTERRUPT
|
rsr a0, XT_REG_INTERRUPT
|
||||||
extui a0, a0, ETS_IPC_ISR_INUM, 1
|
extui a0, a0, ETS_IPC_ISR_INUM, 1
|
||||||
beqz a0, 1f
|
beqz a0, 1f
|
||||||
/* Jump to `esp_ipc_isr_handler` which is non-returning. We need to use `jx`
|
/* Jump to `esp_ipc_isr_handler` which is non-returning. We need to use `jx`
|
||||||
@ -182,10 +182,10 @@ xt_highintx:
|
|||||||
|
|
||||||
#if CONFIG_BTDM_CTRL_HLI
|
#if CONFIG_BTDM_CTRL_HLI
|
||||||
/* Timer 2 interrupt */
|
/* Timer 2 interrupt */
|
||||||
rsr a0, INTENABLE
|
rsr a0, XT_REG_INTENABLE
|
||||||
extui a0, a0, 16, 1
|
extui a0, a0, 16, 1
|
||||||
beqz a0, 1f
|
beqz a0, 1f
|
||||||
rsr a0, INTERRUPT
|
rsr a0, XT_REG_INTERRUPT
|
||||||
extui a0, a0, 16, 1
|
extui a0, a0, 16, 1
|
||||||
bnez a0, .handle_multicore_debug_int
|
bnez a0, .handle_multicore_debug_int
|
||||||
1:
|
1:
|
||||||
@ -219,11 +219,11 @@ xt_highintx:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_X /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_X /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_X /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_X /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -233,7 +233,7 @@ xt_highintx:
|
|||||||
call0 _xt_context_save
|
call0 _xt_context_save
|
||||||
|
|
||||||
/* Save vaddr into exception frame */
|
/* Save vaddr into exception frame */
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
/* Figure out reason, save into EXCCAUSE reg */
|
/* Figure out reason, save into EXCCAUSE reg */
|
||||||
@ -249,10 +249,10 @@ xt_highintx:
|
|||||||
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
|
#endif /* CONFIG_ESP_SYSTEM_CHECK_INT_LEVEL_5 */
|
||||||
|
|
||||||
/* Kill this interrupt; we cannot reset it. */
|
/* Kill this interrupt; we cannot reset it. */
|
||||||
rsr a0, INTENABLE
|
rsr a0, XT_REG_INTENABLE
|
||||||
movi a4, ~(1<<ETS_MEMACCESS_ERR_INUM)
|
movi a4, ~(1<<ETS_MEMACCESS_ERR_INUM)
|
||||||
and a0, a4, a0
|
and a0, a4, a0
|
||||||
wsr a0, INTENABLE
|
wsr a0, XT_REG_INTENABLE
|
||||||
movi a0, PANIC_RSN_CACHEERR
|
movi a0, PANIC_RSN_CACHEERR
|
||||||
j 9f
|
j 9f
|
||||||
1:
|
1:
|
||||||
@ -278,7 +278,7 @@ xt_highintx:
|
|||||||
|
|
||||||
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
||||||
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
|
|
||||||
/* Call panic handler */
|
/* Call panic handler */
|
||||||
mov a6,sp
|
mov a6,sp
|
||||||
@ -286,14 +286,14 @@ xt_highintx:
|
|||||||
|
|
||||||
call0 _xt_context_restore
|
call0 _xt_context_restore
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_X
|
wsr a0, XT_REG_EPC_X
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
||||||
rsync /* ensure PS and EPC written */
|
rsync /* ensure PS and EPC written */
|
||||||
|
|
||||||
rsr a0, EXCSAVE_X /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_X /* restore a0 */
|
||||||
rfi RFI_X
|
rfi RFI_X
|
||||||
|
|
||||||
|
|
||||||
@ -341,7 +341,7 @@ xt_highintx:
|
|||||||
|
|
||||||
rsr a2, depc
|
rsr a2, depc
|
||||||
|
|
||||||
rsr a0, EXCSAVE_5 /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_5 /* restore a0 */
|
||||||
rfi 5
|
rfi 5
|
||||||
#endif /* CONFIG_BTDM_CTRL_HLI */
|
#endif /* CONFIG_BTDM_CTRL_HLI */
|
||||||
|
|
||||||
@ -508,7 +508,7 @@ xt_highintx:
|
|||||||
/* Feed watchdog */
|
/* Feed watchdog */
|
||||||
8: wdt_feed TIMERG1
|
8: wdt_feed TIMERG1
|
||||||
|
|
||||||
9: wsr a0, PS /* restore interrupt level */
|
9: wsr a0, XT_REG_PS /* restore interrupt level */
|
||||||
|
|
||||||
movi a0, 0
|
movi a0, 0
|
||||||
beqz a5, 1f
|
beqz a5, 1f
|
||||||
@ -536,7 +536,7 @@ xt_highintx:
|
|||||||
|
|
||||||
rsr a5, depc
|
rsr a5, depc
|
||||||
|
|
||||||
rsr a0, EXCSAVE_X /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_X /* restore a0 */
|
||||||
rfi RFI_X
|
rfi RFI_X
|
||||||
|
|
||||||
#endif
|
#endif
|
||||||
|
@ -35,11 +35,11 @@ xt_highint4:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_4 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_4 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_4 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_4 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -49,19 +49,19 @@ xt_highint4:
|
|||||||
call0 _xt_context_save
|
call0 _xt_context_save
|
||||||
|
|
||||||
/* Save vaddr into exception frame */
|
/* Save vaddr into exception frame */
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
/* Figure out reason, save into EXCCAUSE reg */
|
/* Figure out reason, save into EXCCAUSE reg */
|
||||||
|
|
||||||
rsr a0, INTERRUPT
|
rsr a0, XT_REG_INTERRUPT
|
||||||
extui a0, a0, ETS_MEMACCESS_ERR_INUM, 1 /* get cacheerr int bit */
|
extui a0, a0, ETS_MEMACCESS_ERR_INUM, 1 /* get cacheerr int bit */
|
||||||
beqz a0, 1f
|
beqz a0, 1f
|
||||||
/* Kill this interrupt; we cannot reset it. */
|
/* Kill this interrupt; we cannot reset it. */
|
||||||
rsr a0, INTENABLE
|
rsr a0, XT_REG_INTENABLE
|
||||||
movi a4, ~(1<<ETS_MEMACCESS_ERR_INUM)
|
movi a4, ~(1<<ETS_MEMACCESS_ERR_INUM)
|
||||||
and a0, a4, a0
|
and a0, a4, a0
|
||||||
wsr a0, INTENABLE
|
wsr a0, XT_REG_INTENABLE
|
||||||
movi a0, PANIC_RSN_CACHEERR
|
movi a0, PANIC_RSN_CACHEERR
|
||||||
j 9f
|
j 9f
|
||||||
1:
|
1:
|
||||||
@ -73,7 +73,7 @@ xt_highint4:
|
|||||||
|
|
||||||
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
||||||
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
|
|
||||||
//Call panic handler
|
//Call panic handler
|
||||||
mov a6,sp
|
mov a6,sp
|
||||||
@ -81,14 +81,14 @@ xt_highint4:
|
|||||||
|
|
||||||
call0 _xt_context_restore
|
call0 _xt_context_restore
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_4
|
wsr a0, XT_REG_EPC_4
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
||||||
rsync /* ensure PS and EPC written */
|
rsync /* ensure PS and EPC written */
|
||||||
|
|
||||||
rsr a0, EXCSAVE_4 /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_4 /* restore a0 */
|
||||||
rfi 4
|
rfi 4
|
||||||
|
|
||||||
/* The linker has no reason to link in this file; all symbols it exports are already defined
|
/* The linker has no reason to link in this file; all symbols it exports are already defined
|
||||||
|
@ -39,7 +39,7 @@ xt_highint4:
|
|||||||
|
|
||||||
#ifndef CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
#ifndef CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
||||||
/* See if we're here for the IPC_ISR interrupt */
|
/* See if we're here for the IPC_ISR interrupt */
|
||||||
rsr a0, INTERRUPT
|
rsr a0, XT_REG_INTERRUPT
|
||||||
extui a0, a0, ETS_IPC_ISR_INUM, 1
|
extui a0, a0, ETS_IPC_ISR_INUM, 1
|
||||||
bnez a0, jump_to_esp_ipc_isr_handler
|
bnez a0, jump_to_esp_ipc_isr_handler
|
||||||
#endif // not CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
#endif // not CONFIG_ESP_SYSTEM_SINGLE_CORE_MODE
|
||||||
@ -51,11 +51,11 @@ xt_highint4:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_4 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_4 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_4 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_4 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -65,19 +65,19 @@ xt_highint4:
|
|||||||
call0 _xt_context_save
|
call0 _xt_context_save
|
||||||
|
|
||||||
/* Save vaddr into exception frame */
|
/* Save vaddr into exception frame */
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
/* Figure out reason, save into EXCCAUSE reg */
|
/* Figure out reason, save into EXCCAUSE reg */
|
||||||
|
|
||||||
rsr a0, INTERRUPT
|
rsr a0, XT_REG_INTERRUPT
|
||||||
extui a0, a0, ETS_CACHEERR_INUM, 1 /* get cacheerr int bit */
|
extui a0, a0, ETS_CACHEERR_INUM, 1 /* get cacheerr int bit */
|
||||||
beqz a0, 1f
|
beqz a0, 1f
|
||||||
/* Kill this interrupt; we cannot reset it. */
|
/* Kill this interrupt; we cannot reset it. */
|
||||||
rsr a0, INTENABLE
|
rsr a0, XT_REG_INTENABLE
|
||||||
movi a4, ~(1<<ETS_CACHEERR_INUM)
|
movi a4, ~(1<<ETS_CACHEERR_INUM)
|
||||||
and a0, a4, a0
|
and a0, a4, a0
|
||||||
wsr a0, INTENABLE
|
wsr a0, XT_REG_INTENABLE
|
||||||
movi a0, PANIC_RSN_CACHEERR
|
movi a0, PANIC_RSN_CACHEERR
|
||||||
j 9f
|
j 9f
|
||||||
|
|
||||||
@ -101,7 +101,7 @@ xt_highint4:
|
|||||||
|
|
||||||
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
/* Set up PS for C, disable all interrupts except NMI and debug, and clear EXCM. */
|
||||||
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(5) | PS_UM | PS_WOE
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
|
|
||||||
//Call panic handler
|
//Call panic handler
|
||||||
mov a6,sp
|
mov a6,sp
|
||||||
@ -109,14 +109,14 @@ xt_highint4:
|
|||||||
|
|
||||||
call0 _xt_context_restore
|
call0 _xt_context_restore
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_4
|
wsr a0, XT_REG_EPC_4
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
||||||
rsync /* ensure PS and EPC written */
|
rsync /* ensure PS and EPC written */
|
||||||
|
|
||||||
rsr a0, EXCSAVE_4 /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_4 /* restore a0 */
|
||||||
rfi 4
|
rfi 4
|
||||||
|
|
||||||
#ifdef CONFIG_ESP_IPC_ISR_ENABLE
|
#ifdef CONFIG_ESP_IPC_ISR_ENABLE
|
||||||
|
@ -326,7 +326,7 @@ TEST_CASE_MULTIPLE_STAGES("reset reason ESP_RST_BROWNOUT after brownout event",
|
|||||||
#ifndef CONFIG_FREERTOS_UNICORE
|
#ifndef CONFIG_FREERTOS_UNICORE
|
||||||
#if CONFIG_IDF_TARGET_ARCH_XTENSA
|
#if CONFIG_IDF_TARGET_ARCH_XTENSA
|
||||||
#include "xt_instr_macros.h"
|
#include "xt_instr_macros.h"
|
||||||
#include "xtensa/config/specreg.h"
|
#include "xtensa/config/xt_specreg.h"
|
||||||
|
|
||||||
static int size_stack = 1024 * 4;
|
static int size_stack = 1024 * 4;
|
||||||
static StackType_t *start_addr_stack;
|
static StackType_t *start_addr_stack;
|
||||||
@ -335,8 +335,8 @@ static int fibonacci(int n, void* func(void))
|
|||||||
{
|
{
|
||||||
int tmp1 = n, tmp2 = n;
|
int tmp1 = n, tmp2 = n;
|
||||||
uint32_t base, start;
|
uint32_t base, start;
|
||||||
RSR(WINDOWBASE, base);
|
RSR(XT_REG_WINDOWBASE, base);
|
||||||
RSR(WINDOWSTART, start);
|
RSR(XT_REG_WINDOWSTART, start);
|
||||||
printf("WINDOWBASE = %-2"PRIi32" WINDOWSTART = 0x%"PRIx32"\n", base, start);
|
printf("WINDOWBASE = %-2"PRIi32" WINDOWSTART = 0x%"PRIx32"\n", base, start);
|
||||||
if (n <= 1) {
|
if (n <= 1) {
|
||||||
StackType_t *last_addr_stack = esp_cpu_get_sp();
|
StackType_t *last_addr_stack = esp_cpu_get_sp();
|
||||||
|
@ -37,10 +37,10 @@ const static char TAG[] __attribute__((unused)) = "esp_core_dump_port";
|
|||||||
}
|
}
|
||||||
|
|
||||||
#define COREDUMP_GET_EPC(reg, ptr) \
|
#define COREDUMP_GET_EPC(reg, ptr) \
|
||||||
if (reg - EPC_1 + 1 <= XCHAL_NUM_INTLEVELS) COREDUMP_GET_REG_PAIR(reg, ptr)
|
if (reg - XT_REG_EPC_1 + 1 <= XCHAL_NUM_INTLEVELS) COREDUMP_GET_REG_PAIR(reg, ptr)
|
||||||
|
|
||||||
#define COREDUMP_GET_EPS(reg, ptr) \
|
#define COREDUMP_GET_EPS(reg, ptr) \
|
||||||
if (reg - EPS_2 + 2 <= XCHAL_NUM_INTLEVELS) COREDUMP_GET_REG_PAIR(reg, ptr)
|
if (reg - XT_REG_EPS_2 + 2 <= XCHAL_NUM_INTLEVELS) COREDUMP_GET_REG_PAIR(reg, ptr)
|
||||||
|
|
||||||
// Enumeration of registers of exception stack frame
|
// Enumeration of registers of exception stack frame
|
||||||
// and solicited stack frame
|
// and solicited stack frame
|
||||||
@ -158,13 +158,13 @@ static core_dump_reg_pair_t *esp_core_dump_get_epc_regs(core_dump_reg_pair_t* sr
|
|||||||
uint32_t* reg_ptr = (uint32_t*)src;
|
uint32_t* reg_ptr = (uint32_t*)src;
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
// get InterruptException program counter registers
|
// get InterruptException program counter registers
|
||||||
COREDUMP_GET_EPC(EPC_1, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_1, reg_ptr);
|
||||||
COREDUMP_GET_EPC(EPC_2, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_2, reg_ptr);
|
||||||
COREDUMP_GET_EPC(EPC_3, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_3, reg_ptr);
|
||||||
COREDUMP_GET_EPC(EPC_4, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_4, reg_ptr);
|
||||||
COREDUMP_GET_EPC(EPC_5, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_5, reg_ptr);
|
||||||
COREDUMP_GET_EPC(EPC_6, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_6, reg_ptr);
|
||||||
COREDUMP_GET_EPC(EPC_7, reg_ptr);
|
COREDUMP_GET_EPC(XT_REG_EPC_7, reg_ptr);
|
||||||
return (core_dump_reg_pair_t*)reg_ptr;
|
return (core_dump_reg_pair_t*)reg_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -177,12 +177,12 @@ static core_dump_reg_pair_t *esp_core_dump_get_eps_regs(core_dump_reg_pair_t* sr
|
|||||||
uint32_t* reg_ptr = (uint32_t*)src;
|
uint32_t* reg_ptr = (uint32_t*)src;
|
||||||
#pragma GCC diagnostic pop
|
#pragma GCC diagnostic pop
|
||||||
// get InterruptException processor state registers
|
// get InterruptException processor state registers
|
||||||
COREDUMP_GET_EPS(EPS_2, reg_ptr);
|
COREDUMP_GET_EPS(XT_REG_EPS_2, reg_ptr);
|
||||||
COREDUMP_GET_EPS(EPS_3, reg_ptr);
|
COREDUMP_GET_EPS(XT_REG_EPS_3, reg_ptr);
|
||||||
COREDUMP_GET_EPS(EPS_4, reg_ptr);
|
COREDUMP_GET_EPS(XT_REG_EPS_4, reg_ptr);
|
||||||
COREDUMP_GET_EPS(EPS_5, reg_ptr);
|
COREDUMP_GET_EPS(XT_REG_EPS_5, reg_ptr);
|
||||||
COREDUMP_GET_EPS(EPS_6, reg_ptr);
|
COREDUMP_GET_EPS(XT_REG_EPS_6, reg_ptr);
|
||||||
COREDUMP_GET_EPS(EPS_7, reg_ptr);
|
COREDUMP_GET_EPS(XT_REG_EPS_7, reg_ptr);
|
||||||
return (core_dump_reg_pair_t*)reg_ptr;
|
return (core_dump_reg_pair_t*)reg_ptr;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -205,9 +205,9 @@ static esp_err_t esp_core_dump_get_regs_from_stack(void* stack_addr,
|
|||||||
// is this current crashed task?
|
// is this current crashed task?
|
||||||
if (rc == COREDUMP_CURR_TASK_MARKER) {
|
if (rc == COREDUMP_CURR_TASK_MARKER) {
|
||||||
s_extra_info.exccause.reg_val = exc_frame->exccause;
|
s_extra_info.exccause.reg_val = exc_frame->exccause;
|
||||||
s_extra_info.exccause.reg_index = EXCCAUSE;
|
s_extra_info.exccause.reg_index = XT_REG_EXCCAUSE;
|
||||||
s_extra_info.excvaddr.reg_val = exc_frame->excvaddr;
|
s_extra_info.excvaddr.reg_val = exc_frame->excvaddr;
|
||||||
s_extra_info.excvaddr.reg_index = EXCVADDR;
|
s_extra_info.excvaddr.reg_index = XT_REG_EXCVADDR;
|
||||||
// get InterruptException registers into extra_info
|
// get InterruptException registers into extra_info
|
||||||
core_dump_reg_pair_t *regs_ptr = esp_core_dump_get_eps_regs(s_extra_info.extra_regs);
|
core_dump_reg_pair_t *regs_ptr = esp_core_dump_get_eps_regs(s_extra_info.extra_regs);
|
||||||
esp_core_dump_get_epc_regs(regs_ptr);
|
esp_core_dump_get_epc_regs(regs_ptr);
|
||||||
@ -257,7 +257,7 @@ inline void esp_core_dump_port_init(panic_info_t *info, bool isr_context)
|
|||||||
s_extra_info.crashed_task_tcb = COREDUMP_CURR_TASK_MARKER;
|
s_extra_info.crashed_task_tcb = COREDUMP_CURR_TASK_MARKER;
|
||||||
// Initialize exccause register to default value (required if current task corrupted)
|
// Initialize exccause register to default value (required if current task corrupted)
|
||||||
s_extra_info.exccause.reg_val = COREDUMP_INVALID_CAUSE_VALUE;
|
s_extra_info.exccause.reg_val = COREDUMP_INVALID_CAUSE_VALUE;
|
||||||
s_extra_info.exccause.reg_index = EXCCAUSE;
|
s_extra_info.exccause.reg_index = XT_REG_EXCCAUSE;
|
||||||
|
|
||||||
XtExcFrame *s_exc_frame = (XtExcFrame *) info->frame;
|
XtExcFrame *s_exc_frame = (XtExcFrame *) info->frame;
|
||||||
s_exc_frame->exit = COREDUMP_CURR_TASK_MARKER;
|
s_exc_frame->exit = COREDUMP_CURR_TASK_MARKER;
|
||||||
@ -486,10 +486,10 @@ void esp_core_dump_summary_parse_extra_info(esp_core_dump_summary_t *summary, vo
|
|||||||
memset(summary->ex_info.epcx, 0, sizeof(summary->ex_info.epcx));
|
memset(summary->ex_info.epcx, 0, sizeof(summary->ex_info.epcx));
|
||||||
summary->ex_info.epcx_reg_bits = 0;
|
summary->ex_info.epcx_reg_bits = 0;
|
||||||
for (i = 0; i < COREDUMP_EXTRA_REG_NUM; i++) {
|
for (i = 0; i < COREDUMP_EXTRA_REG_NUM; i++) {
|
||||||
if (ei->extra_regs[i].reg_index >= EPC_1
|
if (ei->extra_regs[i].reg_index >= XT_REG_EPC_1
|
||||||
&& ei->extra_regs[i].reg_index < (EPC_1 + XCHAL_NUM_INTLEVELS)) {
|
&& ei->extra_regs[i].reg_index < (XT_REG_EPC_1 + XCHAL_NUM_INTLEVELS)) {
|
||||||
summary->ex_info.epcx[ei->extra_regs[i].reg_index - EPC_1] = ei->extra_regs[i].reg_val;
|
summary->ex_info.epcx[ei->extra_regs[i].reg_index - XT_REG_EPC_1] = ei->extra_regs[i].reg_val;
|
||||||
summary->ex_info.epcx_reg_bits |= (1 << (ei->extra_regs[i].reg_index - EPC_1));
|
summary->ex_info.epcx_reg_bits |= (1 << (ei->extra_regs[i].reg_index - XT_REG_EPC_1));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -12,7 +12,7 @@
|
|||||||
#include "xtensa/xtruntime.h"
|
#include "xtensa/xtruntime.h"
|
||||||
#include "xtensa/config/core.h"
|
#include "xtensa/config/core.h"
|
||||||
#include "xtensa/config/core-isa.h"
|
#include "xtensa/config/core-isa.h"
|
||||||
#include "xtensa/config/specreg.h"
|
#include "xtensa/config/xt_specreg.h"
|
||||||
#include "xt_instr_macros.h"
|
#include "xt_instr_macros.h"
|
||||||
#include "portbenchmark.h"
|
#include "portbenchmark.h"
|
||||||
#include "esp_macros.h"
|
#include "esp_macros.h"
|
||||||
@ -181,7 +181,7 @@ Note: XTOS_RESTORE_INTLEVEL() will overwrite entire PS register on XEA2. So we n
|
|||||||
*/
|
*/
|
||||||
#define portCLEAR_INTERRUPT_MASK(x) ({ \
|
#define portCLEAR_INTERRUPT_MASK(x) ({ \
|
||||||
unsigned int ps_reg; \
|
unsigned int ps_reg; \
|
||||||
RSR(PS, ps_reg); \
|
RSR(XT_REG_PS, ps_reg); \
|
||||||
ps_reg = (ps_reg & ~XCHAL_PS_INTLEVEL_MASK); \
|
ps_reg = (ps_reg & ~XCHAL_PS_INTLEVEL_MASK); \
|
||||||
ps_reg |= ((x << XCHAL_PS_INTLEVEL_SHIFT) & XCHAL_PS_INTLEVEL_MASK); \
|
ps_reg |= ((x << XCHAL_PS_INTLEVEL_SHIFT) & XCHAL_PS_INTLEVEL_MASK); \
|
||||||
XTOS_RESTORE_INTLEVEL(ps_reg); \
|
XTOS_RESTORE_INTLEVEL(ps_reg); \
|
||||||
@ -360,7 +360,7 @@ static inline bool IRAM_ATTR xPortCanYield(void)
|
|||||||
uint32_t ps_reg = 0;
|
uint32_t ps_reg = 0;
|
||||||
|
|
||||||
//Get the current value of PS (processor status) register
|
//Get the current value of PS (processor status) register
|
||||||
RSR(PS, ps_reg);
|
RSR(XT_REG_PS, ps_reg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* intlevel = (ps_reg & 0xf);
|
* intlevel = (ps_reg & 0xf);
|
||||||
|
@ -604,7 +604,7 @@ FORCE_INLINE_ATTR bool xPortCanYield(void)
|
|||||||
uint32_t ps_reg = 0;
|
uint32_t ps_reg = 0;
|
||||||
|
|
||||||
//Get the current value of PS (processor status) register
|
//Get the current value of PS (processor status) register
|
||||||
RSR(PS, ps_reg);
|
RSR(XT_REG_PS, ps_reg);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* intlevel = (ps_reg & 0xf);
|
* intlevel = (ps_reg & 0xf);
|
||||||
|
@ -281,7 +281,7 @@ _frxt_int_exit:
|
|||||||
* Manages the tick timer and calls xPortSysTickHandler() every tick.
|
* Manages the tick timer and calls xPortSysTickHandler() every tick.
|
||||||
* See the detailed description of the XT_RTOS_ENTER macro in xtensa_rtos.h.
|
* 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.
|
* Callable from C (obeys ABI conventions). Implemented in assembly code for performance.
|
||||||
*
|
*
|
||||||
**********************************************************************************************************
|
**********************************************************************************************************
|
||||||
*/
|
*/
|
||||||
@ -352,7 +352,7 @@ _frxt_timer_int:
|
|||||||
|
|
||||||
/* Check if we need to process more ticks to catch up. */
|
/* Check if we need to process more ticks to catch up. */
|
||||||
esync /* ensure comparator update complete */
|
esync /* ensure comparator update complete */
|
||||||
rsr a4, CCOUNT /* a4 = cycle count */
|
rsr a4, XT_REG_CCOUNT /* a4 = cycle count */
|
||||||
sub a4, a4, a3 /* diff = ccount - old comparator */
|
sub a4, a4, a3 /* diff = ccount - old comparator */
|
||||||
blt a2, a4, .L_xt_timer_int_catchup /* repeat while diff > divisor */
|
blt a2, a4, .L_xt_timer_int_catchup /* repeat while diff > divisor */
|
||||||
|
|
||||||
@ -370,7 +370,7 @@ _frxt_timer_int:
|
|||||||
* _frxt_tick_timer_init
|
* _frxt_tick_timer_init
|
||||||
* void _frxt_tick_timer_init(void)
|
* void _frxt_tick_timer_init(void)
|
||||||
*
|
*
|
||||||
* Initialize timer and timer interrrupt handler (_xt_tick_divisor_init() has already been been called).
|
* Initialize timer and timer interrupt handler (_xt_tick_divisor_init() has already been been called).
|
||||||
* Callable from C (obeys ABI conventions on entry).
|
* Callable from C (obeys ABI conventions on entry).
|
||||||
*
|
*
|
||||||
**********************************************************************************************************
|
**********************************************************************************************************
|
||||||
@ -391,7 +391,7 @@ _frxt_tick_timer_init:
|
|||||||
movi a2, _xt_tick_divisor
|
movi a2, _xt_tick_divisor
|
||||||
l32i a3, a2, 0
|
l32i a3, a2, 0
|
||||||
#endif
|
#endif
|
||||||
rsr a2, CCOUNT /* current cycle count */
|
rsr a2, XT_REG_CCOUNT /* current cycle count */
|
||||||
add a2, a2, a3 /* time of first timer interrupt */
|
add a2, a2, a3 /* time of first timer interrupt */
|
||||||
wsr a2, XT_CCOMPARE /* set the comparator */
|
wsr a2, XT_CCOMPARE /* set the comparator */
|
||||||
|
|
||||||
@ -481,7 +481,7 @@ _frxt_dispatch:
|
|||||||
rsync
|
rsync
|
||||||
#endif
|
#endif
|
||||||
/* As soons as PS is restored, interrupts can happen. No need to sync PS. */
|
/* As soons as PS is restored, interrupts can happen. No need to sync PS. */
|
||||||
wsr a3, PS
|
wsr a3, XT_REG_PS
|
||||||
#ifdef __XTENSA_CALL0_ABI__
|
#ifdef __XTENSA_CALL0_ABI__
|
||||||
addi sp, sp, XT_SOL_FRMSZ
|
addi sp, sp, XT_SOL_FRMSZ
|
||||||
ret
|
ret
|
||||||
@ -499,7 +499,7 @@ _frxt_dispatch:
|
|||||||
l32i a2, a2, 0
|
l32i a2, a2, 0
|
||||||
get_cpsa_from_tcb a2, a3 /* After this, pointer to CP save area is in a2, a3 is destroyed */
|
get_cpsa_from_tcb a2, a3 /* After this, pointer to CP save area is in a2, a3 is destroyed */
|
||||||
l16ui a3, a2, XT_CPENABLE /* CPENABLE = cp_state->cpenable; */
|
l16ui a3, a2, XT_CPENABLE /* CPENABLE = cp_state->cpenable; */
|
||||||
wsr a3, CPENABLE
|
wsr a3, XT_REG_CPENABLE
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
/* Interrupt stack frame. Restore full context and return to exit dispatcher. */
|
/* Interrupt stack frame. Restore full context and return to exit dispatcher. */
|
||||||
@ -552,7 +552,7 @@ vPortYield:
|
|||||||
entry sp, XT_SOL_FRMSZ
|
entry sp, XT_SOL_FRMSZ
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rsr a2, PS
|
rsr a2, XT_REG_PS
|
||||||
s32i a0, sp, XT_SOL_PC
|
s32i a0, sp, XT_SOL_PC
|
||||||
s32i a2, sp, XT_SOL_PS
|
s32i a2, sp, XT_SOL_PS
|
||||||
#if XCHAL_HAVE_THREADPTR
|
#if XCHAL_HAVE_THREADPTR
|
||||||
@ -571,11 +571,11 @@ vPortYield:
|
|||||||
movi a6, ~(PS_WOE_MASK|PS_INTLEVEL_MASK) /* spills a4-a7 if needed */
|
movi a6, ~(PS_WOE_MASK|PS_INTLEVEL_MASK) /* spills a4-a7 if needed */
|
||||||
and a2, a2, a6 /* clear WOE, INTLEVEL */
|
and a2, a2, a6 /* clear WOE, INTLEVEL */
|
||||||
addi a2, a2, XCHAL_EXCM_LEVEL /* set INTLEVEL */
|
addi a2, a2, XCHAL_EXCM_LEVEL /* set INTLEVEL */
|
||||||
wsr a2, PS
|
wsr a2, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
call0 xthal_window_spill_nw
|
call0 xthal_window_spill_nw
|
||||||
l32i a2, sp, XT_SOL_PS /* restore PS */
|
l32i a2, sp, XT_SOL_PS /* restore PS */
|
||||||
wsr a2, PS
|
wsr a2, XT_REG_PS
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rsil a2, XCHAL_EXCM_LEVEL /* disable low/med interrupts */
|
rsil a2, XCHAL_EXCM_LEVEL /* disable low/med interrupts */
|
||||||
@ -598,7 +598,7 @@ vPortYield:
|
|||||||
/* Clear CPENABLE, also in task's co-processor state save area. */
|
/* Clear CPENABLE, also in task's co-processor state save area. */
|
||||||
get_cpsa_from_tcb a2, a3 /* After this, pointer to CP save area is in a2, a3 is destroyed */
|
get_cpsa_from_tcb a2, a3 /* After this, pointer to CP save area is in a2, a3 is destroyed */
|
||||||
movi a3, 0
|
movi a3, 0
|
||||||
wsr a3, CPENABLE
|
wsr a3, XT_REG_CPENABLE
|
||||||
beqz a2, 1f
|
beqz a2, 1f
|
||||||
s16i a3, a2, XT_CPENABLE /* clear saved cpenable */
|
s16i a3, a2, XT_CPENABLE /* clear saved cpenable */
|
||||||
1:
|
1:
|
||||||
@ -644,10 +644,10 @@ vPortYieldFromInt:
|
|||||||
|
|
||||||
get_cpsa_from_tcb a2, a3 /* After this, pointer to CP save area is in a2, a3 is destroyed */
|
get_cpsa_from_tcb a2, a3 /* After this, pointer to CP save area is in a2, a3 is destroyed */
|
||||||
|
|
||||||
rsr a3, CPENABLE
|
rsr a3, XT_REG_CPENABLE
|
||||||
s16i a3, a2, XT_CPENABLE /* cp_state->cpenable = CPENABLE; */
|
s16i a3, a2, XT_CPENABLE /* cp_state->cpenable = CPENABLE; */
|
||||||
movi a3, 0
|
movi a3, 0
|
||||||
wsr a3, CPENABLE /* disable all co-processors */
|
wsr a3, XT_REG_CPENABLE /* disable all co-processors */
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef __XTENSA_CALL0_ABI__
|
#ifdef __XTENSA_CALL0_ABI__
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
/*
|
/*
|
||||||
* SPDX-FileCopyrightText: 2020-2022 Espressif Systems (Shanghai) CO LTD
|
* SPDX-FileCopyrightText: 2020-2025 Espressif Systems (Shanghai) CO LTD
|
||||||
*
|
*
|
||||||
* SPDX-License-Identifier: Apache-2.0
|
* SPDX-License-Identifier: Apache-2.0
|
||||||
*/
|
*/
|
||||||
@ -8,15 +8,6 @@
|
|||||||
|
|
||||||
#include <stdint.h>
|
#include <stdint.h>
|
||||||
|
|
||||||
#include "soc/soc_caps.h"
|
|
||||||
|
|
||||||
#include "xt_instr_macros.h"
|
|
||||||
#include "xtensa/config/specreg.h"
|
|
||||||
#include "xtensa/config/extreg.h"
|
|
||||||
#include "esp_bit_defs.h"
|
|
||||||
#include "esp_attr.h"
|
|
||||||
#include "xtensa/config/core.h"
|
|
||||||
|
|
||||||
#ifdef __cplusplus
|
#ifdef __cplusplus
|
||||||
extern "C" {
|
extern "C" {
|
||||||
#endif
|
#endif
|
||||||
|
@ -28,6 +28,8 @@
|
|||||||
#ifndef XTENSA_SPECREG_H
|
#ifndef XTENSA_SPECREG_H
|
||||||
#define XTENSA_SPECREG_H
|
#define XTENSA_SPECREG_H
|
||||||
|
|
||||||
|
#warning "xtensa/config/specreg.h is deprecated, please use xtensa/config/xt_specreg.h instead"
|
||||||
|
|
||||||
/* Include these special register bitfield definitions, for historical reasons: */
|
/* Include these special register bitfield definitions, for historical reasons: */
|
||||||
#include <xtensa/corebits.h>
|
#include <xtensa/corebits.h>
|
||||||
|
|
||||||
|
124
components/xtensa/esp32/include/xtensa/config/xt_specreg.h
Normal file
124
components/xtensa/esp32/include/xtensa/config/xt_specreg.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Xtensa Special Register symbolic names
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* SPDX-FileCopyrightText: 1998-2002 Tensilica Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: //depot/rel/Eaglenest/Xtensa/SWConfig/hal/specreg.h.tpp#1 $ */
|
||||||
|
|
||||||
|
/* Customer ID=11657; Build=0x5fe96; Copyright (c) 1998-2002 Tensilica 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. */
|
||||||
|
|
||||||
|
#ifndef XTENSA_XT_SPECREG_H
|
||||||
|
#define XTENSA_XT_SPECREG_H
|
||||||
|
|
||||||
|
/* Include these special register bitfield definitions, for historical reasons: */
|
||||||
|
#include <xtensa/corebits.h>
|
||||||
|
|
||||||
|
/* Special registers: */
|
||||||
|
#define XT_REG_LBEG 0
|
||||||
|
#define XT_REG_LEND 1
|
||||||
|
#define XT_REG_LCOUNT 2
|
||||||
|
#define XT_REG_SAR 3
|
||||||
|
#define XT_REG_BR 4
|
||||||
|
#define XT_REG_SCOMPARE1 12
|
||||||
|
#define XT_REG_ACCLO 16
|
||||||
|
#define XT_REG_ACCHI 17
|
||||||
|
#define XT_REG_MR_0 32
|
||||||
|
#define XT_REG_MR_1 33
|
||||||
|
#define XT_REG_MR_2 34
|
||||||
|
#define XT_REG_MR_3 35
|
||||||
|
#define XT_REG_WINDOWBASE 72
|
||||||
|
#define XT_REG_WINDOWSTART 73
|
||||||
|
#define XT_REG_IBREAKENABLE 96
|
||||||
|
#define XT_REG_MEMCTL 97
|
||||||
|
#define XT_REG_ATOMCTL 99
|
||||||
|
#define XT_REG_DDR 104
|
||||||
|
#define XT_REG_IBREAKA_0 128
|
||||||
|
#define XT_REG_IBREAKA_1 129
|
||||||
|
#define XT_REG_DBREAKA_0 144
|
||||||
|
#define XT_REG_DBREAKA_1 145
|
||||||
|
#define XT_REG_DBREAKC_0 160
|
||||||
|
#define XT_REG_DBREAKC_1 161
|
||||||
|
#define XT_REG_CONFIGID0 176
|
||||||
|
#define XT_REG_EPC_1 177
|
||||||
|
#define XT_REG_EPC_2 178
|
||||||
|
#define XT_REG_EPC_3 179
|
||||||
|
#define XT_REG_EPC_4 180
|
||||||
|
#define XT_REG_EPC_5 181
|
||||||
|
#define XT_REG_EPC_6 182
|
||||||
|
#define XT_REG_EPC_7 183
|
||||||
|
#define XT_REG_DEPC 192
|
||||||
|
#define XT_REG_EPS_2 194
|
||||||
|
#define XT_REG_EPS_3 195
|
||||||
|
#define XT_REG_EPS_4 196
|
||||||
|
#define XT_REG_EPS_5 197
|
||||||
|
#define XT_REG_EPS_6 198
|
||||||
|
#define XT_REG_EPS_7 199
|
||||||
|
#define XT_REG_CONFIGID1 208
|
||||||
|
#define XT_REG_EXCSAVE_1 209
|
||||||
|
#define XT_REG_EXCSAVE_2 210
|
||||||
|
#define XT_REG_EXCSAVE_3 211
|
||||||
|
#define XT_REG_EXCSAVE_4 212
|
||||||
|
#define XT_REG_EXCSAVE_5 213
|
||||||
|
#define XT_REG_EXCSAVE_6 214
|
||||||
|
#define XT_REG_EXCSAVE_7 215
|
||||||
|
#define XT_REG_CPENABLE 224
|
||||||
|
#define XT_REG_INTERRUPT 226
|
||||||
|
#define XT_REG_INTENABLE 228
|
||||||
|
#define XT_REG_PS 230
|
||||||
|
#define XT_REG_VECBASE 231
|
||||||
|
#define XT_REG_EXCCAUSE 232
|
||||||
|
#define XT_REG_DEBUGCAUSE 233
|
||||||
|
#define XT_REG_CCOUNT 234
|
||||||
|
#define XT_REG_PRID 235
|
||||||
|
#define XT_REG_ICOUNT 236
|
||||||
|
#define XT_REG_ICOUNTLEVEL 237
|
||||||
|
#define XT_REG_EXCVADDR 238
|
||||||
|
#define XT_REG_CCOMPARE_0 240
|
||||||
|
#define XT_REG_CCOMPARE_1 241
|
||||||
|
#define XT_REG_CCOMPARE_2 242
|
||||||
|
#define XT_REG_MISC_REG_0 244
|
||||||
|
#define XT_REG_MISC_REG_1 245
|
||||||
|
#define XT_REG_MISC_REG_2 246
|
||||||
|
#define XT_REG_MISC_REG_3 247
|
||||||
|
|
||||||
|
/* Special cases (bases of special register series): */
|
||||||
|
#define XT_REG_MR 32
|
||||||
|
#define XT_REG_IBREAKA 128
|
||||||
|
#define XT_REG_DBREAKA 144
|
||||||
|
#define XT_REG_DBREAKC 160
|
||||||
|
#define XT_REG_EPC 176
|
||||||
|
#define XT_REG_EPS 192
|
||||||
|
#define XT_REG_EXCSAVE 208
|
||||||
|
#define XT_REG_CCOMPARE 240
|
||||||
|
|
||||||
|
/* Special names for read-only and write-only interrupt registers: */
|
||||||
|
#define XT_REG_INTREAD 226
|
||||||
|
#define XT_REG_INTSET 226
|
||||||
|
#define XT_REG_INTCLEAR 227
|
||||||
|
|
||||||
|
#endif /* XTENSA_XT_SPECREG_H */
|
@ -28,6 +28,8 @@
|
|||||||
#ifndef XTENSA_SPECREG_H
|
#ifndef XTENSA_SPECREG_H
|
||||||
#define XTENSA_SPECREG_H
|
#define XTENSA_SPECREG_H
|
||||||
|
|
||||||
|
#warning "xtensa/config/specreg.h is deprecated, please use xtensa/config/xt_specreg.h instead"
|
||||||
|
|
||||||
/* Include these special register bitfield definitions, for historical reasons: */
|
/* Include these special register bitfield definitions, for historical reasons: */
|
||||||
#include <xtensa/corebits.h>
|
#include <xtensa/corebits.h>
|
||||||
|
|
||||||
|
110
components/xtensa/esp32s2/include/xtensa/config/xt_specreg.h
Normal file
110
components/xtensa/esp32s2/include/xtensa/config/xt_specreg.h
Normal file
@ -0,0 +1,110 @@
|
|||||||
|
/*
|
||||||
|
* Xtensa Special Register symbolic names
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* SPDX-FileCopyrightText: 1998-2002 Tensilica Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: //depot/rel/Foxhill/dot.8/Xtensa/SWConfig/hal/specreg.h.tpp#1 $ */
|
||||||
|
|
||||||
|
/* Copyright (c) 1998-2002 Tensilica 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. */
|
||||||
|
|
||||||
|
#ifndef XTENSA_XT_SPECREG_H
|
||||||
|
#define XTENSA_XT_SPECREG_H
|
||||||
|
|
||||||
|
/* Include these special register bitfield definitions, for historical reasons: */
|
||||||
|
#include <xtensa/corebits.h>
|
||||||
|
|
||||||
|
/* Special registers: */
|
||||||
|
#define XT_REG_SAR 3
|
||||||
|
#define XT_REG_WINDOWBASE 72
|
||||||
|
#define XT_REG_WINDOWSTART 73
|
||||||
|
#define XT_REG_IBREAKENABLE 96
|
||||||
|
#define XT_REG_DDR 104
|
||||||
|
#define XT_REG_IBREAKA_0 128
|
||||||
|
#define XT_REG_IBREAKA_1 129
|
||||||
|
#define XT_REG_DBREAKA_0 144
|
||||||
|
#define XT_REG_DBREAKA_1 145
|
||||||
|
#define XT_REG_DBREAKC_0 160
|
||||||
|
#define XT_REG_DBREAKC_1 161
|
||||||
|
#define XT_REG_CONFIGID0 176
|
||||||
|
#define XT_REG_EPC_1 177
|
||||||
|
#define XT_REG_EPC_2 178
|
||||||
|
#define XT_REG_EPC_3 179
|
||||||
|
#define XT_REG_EPC_4 180
|
||||||
|
#define XT_REG_EPC_5 181
|
||||||
|
#define XT_REG_EPC_6 182
|
||||||
|
#define XT_REG_EPC_7 183
|
||||||
|
#define XT_REG_DEPC 192
|
||||||
|
#define XT_REG_EPS_2 194
|
||||||
|
#define XT_REG_EPS_3 195
|
||||||
|
#define XT_REG_EPS_4 196
|
||||||
|
#define XT_REG_EPS_5 197
|
||||||
|
#define XT_REG_EPS_6 198
|
||||||
|
#define XT_REG_EPS_7 199
|
||||||
|
#define XT_REG_CONFIGID1 208
|
||||||
|
#define XT_REG_EXCSAVE_1 209
|
||||||
|
#define XT_REG_EXCSAVE_2 210
|
||||||
|
#define XT_REG_EXCSAVE_3 211
|
||||||
|
#define XT_REG_EXCSAVE_4 212
|
||||||
|
#define XT_REG_EXCSAVE_5 213
|
||||||
|
#define XT_REG_EXCSAVE_6 214
|
||||||
|
#define XT_REG_EXCSAVE_7 215
|
||||||
|
#define XT_REG_CPENABLE 224
|
||||||
|
#define XT_REG_INTERRUPT 226
|
||||||
|
#define XT_REG_INTENABLE 228
|
||||||
|
#define XT_REG_PS 230
|
||||||
|
#define XT_REG_VECBASE 231
|
||||||
|
#define XT_REG_EXCCAUSE 232
|
||||||
|
#define XT_REG_DEBUGCAUSE 233
|
||||||
|
#define XT_REG_CCOUNT 234
|
||||||
|
#define XT_REG_PRID 235
|
||||||
|
#define XT_REG_ICOUNT 236
|
||||||
|
#define XT_REG_ICOUNTLEVEL 237
|
||||||
|
#define XT_REG_EXCVADDR 238
|
||||||
|
#define XT_REG_CCOMPARE_0 240
|
||||||
|
#define XT_REG_CCOMPARE_1 241
|
||||||
|
#define XT_REG_CCOMPARE_2 242
|
||||||
|
#define XT_REG_MISC_REG_0 244
|
||||||
|
#define XT_REG_MISC_REG_1 245
|
||||||
|
#define XT_REG_MISC_REG_2 246
|
||||||
|
#define XT_REG_MISC_REG_3 247
|
||||||
|
|
||||||
|
/* Special cases (bases of special register series): */
|
||||||
|
#define XT_REG_IBREAKA 128
|
||||||
|
#define XT_REG_DBREAKA 144
|
||||||
|
#define XT_REG_DBREAKC 160
|
||||||
|
#define XT_REG_EPC 176
|
||||||
|
#define XT_REG_EPS 192
|
||||||
|
#define XT_REG_EXCSAVE 208
|
||||||
|
#define XT_REG_CCOMPARE 240
|
||||||
|
|
||||||
|
/* Special names for read-only and write-only interrupt registers: */
|
||||||
|
#define XT_REG_INTREAD 226
|
||||||
|
#define XT_REG_INTSET 226
|
||||||
|
#define XT_REG_INTCLEAR 227
|
||||||
|
|
||||||
|
#endif /* XTENSA_XT_SPECREG_H */
|
@ -28,6 +28,8 @@
|
|||||||
#ifndef XTENSA_SPECREG_H
|
#ifndef XTENSA_SPECREG_H
|
||||||
#define XTENSA_SPECREG_H
|
#define XTENSA_SPECREG_H
|
||||||
|
|
||||||
|
#warning "xtensa/config/specreg.h is deprecated, please use xtensa/config/xt_specreg.h instead"
|
||||||
|
|
||||||
/* Include these special register bitfield definitions, for historical reasons: */
|
/* Include these special register bitfield definitions, for historical reasons: */
|
||||||
#include <xtensa/corebits.h>
|
#include <xtensa/corebits.h>
|
||||||
|
|
||||||
|
124
components/xtensa/esp32s3/include/xtensa/config/xt_specreg.h
Normal file
124
components/xtensa/esp32s3/include/xtensa/config/xt_specreg.h
Normal file
@ -0,0 +1,124 @@
|
|||||||
|
/*
|
||||||
|
* Xtensa Special Register symbolic names
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* SPDX-FileCopyrightText: 1998-2002 Tensilica Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: //depot/rel/Foxhill/dot.12/Xtensa/SWConfig/hal/specreg.h.tpp#1 $ */
|
||||||
|
|
||||||
|
/* Customer ID=15128; Build=0x90f1f; Copyright (c) 1998-2002 Tensilica 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. */
|
||||||
|
|
||||||
|
#ifndef XTENSA_XT_SPECREG_H
|
||||||
|
#define XTENSA_XT_SPECREG_H
|
||||||
|
|
||||||
|
/* Include these special register bitfield definitions, for historical reasons: */
|
||||||
|
#include <xtensa/corebits.h>
|
||||||
|
|
||||||
|
/* Special registers: */
|
||||||
|
#define XT_REG_LBEG 0
|
||||||
|
#define XT_REG_LEND 1
|
||||||
|
#define XT_REG_LCOUNT 2
|
||||||
|
#define XT_REG_SAR 3
|
||||||
|
#define XT_REG_BR 4
|
||||||
|
#define XT_REG_SCOMPARE1 12
|
||||||
|
#define XT_REG_ACCLO 16
|
||||||
|
#define XT_REG_ACCHI 17
|
||||||
|
#define XT_REG_MR_0 32
|
||||||
|
#define XT_REG_MR_1 33
|
||||||
|
#define XT_REG_MR_2 34
|
||||||
|
#define XT_REG_MR_3 35
|
||||||
|
#define XT_REG_WINDOWBASE 72
|
||||||
|
#define XT_REG_WINDOWSTART 73
|
||||||
|
#define XT_REG_IBREAKENABLE 96
|
||||||
|
#define XT_REG_MEMCTL 97
|
||||||
|
#define XT_REG_ATOMCTL 99
|
||||||
|
#define XT_REG_DDR 104
|
||||||
|
#define XT_REG_IBREAKA_0 128
|
||||||
|
#define XT_REG_IBREAKA_1 129
|
||||||
|
#define XT_REG_DBREAKA_0 144
|
||||||
|
#define XT_REG_DBREAKA_1 145
|
||||||
|
#define XT_REG_DBREAKC_0 160
|
||||||
|
#define XT_REG_DBREAKC_1 161
|
||||||
|
#define XT_REG_CONFIGID0 176
|
||||||
|
#define XT_REG_EPC_1 177
|
||||||
|
#define XT_REG_EPC_2 178
|
||||||
|
#define XT_REG_EPC_3 179
|
||||||
|
#define XT_REG_EPC_4 180
|
||||||
|
#define XT_REG_EPC_5 181
|
||||||
|
#define XT_REG_EPC_6 182
|
||||||
|
#define XT_REG_EPC_7 183
|
||||||
|
#define XT_REG_DEPC 192
|
||||||
|
#define XT_REG_EPS_2 194
|
||||||
|
#define XT_REG_EPS_3 195
|
||||||
|
#define XT_REG_EPS_4 196
|
||||||
|
#define XT_REG_EPS_5 197
|
||||||
|
#define XT_REG_EPS_6 198
|
||||||
|
#define XT_REG_EPS_7 199
|
||||||
|
#define XT_REG_CONFIGID1 208
|
||||||
|
#define XT_REG_EXCSAVE_1 209
|
||||||
|
#define XT_REG_EXCSAVE_2 210
|
||||||
|
#define XT_REG_EXCSAVE_3 211
|
||||||
|
#define XT_REG_EXCSAVE_4 212
|
||||||
|
#define XT_REG_EXCSAVE_5 213
|
||||||
|
#define XT_REG_EXCSAVE_6 214
|
||||||
|
#define XT_REG_EXCSAVE_7 215
|
||||||
|
#define XT_REG_CPENABLE 224
|
||||||
|
#define XT_REG_INTERRUPT 226
|
||||||
|
#define XT_REG_INTENABLE 228
|
||||||
|
#define XT_REG_PS 230
|
||||||
|
#define XT_REG_VECBASE 231
|
||||||
|
#define XT_REG_EXCCAUSE 232
|
||||||
|
#define XT_REG_DEBUGCAUSE 233
|
||||||
|
#define XT_REG_CCOUNT 234
|
||||||
|
#define XT_REG_PRID 235
|
||||||
|
#define XT_REG_ICOUNT 236
|
||||||
|
#define XT_REG_ICOUNTLEVEL 237
|
||||||
|
#define XT_REG_EXCVADDR 238
|
||||||
|
#define XT_REG_CCOMPARE_0 240
|
||||||
|
#define XT_REG_CCOMPARE_1 241
|
||||||
|
#define XT_REG_CCOMPARE_2 242
|
||||||
|
#define XT_REG_MISC_REG_0 244
|
||||||
|
#define XT_REG_MISC_REG_1 245
|
||||||
|
#define XT_REG_MISC_REG_2 246
|
||||||
|
#define XT_REG_MISC_REG_3 247
|
||||||
|
|
||||||
|
/* Special cases (bases of special register series): */
|
||||||
|
#define XT_REG_MR 32
|
||||||
|
#define XT_REG_IBREAKA 128
|
||||||
|
#define XT_REG_DBREAKA 144
|
||||||
|
#define XT_REG_DBREAKC 160
|
||||||
|
#define XT_REG_EPC 176
|
||||||
|
#define XT_REG_EPS 192
|
||||||
|
#define XT_REG_EXCSAVE 208
|
||||||
|
#define XT_REG_CCOMPARE 240
|
||||||
|
|
||||||
|
/* Special names for read-only and write-only interrupt registers: */
|
||||||
|
#define XT_REG_INTREAD 226
|
||||||
|
#define XT_REG_INTSET 226
|
||||||
|
#define XT_REG_INTCLEAR 227
|
||||||
|
|
||||||
|
#endif /* XTENSA_XT_SPECREG_H */
|
@ -77,7 +77,7 @@
|
|||||||
Macro spinlock_take
|
Macro spinlock_take
|
||||||
|
|
||||||
This macro will repeatedley attempt to atomically set a spinlock variable
|
This macro will repeatedley attempt to atomically set a spinlock variable
|
||||||
using the s32c1i instruciton. A spinlock is considered free if its value is 0.
|
using the s32c1i instruction. A spinlock is considered free if its value is 0.
|
||||||
|
|
||||||
Entry:
|
Entry:
|
||||||
- "reg_A/B" as scratch registers
|
- "reg_A/B" as scratch registers
|
||||||
@ -96,9 +96,9 @@
|
|||||||
movi \reg_A, \lock_var /* reg_A = &lock_var */
|
movi \reg_A, \lock_var /* reg_A = &lock_var */
|
||||||
.L_spinlock_loop:
|
.L_spinlock_loop:
|
||||||
movi \reg_B, 0 /* Load spinlock free value (0) into SCOMPARE1 */
|
movi \reg_B, 0 /* Load spinlock free value (0) into SCOMPARE1 */
|
||||||
wsr \reg_B, SCOMPARE1
|
wsr \reg_B, XT_REG_SCOMPARE1
|
||||||
rsync /* Ensure that SCOMPARE1 is set before s32c1i executes */
|
rsync /* Ensure that SCOMPARE1 is set before s32c1i executes */
|
||||||
rsr \reg_B, PRID /* Load the current core's ID into reg_B */
|
rsr \reg_B, XT_REG_PRID /* Load the current core's ID into reg_B */
|
||||||
s32c1i \reg_B, \reg_A, 0 /* Attempt *lock_var = reg_B */
|
s32c1i \reg_B, \reg_A, 0 /* Attempt *lock_var = reg_B */
|
||||||
bnez \reg_B, .L_spinlock_loop /* If the write was successful (i.e., lock was free), 0 will have been written back to reg_B */
|
bnez \reg_B, .L_spinlock_loop /* If the write was successful (i.e., lock was free), 0 will have been written back to reg_B */
|
||||||
|
|
||||||
|
@ -11,7 +11,7 @@
|
|||||||
#include "xtensa/config/core-isa.h"
|
#include "xtensa/config/core-isa.h"
|
||||||
#include "xtensa/config/core.h"
|
#include "xtensa/config/core.h"
|
||||||
#include "xtensa/config/extreg.h"
|
#include "xtensa/config/extreg.h"
|
||||||
#include "xtensa/config/specreg.h"
|
#include "xtensa/config/xt_specreg.h"
|
||||||
#include "xtensa/xtruntime.h"
|
#include "xtensa/xtruntime.h"
|
||||||
#include "xt_instr_macros.h"
|
#include "xt_instr_macros.h"
|
||||||
#include "esp_bit_defs.h"
|
#include "esp_bit_defs.h"
|
||||||
@ -68,13 +68,13 @@ FORCE_INLINE_ATTR void *xt_utils_get_sp(void)
|
|||||||
FORCE_INLINE_ATTR uint32_t xt_utils_get_cycle_count(void)
|
FORCE_INLINE_ATTR uint32_t xt_utils_get_cycle_count(void)
|
||||||
{
|
{
|
||||||
uint32_t ccount;
|
uint32_t ccount;
|
||||||
RSR(CCOUNT, ccount);
|
RSR(XT_REG_CCOUNT, ccount);
|
||||||
return ccount;
|
return ccount;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline void xt_utils_set_cycle_count(uint32_t ccount)
|
static inline void xt_utils_set_cycle_count(uint32_t ccount)
|
||||||
{
|
{
|
||||||
WSR(CCOUNT, ccount);
|
WSR(XT_REG_CCOUNT, ccount);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE_ATTR void xt_utils_wait_for_intr(void)
|
FORCE_INLINE_ATTR void xt_utils_wait_for_intr(void)
|
||||||
@ -100,7 +100,7 @@ FORCE_INLINE_ATTR void xt_utils_set_vecbase(uint32_t vecbase)
|
|||||||
FORCE_INLINE_ATTR uint32_t xt_utils_intr_get_enabled_mask(void)
|
FORCE_INLINE_ATTR uint32_t xt_utils_intr_get_enabled_mask(void)
|
||||||
{
|
{
|
||||||
uint32_t intr_mask;
|
uint32_t intr_mask;
|
||||||
RSR(INTENABLE, intr_mask);
|
RSR(XT_REG_INTENABLE, intr_mask);
|
||||||
return intr_mask;
|
return intr_mask;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -118,30 +118,30 @@ FORCE_INLINE_ATTR void xt_utils_set_breakpoint(int bp_num, uint32_t bp_addr)
|
|||||||
{
|
{
|
||||||
//Set the breakpoint's address
|
//Set the breakpoint's address
|
||||||
if (bp_num == 1) {
|
if (bp_num == 1) {
|
||||||
WSR(IBREAKA_1, bp_addr);
|
WSR(XT_REG_IBREAKA_1, bp_addr);
|
||||||
} else {
|
} else {
|
||||||
WSR(IBREAKA_0, bp_addr);
|
WSR(XT_REG_IBREAKA_0, bp_addr);
|
||||||
}
|
}
|
||||||
//Enable the breakpoint
|
//Enable the breakpoint
|
||||||
uint32_t brk_ena_reg;
|
uint32_t brk_ena_reg;
|
||||||
RSR(IBREAKENABLE, brk_ena_reg);
|
RSR(XT_REG_IBREAKENABLE, brk_ena_reg);
|
||||||
brk_ena_reg |= BIT(bp_num);
|
brk_ena_reg |= BIT(bp_num);
|
||||||
WSR(IBREAKENABLE, brk_ena_reg);
|
WSR(XT_REG_IBREAKENABLE, brk_ena_reg);
|
||||||
}
|
}
|
||||||
|
|
||||||
FORCE_INLINE_ATTR void xt_utils_clear_breakpoint(int bp_num)
|
FORCE_INLINE_ATTR void xt_utils_clear_breakpoint(int bp_num)
|
||||||
{
|
{
|
||||||
// Disable the breakpoint using the break enable register
|
// Disable the breakpoint using the break enable register
|
||||||
uint32_t bp_en = 0;
|
uint32_t bp_en = 0;
|
||||||
RSR(IBREAKENABLE, bp_en);
|
RSR(XT_REG_IBREAKENABLE, bp_en);
|
||||||
bp_en &= ~BIT(bp_num);
|
bp_en &= ~BIT(bp_num);
|
||||||
WSR(IBREAKENABLE, bp_en);
|
WSR(XT_REG_IBREAKENABLE, bp_en);
|
||||||
// Zero the break address register
|
// Zero the break address register
|
||||||
uint32_t bp_addr = 0;
|
uint32_t bp_addr = 0;
|
||||||
if (bp_num == 1) {
|
if (bp_num == 1) {
|
||||||
WSR(IBREAKA_1, bp_addr);
|
WSR(XT_REG_IBREAKA_1, bp_addr);
|
||||||
} else {
|
} else {
|
||||||
WSR(IBREAKA_0, bp_addr);
|
WSR(XT_REG_IBREAKA_0, bp_addr);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -163,11 +163,11 @@ FORCE_INLINE_ATTR void xt_utils_set_watchpoint(int wp_num,
|
|||||||
}
|
}
|
||||||
// Enable break address and break control register
|
// Enable break address and break control register
|
||||||
if (wp_num == 1) {
|
if (wp_num == 1) {
|
||||||
WSR(DBREAKA_1, (uint32_t) wp_addr);
|
WSR(XT_REG_DBREAKA_1, (uint32_t) wp_addr);
|
||||||
WSR(DBREAKC_1, dbreakc_reg);
|
WSR(XT_REG_DBREAKC_1, dbreakc_reg);
|
||||||
} else {
|
} else {
|
||||||
WSR(DBREAKA_0, (uint32_t) wp_addr);
|
WSR(XT_REG_DBREAKA_0, (uint32_t) wp_addr);
|
||||||
WSR(DBREAKC_0, dbreakc_reg);
|
WSR(XT_REG_DBREAKC_0, dbreakc_reg);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -175,11 +175,11 @@ FORCE_INLINE_ATTR void xt_utils_clear_watchpoint(int wp_num)
|
|||||||
{
|
{
|
||||||
// Clear both break control and break address register
|
// Clear both break control and break address register
|
||||||
if (wp_num == 1) {
|
if (wp_num == 1) {
|
||||||
WSR(DBREAKC_1, 0);
|
WSR(XT_REG_DBREAKC_1, 0);
|
||||||
WSR(DBREAKA_1, 0);
|
WSR(XT_REG_DBREAKA_1, 0);
|
||||||
} else {
|
} else {
|
||||||
WSR(DBREAKC_0, 0);
|
WSR(XT_REG_DBREAKC_0, 0);
|
||||||
WSR(DBREAKA_0, 0);
|
WSR(XT_REG_DBREAKA_0, 0);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -50,7 +50,7 @@
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
#include <xtensa/config/core.h>
|
#include <xtensa/config/core.h>
|
||||||
#include <xtensa/config/specreg.h>
|
#include <xtensa/config/xt_specreg.h>
|
||||||
#include <xtensa/config/system.h>
|
#include <xtensa/config/system.h>
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
@ -30,6 +30,8 @@
|
|||||||
#ifndef XTENSA_SPECREG_H
|
#ifndef XTENSA_SPECREG_H
|
||||||
#define XTENSA_SPECREG_H
|
#define XTENSA_SPECREG_H
|
||||||
|
|
||||||
|
#warning "xtensa/specreg.h is deprecated, please use xtensa/xt_specreg.h instead"
|
||||||
|
|
||||||
/* Special registers: */
|
/* Special registers: */
|
||||||
#define LBEG 0
|
#define LBEG 0
|
||||||
#define LEND 1
|
#define LEND 1
|
||||||
|
150
components/xtensa/include/xtensa/xt_specreg.h
Normal file
150
components/xtensa/include/xtensa/xt_specreg.h
Normal file
@ -0,0 +1,150 @@
|
|||||||
|
/*
|
||||||
|
* Xtensa Special Register symbolic names
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* SPDX-FileCopyrightText: 2005-2011 Tensilica Inc.
|
||||||
|
*
|
||||||
|
* SPDX-License-Identifier: MIT
|
||||||
|
*
|
||||||
|
* SPDX-FileContributor: 2025 Espressif Systems (Shanghai) CO LTD
|
||||||
|
*/
|
||||||
|
|
||||||
|
/* $Id: //depot/rel/Foxhill/dot.9/Xtensa/OS/include/xtensa/specreg.h#1 $ */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* Copyright (c) 2005-2011 Tensilica 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.
|
||||||
|
*/
|
||||||
|
|
||||||
|
#ifndef XTENSA_XT_SPECREG_H
|
||||||
|
#define XTENSA_XT_SPECREG_H
|
||||||
|
|
||||||
|
/* Special registers: */
|
||||||
|
#define XT_REG_LBEG 0
|
||||||
|
#define XT_REG_LEND 1
|
||||||
|
#define XT_REG_LCOUNT 2
|
||||||
|
#define XT_REG_SAR 3
|
||||||
|
#define XT_REG_BR 4
|
||||||
|
#define XT_REG_LITBASE 5
|
||||||
|
#define XT_REG_SCOMPARE1 12
|
||||||
|
#define XT_REG_ACCLO 16
|
||||||
|
#define XT_REG_ACCHI 17
|
||||||
|
#define XT_REG_MR_0 32
|
||||||
|
#define XT_REG_MR_1 33
|
||||||
|
#define XT_REG_MR_2 34
|
||||||
|
#define XT_REG_MR_3 35
|
||||||
|
#define XT_REG_PREFCTL 40
|
||||||
|
#define XT_REG_WINDOWBASE 72
|
||||||
|
#define XT_REG_WINDOWSTART 73
|
||||||
|
#define XT_REG_PTEVADDR 83
|
||||||
|
#define XT_REG_RASID 90
|
||||||
|
#define XT_REG_ITLBCFG 91
|
||||||
|
#define XT_REG_DTLBCFG 92
|
||||||
|
#define XT_REG_IBREAKENABLE 96
|
||||||
|
#define XT_REG_MEMCTL 97
|
||||||
|
#define XT_REG_CACHEATTR 98 /* until T1050, XEA1 */
|
||||||
|
#define XT_REG_CACHEADRDIS 98 /* LX7+ */
|
||||||
|
#define XT_REG_ATOMCTL 99
|
||||||
|
#define XT_REG_DDR 104
|
||||||
|
#define XT_REG_MECR 110
|
||||||
|
#define XT_REG_IBREAKA_0 128
|
||||||
|
#define XT_REG_IBREAKA_1 129
|
||||||
|
#define XT_REG_DBREAKA_0 144
|
||||||
|
#define XT_REG_DBREAKA_1 145
|
||||||
|
#define XT_REG_DBREAKC_0 160
|
||||||
|
#define XT_REG_DBREAKC_1 161
|
||||||
|
#define XT_REG_CONFIGID0 176
|
||||||
|
#define XT_REG_EPC_1 177
|
||||||
|
#define XT_REG_EPC_2 178
|
||||||
|
#define XT_REG_EPC_3 179
|
||||||
|
#define XT_REG_EPC_4 180
|
||||||
|
#define XT_REG_EPC_5 181
|
||||||
|
#define XT_REG_EPC_6 182
|
||||||
|
#define XT_REG_EPC_7 183
|
||||||
|
#define XT_REG_DEPC 192
|
||||||
|
#define XT_REG_EPS_2 194
|
||||||
|
#define XT_REG_EPS_3 195
|
||||||
|
#define XT_REG_EPS_4 196
|
||||||
|
#define XT_REG_EPS_5 197
|
||||||
|
#define XT_REG_EPS_6 198
|
||||||
|
#define XT_REG_EPS_7 199
|
||||||
|
#define XT_REG_CONFIGID1 208
|
||||||
|
#define XT_REG_EXCSAVE_1 209
|
||||||
|
#define XT_REG_EXCSAVE_2 210
|
||||||
|
#define XT_REG_EXCSAVE_3 211
|
||||||
|
#define XT_REG_EXCSAVE_4 212
|
||||||
|
#define XT_REG_EXCSAVE_5 213
|
||||||
|
#define XT_REG_EXCSAVE_6 214
|
||||||
|
#define XT_REG_EXCSAVE_7 215
|
||||||
|
#define XT_REG_CPENABLE 224
|
||||||
|
#define XT_REG_INTERRUPT 226
|
||||||
|
#define XT_REG_INTREAD INTERRUPT /* alternate name for backward compatibility */
|
||||||
|
#define XT_REG_INTSET INTERRUPT /* alternate name for backward compatibility */
|
||||||
|
#define XT_REG_INTCLEAR 227
|
||||||
|
#define XT_REG_INTENABLE 228
|
||||||
|
#define XT_REG_PS 230
|
||||||
|
#define XT_REG_VECBASE 231
|
||||||
|
#define XT_REG_EXCCAUSE 232
|
||||||
|
#define XT_REG_DEBUGCAUSE 233
|
||||||
|
#define XT_REG_CCOUNT 234
|
||||||
|
#define XT_REG_PRID 235
|
||||||
|
#define XT_REG_ICOUNT 236
|
||||||
|
#define XT_REG_ICOUNTLEVEL 237
|
||||||
|
#define XT_REG_EXCVADDR 238
|
||||||
|
#define XT_REG_CCOMPARE_0 240
|
||||||
|
#define XT_REG_CCOMPARE_1 241
|
||||||
|
#define XT_REG_CCOMPARE_2 242
|
||||||
|
#define XT_REG_MISC_REG_0 244
|
||||||
|
#define XT_REG_MISC_REG_1 245
|
||||||
|
#define XT_REG_MISC_REG_2 246
|
||||||
|
#define XT_REG_MISC_REG_3 247
|
||||||
|
|
||||||
|
/* Special cases (bases of special register series): */
|
||||||
|
#define XT_REG_MR 32
|
||||||
|
#define XT_REG_IBREAKA 128
|
||||||
|
#define XT_REG_DBREAKA 144
|
||||||
|
#define XT_REG_DBREAKC 160
|
||||||
|
#define XT_REG_EPC 176
|
||||||
|
#define XT_REG_EPS 192
|
||||||
|
#define XT_REG_EXCSAVE 208
|
||||||
|
#define XT_REG_CCOMPARE 240
|
||||||
|
#define XT_REG_MISC_REG 244
|
||||||
|
|
||||||
|
/* Tensilica-defined user registers: */
|
||||||
|
#if 0
|
||||||
|
/*#define ... 21..24 */ /* (545CK) */
|
||||||
|
/*#define ... 140..143 */ /* (545CK) */
|
||||||
|
#define XT_REG_EXPSTATE 230 /* Diamond */
|
||||||
|
#define XT_REG_THREADPTR 231 /* threadptr option */
|
||||||
|
#define XT_REG_FCR 232 /* FPU */
|
||||||
|
#define XT_REG_FSR 233 /* FPU */
|
||||||
|
#define XT_REG_AE_OVF_SAR 240 /* HiFi2 */
|
||||||
|
#define XT_REG_AE_BITHEAD 241 /* HiFi2 */
|
||||||
|
#define XT_REG_AE_TS_FTS_BU_BP 242 /* HiFi2 */
|
||||||
|
#define XT_REG_AE_SD_NO 243 /* HiFi2 */
|
||||||
|
#define XT_REG_VSAR 240 /* VectraLX */
|
||||||
|
#define XT_REG_ROUND_LO 242 /* VectraLX */
|
||||||
|
#define XT_REG_ROUND_HI 243 /* VectraLX */
|
||||||
|
#define XT_REG_CBEGIN 246 /* VectraLX */
|
||||||
|
#define XT_REG_CEND 247 /* VectraLX */
|
||||||
|
#endif
|
||||||
|
|
||||||
|
#endif /* XTENSA_XT_SPECREG_H */
|
@ -27,7 +27,7 @@
|
|||||||
#define XTRUNTIME_H
|
#define XTRUNTIME_H
|
||||||
|
|
||||||
#include <xtensa/config/core.h>
|
#include <xtensa/config/core.h>
|
||||||
#include <xtensa/config/specreg.h>
|
#include <xtensa/config/xt_specreg.h>
|
||||||
#include <xtensa/xtruntime-core-state.h>
|
#include <xtensa/xtruntime-core-state.h>
|
||||||
|
|
||||||
#ifndef XTSTR
|
#ifndef XTSTR
|
||||||
|
@ -100,7 +100,7 @@ Otherwise select the first low or medium priority interrupt timer available.
|
|||||||
#error "There is no suitable timer in this Xtensa configuration."
|
#error "There is no suitable timer in this Xtensa configuration."
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#define XT_CCOMPARE (CCOMPARE + XT_TIMER_INDEX)
|
#define XT_CCOMPARE (XT_REG_CCOMPARE + XT_TIMER_INDEX)
|
||||||
#define XT_TIMER_INTNUM XCHAL_TIMER_INTERRUPT(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_INTPRI XCHAL_INT_LEVEL(XT_TIMER_INTNUM)
|
||||||
#define XT_TIMER_INTEN (1 << XT_TIMER_INTNUM)
|
#define XT_TIMER_INTEN (1 << XT_TIMER_INTNUM)
|
||||||
|
@ -127,15 +127,15 @@ _xt_context_save:
|
|||||||
s32i a15, sp, XT_STK_A15
|
s32i a15, sp, XT_STK_A15
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rsr a3, SAR
|
rsr a3, XT_REG_SAR
|
||||||
s32i a3, sp, XT_STK_SAR
|
s32i a3, sp, XT_STK_SAR
|
||||||
|
|
||||||
#if XCHAL_HAVE_LOOPS
|
#if XCHAL_HAVE_LOOPS
|
||||||
rsr a3, LBEG
|
rsr a3, XT_REG_LBEG
|
||||||
s32i a3, sp, XT_STK_LBEG
|
s32i a3, sp, XT_STK_LBEG
|
||||||
rsr a3, LEND
|
rsr a3, XT_REG_LEND
|
||||||
s32i a3, sp, XT_STK_LEND
|
s32i a3, sp, XT_STK_LEND
|
||||||
rsr a3, LCOUNT
|
rsr a3, XT_REG_LCOUNT
|
||||||
s32i a3, sp, XT_STK_LCOUNT
|
s32i a3, sp, XT_STK_LCOUNT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -188,7 +188,7 @@ _xt_context_save:
|
|||||||
* used as a temporary by this code, the temporary value would get stored
|
* used as a temporary by this code, the temporary value would get stored
|
||||||
* onto the stack, instead of the real value.
|
* onto the stack, instead of the real value.
|
||||||
*/
|
*/
|
||||||
rsr a2, PS /* to be restored after SPILL_ALL_WINDOWS */
|
rsr a2, XT_REG_PS /* to be restored after SPILL_ALL_WINDOWS */
|
||||||
movi a0, PS_INTLEVEL_MASK
|
movi a0, PS_INTLEVEL_MASK
|
||||||
and a3, a2, a0 /* get the current INTLEVEL */
|
and a3, a2, a0 /* get the current INTLEVEL */
|
||||||
bgeui a3, XCHAL_EXCM_LEVEL, 1f /* calculate max(INTLEVEL, XCHAL_EXCM_LEVEL) */
|
bgeui a3, XCHAL_EXCM_LEVEL, 1f /* calculate max(INTLEVEL, XCHAL_EXCM_LEVEL) */
|
||||||
@ -203,7 +203,7 @@ _xt_context_save:
|
|||||||
SPILL_ALL_WINDOWS /* place the live register windows there */
|
SPILL_ALL_WINDOWS /* place the live register windows there */
|
||||||
addi sp, sp, -XT_STK_FRMSZ /* return the current stack pointer and proceed with context save*/
|
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 */
|
wsr a2, XT_REG_PS /* restore to the value at entry */
|
||||||
rsync
|
rsync
|
||||||
wsr a0, EPC1 /* likewise */
|
wsr a0, EPC1 /* likewise */
|
||||||
|
|
||||||
@ -274,10 +274,10 @@ _xt_context_restore:
|
|||||||
#if XCHAL_HAVE_LOOPS
|
#if XCHAL_HAVE_LOOPS
|
||||||
l32i a2, sp, XT_STK_LBEG
|
l32i a2, sp, XT_STK_LBEG
|
||||||
l32i a3, sp, XT_STK_LEND
|
l32i a3, sp, XT_STK_LEND
|
||||||
wsr a2, LBEG
|
wsr a2, XT_REG_LBEG
|
||||||
l32i a2, sp, XT_STK_LCOUNT
|
l32i a2, sp, XT_STK_LCOUNT
|
||||||
wsr a3, LEND
|
wsr a3, XT_REG_LEND
|
||||||
wsr a2, LCOUNT
|
wsr a2, XT_REG_LCOUNT
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef XT_USE_OVLY
|
#ifdef XT_USE_OVLY
|
||||||
@ -309,7 +309,7 @@ _xt_context_restore:
|
|||||||
|
|
||||||
l32i a3, sp, XT_STK_SAR
|
l32i a3, sp, XT_STK_SAR
|
||||||
l32i a2, sp, XT_STK_A2
|
l32i a2, sp, XT_STK_A2
|
||||||
wsr a3, SAR
|
wsr a3, XT_REG_SAR
|
||||||
l32i a3, sp, XT_STK_A3
|
l32i a3, sp, XT_STK_A3
|
||||||
l32i a4, sp, XT_STK_A4
|
l32i a4, sp, XT_STK_A4
|
||||||
l32i a5, sp, XT_STK_A5
|
l32i a5, sp, XT_STK_A5
|
||||||
@ -445,7 +445,7 @@ _xt_coproc_release:
|
|||||||
/* Release previously taken spinlock */
|
/* Release previously taken spinlock */
|
||||||
spinlock_release a7 a8 _xt_coproc_owner_sa_lock
|
spinlock_release a7 a8 _xt_coproc_owner_sa_lock
|
||||||
#endif /* portNUM_PROCESSORS > 1 */
|
#endif /* portNUM_PROCESSORS > 1 */
|
||||||
wsr a6, PS /* restore interrupts */
|
wsr a6, XT_REG_PS /* restore interrupts */
|
||||||
|
|
||||||
RET0
|
RET0
|
||||||
|
|
||||||
@ -484,7 +484,7 @@ _xt_coproc_savecs:
|
|||||||
|
|
||||||
/* At entry, CPENABLE should be showing which CPs are enabled. */
|
/* At entry, CPENABLE should be showing which CPs are enabled. */
|
||||||
|
|
||||||
rsr a2, CPENABLE /* a2 = which CPs are enabled */
|
rsr a2, XT_REG_CPENABLE /* a2 = which CPs are enabled */
|
||||||
beqz a2, .Ldone /* quick exit if none */
|
beqz a2, .Ldone /* quick exit if none */
|
||||||
mov a14, a0 /* save return address */
|
mov a14, a0 /* save return address */
|
||||||
call0 XT_RTOS_CP_STATE /* get address of CP save area */
|
call0 XT_RTOS_CP_STATE /* get address of CP save area */
|
||||||
|
@ -168,14 +168,14 @@ xt_ints_on:
|
|||||||
or a5, a3, a2 /* a5 = _xt_intenable | mask */
|
or a5, a3, a2 /* a5 = _xt_intenable | mask */
|
||||||
s32i a5, a4, 0 /* _xt_intenable |= mask */
|
s32i a5, a4, 0 /* _xt_intenable |= mask */
|
||||||
and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */
|
and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */
|
||||||
wsr a5, INTENABLE /* Reenable interrupts */
|
wsr a5, XT_REG_INTENABLE /* Re-enable interrupts */
|
||||||
mov a2, a3 /* Previous mask */
|
mov a2, a3 /* Previous mask */
|
||||||
#else
|
#else
|
||||||
movi a3, 0
|
movi a3, 0
|
||||||
xsr a3, INTENABLE /* Disables all interrupts */
|
xsr a3, XT_REG_INTENABLE /* Disables all interrupts */
|
||||||
rsync
|
rsync
|
||||||
or a2, a3, a2 /* set bits in mask */
|
or a2, a3, a2 /* set bits in mask */
|
||||||
wsr a2, INTENABLE /* Re-enable ints */
|
wsr a2, XT_REG_INTENABLE /* Re-enable ints */
|
||||||
rsync
|
rsync
|
||||||
mov a2, a3 /* return prev mask */
|
mov a2, a3 /* return prev mask */
|
||||||
#endif
|
#endif
|
||||||
@ -218,15 +218,15 @@ xt_ints_off:
|
|||||||
xor a5, a5, a2 /* a5 = _xt_intenable & ~mask */
|
xor a5, a5, a2 /* a5 = _xt_intenable & ~mask */
|
||||||
s32i a5, a4, 0 /* _xt_intenable &= ~mask */
|
s32i a5, a4, 0 /* _xt_intenable &= ~mask */
|
||||||
and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */
|
and a5, a5, a6 /* a5 = _xt_intenable & _xt_vpri_mask */
|
||||||
wsr a5, INTENABLE /* Reenable interrupts */
|
wsr a5, XT_REG_INTENABLE /* Re-enable interrupts */
|
||||||
mov a2, a3 /* Previous mask */
|
mov a2, a3 /* Previous mask */
|
||||||
#else
|
#else
|
||||||
movi a4, 0
|
movi a4, 0
|
||||||
xsr a4, INTENABLE /* Disables all interrupts */
|
xsr a4, XT_REG_INTENABLE /* Disables all interrupts */
|
||||||
rsync
|
rsync
|
||||||
or a3, a4, a2 /* set bits in mask */
|
or a3, a4, a2 /* set bits in mask */
|
||||||
xor a3, a3, a2 /* invert bits in mask set in mask, essentially clearing them */
|
xor a3, a3, a2 /* invert bits in mask set in mask, essentially clearing them */
|
||||||
wsr a3, INTENABLE /* Re-enable ints */
|
wsr a3, XT_REG_INTENABLE /* Re-enable ints */
|
||||||
rsync
|
rsync
|
||||||
mov a2, a4 /* return prev mask */
|
mov a2, a4 /* return prev mask */
|
||||||
#endif
|
#endif
|
||||||
|
@ -212,8 +212,8 @@
|
|||||||
/* Get mask of pending, enabled interrupts at this level into a2. */
|
/* Get mask of pending, enabled interrupts at this level into a2. */
|
||||||
|
|
||||||
.L_xt_user_int_\level :
|
.L_xt_user_int_\level :
|
||||||
rsr a2, INTENABLE
|
rsr a2, XT_REG_INTENABLE
|
||||||
rsr a3, INTERRUPT
|
rsr a3, XT_REG_INTERRUPT
|
||||||
movi a4, \mask
|
movi a4, \mask
|
||||||
and a2, a2, a3
|
and a2, a2, a3
|
||||||
and a2, a2, a4
|
and a2, a2, a4
|
||||||
@ -229,7 +229,7 @@
|
|||||||
*/
|
*/
|
||||||
#ifdef XT_DEBUG_BACKTRACE
|
#ifdef XT_DEBUG_BACKTRACE
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
rsr a0, EXCSAVE_1 + \level - 1 /* Get exception frame pointer stored in EXCSAVE_x */
|
rsr a0, XT_REG_EXCSAVE_1 + \level - 1 /* Get exception frame pointer stored in EXCSAVE_x */
|
||||||
l32i a3, a0, XT_STK_A0 /* Copy pre-exception a0 (return address) */
|
l32i a3, a0, XT_STK_A0 /* Copy pre-exception a0 (return address) */
|
||||||
s32e a3, a1, -16
|
s32e a3, a1, -16
|
||||||
l32i a3, a0, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */
|
l32i a3, a0, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */
|
||||||
@ -238,7 +238,7 @@
|
|||||||
Also need to change current frame's return address to point to pre-exception's
|
Also need to change current frame's return address to point to pre-exception's
|
||||||
last run instruction.
|
last run instruction.
|
||||||
*/
|
*/
|
||||||
rsr a0, EPC_1 + \level - 1 /* return address */
|
rsr a0, XT_REG_EPC_1 + \level - 1 /* return address */
|
||||||
movi a4, 0xC0000000 /* constant with top 2 bits set (call size) */
|
movi a4, 0xC0000000 /* constant with top 2 bits set (call size) */
|
||||||
or a0, a0, a4 /* set top 2 bits */
|
or a0, a0, a4 /* set top 2 bits */
|
||||||
addx2 a0, a4, a0 /* clear top bit -- simulating call4 size */
|
addx2 a0, a4, a0 /* clear top bit -- simulating call4 size */
|
||||||
@ -294,10 +294,10 @@
|
|||||||
|
|
||||||
#ifdef XT_RTOS_TIMER_INT
|
#ifdef XT_RTOS_TIMER_INT
|
||||||
movi a3, XT_TIMER_INTEN /* a3 = timer interrupt bit */
|
movi a3, XT_TIMER_INTEN /* a3 = timer interrupt bit */
|
||||||
wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */
|
wsr a4, XT_REG_INTCLEAR /* clear sw or edge-triggered interrupt */
|
||||||
beq a3, a4, 7f /* if timer interrupt then skip table */
|
beq a3, a4, 7f /* if timer interrupt then skip table */
|
||||||
#else
|
#else
|
||||||
wsr a4, INTCLEAR /* clear sw or edge-triggered interrupt */
|
wsr a4, XT_REG_INTCLEAR /* clear sw or edge-triggered interrupt */
|
||||||
#endif // XT_RTOS_TIMER_INT
|
#endif // XT_RTOS_TIMER_INT
|
||||||
|
|
||||||
find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */
|
find_ms_setbit a3, a4, a3, 0 /* a3 = interrupt number */
|
||||||
@ -437,7 +437,7 @@ Debug Exception.
|
|||||||
.align 4
|
.align 4
|
||||||
.global xt_debugexception
|
.global xt_debugexception
|
||||||
_DebugExceptionVector:
|
_DebugExceptionVector:
|
||||||
wsr a0, EXCSAVE+XCHAL_DEBUGLEVEL /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE+XCHAL_DEBUGLEVEL /* preserve a0 */
|
||||||
J xt_debugexception /* load exception handler */
|
J xt_debugexception /* load exception handler */
|
||||||
|
|
||||||
.end literal_prefix
|
.end literal_prefix
|
||||||
@ -460,21 +460,21 @@ _xt_debugexception:
|
|||||||
bnez a0, 1f
|
bnez a0, 1f
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rsr a0, DEBUGCAUSE
|
rsr a0, XT_REG_DEBUGCAUSE
|
||||||
extui a0, a0, XT_DEBUGCAUSE_DI, 1
|
extui a0, a0, XT_DEBUGCAUSE_DI, 1
|
||||||
bnez a0, _xt_debug_di_exc
|
bnez a0, _xt_debug_di_exc
|
||||||
1:
|
1:
|
||||||
#endif //(CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI)
|
#endif //(CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI)
|
||||||
|
|
||||||
movi a0,PANIC_RSN_DEBUGEXCEPTION
|
movi a0,PANIC_RSN_DEBUGEXCEPTION
|
||||||
wsr a0,EXCCAUSE
|
wsr a0,XT_REG_EXCCAUSE
|
||||||
/* _xt_panic assumes a level 1 exception. As we're
|
/* _xt_panic assumes a level 1 exception. As we're
|
||||||
crashing anyhow, copy EPC & EXCSAVE from DEBUGLEVEL
|
crashing anyhow, copy EPC & EXCSAVE from DEBUGLEVEL
|
||||||
to level 1. */
|
to level 1. */
|
||||||
rsr a0,(EPC + XCHAL_DEBUGLEVEL)
|
rsr a0,(XT_REG_EPC + XCHAL_DEBUGLEVEL)
|
||||||
wsr a0,EPC_1
|
wsr a0,XT_REG_EPC_1
|
||||||
rsr a0,(EXCSAVE + XCHAL_DEBUGLEVEL)
|
rsr a0,(XT_REG_EXCSAVE + XCHAL_DEBUGLEVEL)
|
||||||
wsr a0,EXCSAVE_1
|
wsr a0,XT_REG_EXCSAVE_1
|
||||||
#if CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME
|
#if CONFIG_ESP_SYSTEM_GDBSTUB_RUNTIME
|
||||||
J _xt_panic_gdbstub /* For gdbstub we make jump */
|
J _xt_panic_gdbstub /* For gdbstub we make jump */
|
||||||
#else
|
#else
|
||||||
@ -539,7 +539,7 @@ _xt_debug_di_exc:
|
|||||||
.endr
|
.endr
|
||||||
bnez a0, 1b
|
bnez a0, 1b
|
||||||
|
|
||||||
rsr a0, EXCSAVE+XCHAL_DEBUGLEVEL
|
rsr a0, XT_REG_EXCSAVE+XCHAL_DEBUGLEVEL
|
||||||
rfi XCHAL_DEBUGLEVEL
|
rfi XCHAL_DEBUGLEVEL
|
||||||
#endif //(CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI)
|
#endif //(CONFIG_ESP32_ECO3_CACHE_LOCK_FIX && CONFIG_BTDM_CTRL_HLI)
|
||||||
#endif // XCHAL_HAVE_DEBUG
|
#endif // XCHAL_HAVE_DEBUG
|
||||||
@ -564,7 +564,7 @@ _DoubleExceptionVector:
|
|||||||
break 1, 4 /* unhandled double exception */
|
break 1, 4 /* unhandled double exception */
|
||||||
#endif
|
#endif
|
||||||
movi a0,PANIC_RSN_DOUBLEEXCEPTION
|
movi a0,PANIC_RSN_DOUBLEEXCEPTION
|
||||||
wsr a0,EXCCAUSE
|
wsr a0,XT_REG_EXCCAUSE
|
||||||
call0 _xt_panic /* does not return */
|
call0 _xt_panic /* does not return */
|
||||||
rfde /* make a0 point here not later */
|
rfde /* make a0 point here not later */
|
||||||
|
|
||||||
@ -585,7 +585,7 @@ Kernel Exception (including Level 1 Interrupt from kernel mode).
|
|||||||
|
|
||||||
_KernelExceptionVector:
|
_KernelExceptionVector:
|
||||||
|
|
||||||
wsr a0, EXCSAVE_1 /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE_1 /* preserve a0 */
|
||||||
call0 _xt_kernel_exc /* kernel exception handler */
|
call0 _xt_kernel_exc /* kernel exception handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -599,7 +599,7 @@ _xt_kernel_exc:
|
|||||||
break 1, 0 /* unhandled kernel exception */
|
break 1, 0 /* unhandled kernel exception */
|
||||||
#endif
|
#endif
|
||||||
movi a0,PANIC_RSN_KERNELEXCEPTION
|
movi a0,PANIC_RSN_KERNELEXCEPTION
|
||||||
wsr a0,EXCCAUSE
|
wsr a0,XT_REG_EXCCAUSE
|
||||||
call0 _xt_panic /* does not return */
|
call0 _xt_panic /* does not return */
|
||||||
rfe /* make a0 point here not there */
|
rfe /* make a0 point here not there */
|
||||||
|
|
||||||
@ -618,7 +618,7 @@ User Exception (including Level 1 Interrupt from user mode).
|
|||||||
|
|
||||||
_UserExceptionVector:
|
_UserExceptionVector:
|
||||||
|
|
||||||
wsr a0, EXCSAVE_1 /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE_1 /* preserve a0 */
|
||||||
call0 _xt_user_exc /* user exception handler */
|
call0 _xt_user_exc /* user exception handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -686,7 +686,7 @@ _call_alignment_handler:
|
|||||||
_xt_user_exc:
|
_xt_user_exc:
|
||||||
|
|
||||||
/* If level 1 interrupt then jump to the dispatcher */
|
/* If level 1 interrupt then jump to the dispatcher */
|
||||||
rsr a0, EXCCAUSE
|
rsr a0, XT_REG_EXCCAUSE
|
||||||
bnei a0, EXCCAUSE_LEVEL1INTERRUPT, _xt_handle_exc
|
bnei a0, EXCCAUSE_LEVEL1INTERRUPT, _xt_handle_exc
|
||||||
j _xt_lowint1
|
j _xt_lowint1
|
||||||
_xt_handle_exc:
|
_xt_handle_exc:
|
||||||
@ -722,11 +722,11 @@ _xt_handle_exc:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_1 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_1 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_1 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_1 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -736,9 +736,9 @@ _xt_handle_exc:
|
|||||||
call0 _xt_context_save
|
call0 _xt_context_save
|
||||||
|
|
||||||
/* Save exc cause and vaddr into exception frame */
|
/* Save exc cause and vaddr into exception frame */
|
||||||
rsr a0, EXCCAUSE
|
rsr a0, XT_REG_EXCCAUSE
|
||||||
s32i a0, sp, XT_STK_EXCCAUSE
|
s32i a0, sp, XT_STK_EXCCAUSE
|
||||||
rsr a0, EXCVADDR
|
rsr a0, XT_REG_EXCVADDR
|
||||||
s32i a0, sp, XT_STK_EXCVADDR
|
s32i a0, sp, XT_STK_EXCVADDR
|
||||||
|
|
||||||
/* Set up PS for C, re-enable debug and NMI interrupts, and clear EXCM. */
|
/* Set up PS for C, re-enable debug and NMI interrupts, and clear EXCM. */
|
||||||
@ -747,7 +747,7 @@ _xt_handle_exc:
|
|||||||
#else
|
#else
|
||||||
movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(XCHAL_DEBUGLEVEL - 2) | PS_UM | PS_WOE
|
||||||
#endif
|
#endif
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
|
|
||||||
/*
|
/*
|
||||||
Create pseudo base save area. At this point, sp is still pointing to the
|
Create pseudo base save area. At this point, sp is still pointing to the
|
||||||
@ -759,7 +759,7 @@ _xt_handle_exc:
|
|||||||
s32e a3, sp, -16
|
s32e a3, sp, -16
|
||||||
l32i a3, sp, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */
|
l32i a3, sp, XT_STK_A1 /* Copy pre-exception a1 (stack pointer) */
|
||||||
s32e a3, sp, -12
|
s32e a3, sp, -12
|
||||||
rsr a0, EPC_1 /* return address for debug backtrace */
|
rsr a0, XT_REG_EPC_1 /* return address for debug backtrace */
|
||||||
movi a5, 0xC0000000 /* constant with top 2 bits set (call size) */
|
movi a5, 0xC0000000 /* constant with top 2 bits set (call size) */
|
||||||
rsync /* wait for WSR.PS to complete */
|
rsync /* wait for WSR.PS to complete */
|
||||||
or a0, a0, a5 /* set top 2 bits */
|
or a0, a0, a5 /* set top 2 bits */
|
||||||
@ -769,7 +769,7 @@ _xt_handle_exc:
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rsr a2, EXCCAUSE /* recover exc cause */
|
rsr a2, XT_REG_EXCCAUSE /* recover exc cause */
|
||||||
|
|
||||||
#ifdef XT_INTEXC_HOOKS
|
#ifdef XT_INTEXC_HOOKS
|
||||||
/*
|
/*
|
||||||
@ -792,7 +792,7 @@ _xt_handle_exc:
|
|||||||
1:
|
1:
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
rsr a2, EXCCAUSE /* recover exc cause */
|
rsr a2, XT_REG_EXCCAUSE /* recover exc cause */
|
||||||
movi a3, _xt_exception_table
|
movi a3, _xt_exception_table
|
||||||
get_percpu_entry_for a2, a4
|
get_percpu_entry_for a2, a4
|
||||||
addx4 a4, a2, a3 /* a4 = address of exception table entry */
|
addx4 a4, a2, a3 /* a4 = address of exception table entry */
|
||||||
@ -810,9 +810,9 @@ _xt_handle_exc:
|
|||||||
/* Restore context and return */
|
/* Restore context and return */
|
||||||
call0 _xt_context_restore
|
call0 _xt_context_restore
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_1
|
wsr a0, XT_REG_EPC_1
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
l32i sp, sp, XT_STK_A1 /* remove exception frame */
|
||||||
rsync /* ensure PS and EPC written */
|
rsync /* ensure PS and EPC written */
|
||||||
@ -831,9 +831,9 @@ _xt_handle_exc:
|
|||||||
.align 4
|
.align 4
|
||||||
_xt_user_exit:
|
_xt_user_exit:
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_1
|
wsr a0, XT_REG_EPC_1
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
|
l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
|
||||||
rsync /* ensure PS and EPC written */
|
rsync /* ensure PS and EPC written */
|
||||||
@ -884,18 +884,18 @@ _xt_syscall_exc:
|
|||||||
If it's at the end of a zero-overhead loop and it's not on the last
|
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.
|
iteration, decrement loop counter and skip to beginning of loop.
|
||||||
*/
|
*/
|
||||||
rsr a2, EPC_1 /* a2 = PC of 'syscall' */
|
rsr a2, XT_REG_EPC_1 /* a2 = PC of 'syscall' */
|
||||||
addi a3, a2, 3 /* ++PC */
|
addi a3, a2, 3 /* ++PC */
|
||||||
#if XCHAL_HAVE_LOOPS
|
#if XCHAL_HAVE_LOOPS
|
||||||
rsr a0, LEND /* if (PC == LEND */
|
rsr a0, XT_REG_LEND /* if (PC == LEND */
|
||||||
bne a3, a0, 1f
|
bne a3, a0, 1f
|
||||||
rsr a0, LCOUNT /* && LCOUNT != 0) */
|
rsr a0, XT_REG_LCOUNT /* && LCOUNT != 0) */
|
||||||
beqz a0, 1f /* { */
|
beqz a0, 1f /* { */
|
||||||
addi a0, a0, -1 /* --LCOUNT */
|
addi a0, a0, -1 /* --LCOUNT */
|
||||||
rsr a3, LBEG /* PC = LBEG */
|
rsr a3, XT_REG_LBEG /* PC = LBEG */
|
||||||
wsr a0, LCOUNT /* } */
|
wsr a0, XT_REG_LCOUNT /* } */
|
||||||
#endif
|
#endif
|
||||||
1: wsr a3, EPC_1 /* update PC */
|
1: wsr a3, XT_REG_EPC_1 /* update PC */
|
||||||
|
|
||||||
/* Restore interruptee's context and return from exception. */
|
/* Restore interruptee's context and return from exception. */
|
||||||
#ifdef __XTENSA_CALL0_ABI__
|
#ifdef __XTENSA_CALL0_ABI__
|
||||||
@ -908,7 +908,7 @@ _xt_syscall_exc:
|
|||||||
#endif
|
#endif
|
||||||
movi a0, -1
|
movi a0, -1
|
||||||
movnez a2, a0, a2 /* return -1 if not syscall 0 */
|
movnez a2, a0, a2 /* return -1 if not syscall 0 */
|
||||||
rsr a0, EXCSAVE_1
|
rsr a0, XT_REG_EXCSAVE_1
|
||||||
rfe
|
rfe
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -996,11 +996,11 @@ _xt_coproc_exc:
|
|||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -12 /* for debug backtrace */
|
s32e a0, sp, -12 /* for debug backtrace */
|
||||||
#endif
|
#endif
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_1 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_1 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_1 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_1 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
#if XCHAL_HAVE_WINDOWED
|
#if XCHAL_HAVE_WINDOWED
|
||||||
s32e a0, sp, -16 /* for debug backtrace */
|
s32e a0, sp, -16 /* for debug backtrace */
|
||||||
@ -1008,7 +1008,7 @@ _xt_coproc_exc:
|
|||||||
movi a0, _xt_user_exit /* save exit point for dispatch */
|
movi a0, _xt_user_exit /* save exit point for dispatch */
|
||||||
s32i a0, sp, XT_STK_EXIT
|
s32i a0, sp, XT_STK_EXIT
|
||||||
|
|
||||||
rsr a0, EXCCAUSE
|
rsr a0, XT_REG_EXCCAUSE
|
||||||
s32i a5, sp, XT_STK_A5 /* save a5 */
|
s32i a5, sp, XT_STK_A5 /* save a5 */
|
||||||
addi a5, a0, -EXCCAUSE_CP0_DISABLED /* a5 = CP index */
|
addi a5, a0, -EXCCAUSE_CP0_DISABLED /* a5 = CP index */
|
||||||
|
|
||||||
@ -1035,12 +1035,12 @@ _xt_coproc_exc:
|
|||||||
|
|
||||||
/* Enable the co-processor's bit in CPENABLE. */
|
/* Enable the co-processor's bit in CPENABLE. */
|
||||||
movi a0, _xt_coproc_mask
|
movi a0, _xt_coproc_mask
|
||||||
rsr a4, CPENABLE /* a4 = CPENABLE */
|
rsr a4, XT_REG_CPENABLE /* a4 = CPENABLE */
|
||||||
addx4 a0, a5, a0 /* a0 = &_xt_coproc_mask[n] */
|
addx4 a0, a5, a0 /* a0 = &_xt_coproc_mask[n] */
|
||||||
l32i a0, a0, 0 /* a0 = (n << 16) | (1 << n) */
|
l32i a0, a0, 0 /* a0 = (n << 16) | (1 << n) */
|
||||||
extui a2, a0, 0, 16 /* coprocessor bitmask portion */
|
extui a2, a0, 0, 16 /* coprocessor bitmask portion */
|
||||||
or a4, a4, a2 /* a4 = CPENABLE | (1 << n) */
|
or a4, a4, a2 /* a4 = CPENABLE | (1 << n) */
|
||||||
wsr a4, CPENABLE
|
wsr a4, XT_REG_CPENABLE
|
||||||
|
|
||||||
/* Grab the xt_coproc_owner_sa owner array for current core */
|
/* Grab the xt_coproc_owner_sa owner array for current core */
|
||||||
getcoreid a3 /* a3 = current core ID */
|
getcoreid a3 /* a3 = current core ID */
|
||||||
@ -1181,7 +1181,7 @@ _xt_coproc_exc:
|
|||||||
/* Co-processor exception occurred outside a thread (not supported). */
|
/* Co-processor exception occurred outside a thread (not supported). */
|
||||||
.L_xt_coproc_invalid:
|
.L_xt_coproc_invalid:
|
||||||
movi a0,PANIC_RSN_COPROCEXCEPTION
|
movi a0,PANIC_RSN_COPROCEXCEPTION
|
||||||
wsr a0,EXCCAUSE
|
wsr a0,XT_REG_EXCCAUSE
|
||||||
call0 _xt_panic /* not in a thread (invalid) */
|
call0 _xt_panic /* not in a thread (invalid) */
|
||||||
/* never returns */
|
/* never returns */
|
||||||
|
|
||||||
@ -1203,11 +1203,11 @@ _xt_lowint1:
|
|||||||
mov a0, sp /* sp == a1 */
|
mov a0, sp /* sp == a1 */
|
||||||
addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
|
addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
|
||||||
s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
|
s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
|
||||||
rsr a0, PS /* save interruptee's PS */
|
rsr a0, XT_REG_PS /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_1 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_1 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_1 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_1 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
movi a0, _xt_user_exit /* save exit point for dispatch */
|
movi a0, _xt_user_exit /* save exit point for dispatch */
|
||||||
s32i a0, sp, XT_STK_EXIT
|
s32i a0, sp, XT_STK_EXIT
|
||||||
@ -1217,7 +1217,7 @@ _xt_lowint1:
|
|||||||
#ifdef XT_DEBUG_BACKTRACE
|
#ifdef XT_DEBUG_BACKTRACE
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
mov a0, sp
|
mov a0, sp
|
||||||
wsr a0, EXCSAVE_1
|
wsr a0, XT_REG_EXCSAVE_1
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1232,7 +1232,7 @@ _xt_lowint1:
|
|||||||
#else
|
#else
|
||||||
movi a0, PS_INTLEVEL(1) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(1) | PS_UM | PS_WOE
|
||||||
#endif
|
#endif
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
/* OK to call C code at this point, dispatch user ISRs */
|
/* OK to call C code at this point, dispatch user ISRs */
|
||||||
@ -1279,7 +1279,7 @@ _xt_lowint1:
|
|||||||
.type _Level2Vector,@function
|
.type _Level2Vector,@function
|
||||||
.align 4
|
.align 4
|
||||||
_Level2Vector:
|
_Level2Vector:
|
||||||
wsr a0, EXCSAVE_2 /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE_2 /* preserve a0 */
|
||||||
call0 _xt_medint2 /* load interrupt handler */
|
call0 _xt_medint2 /* load interrupt handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -1292,11 +1292,11 @@ _xt_medint2:
|
|||||||
mov a0, sp /* sp == a1 */
|
mov a0, sp /* sp == a1 */
|
||||||
addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
|
addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
|
||||||
s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
|
s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
|
||||||
rsr a0, EPS_2 /* save interruptee's PS */
|
rsr a0, XT_REG_EPS_2 /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_2 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_2 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_2 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_2 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
movi a0, _xt_medint2_exit /* save exit point for dispatch */
|
movi a0, _xt_medint2_exit /* save exit point for dispatch */
|
||||||
s32i a0, sp, XT_STK_EXIT
|
s32i a0, sp, XT_STK_EXIT
|
||||||
@ -1306,7 +1306,7 @@ _xt_medint2:
|
|||||||
#ifdef XT_DEBUG_BACKTRACE
|
#ifdef XT_DEBUG_BACKTRACE
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
mov a0, sp
|
mov a0, sp
|
||||||
wsr a0, EXCSAVE_2
|
wsr a0, XT_REG_EXCSAVE_2
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1321,7 +1321,7 @@ _xt_medint2:
|
|||||||
#else
|
#else
|
||||||
movi a0, PS_INTLEVEL(2) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(2) | PS_UM | PS_WOE
|
||||||
#endif
|
#endif
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
/* OK to call C code at this point, dispatch user ISRs */
|
/* OK to call C code at this point, dispatch user ISRs */
|
||||||
@ -1341,9 +1341,9 @@ _xt_medint2:
|
|||||||
_xt_medint2_exit:
|
_xt_medint2_exit:
|
||||||
/* Restore only level-specific regs (the rest were already restored) */
|
/* Restore only level-specific regs (the rest were already restored) */
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, EPS_2
|
wsr a0, XT_REG_EPS_2
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_2
|
wsr a0, XT_REG_EPC_2
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
|
l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
|
||||||
rsync /* ensure EPS and EPC written */
|
rsync /* ensure EPS and EPC written */
|
||||||
@ -1359,7 +1359,7 @@ _xt_medint2_exit:
|
|||||||
.type _Level3Vector,@function
|
.type _Level3Vector,@function
|
||||||
.align 4
|
.align 4
|
||||||
_Level3Vector:
|
_Level3Vector:
|
||||||
wsr a0, EXCSAVE_3 /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE_3 /* preserve a0 */
|
||||||
call0 _xt_medint3 /* load interrupt handler */
|
call0 _xt_medint3 /* load interrupt handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -1372,11 +1372,11 @@ _xt_medint3:
|
|||||||
mov a0, sp /* sp == a1 */
|
mov a0, sp /* sp == a1 */
|
||||||
addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
|
addi sp, sp, -XT_STK_FRMSZ /* allocate interrupt stack frame */
|
||||||
s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
|
s32i a0, sp, XT_STK_A1 /* save pre-interrupt SP */
|
||||||
rsr a0, EPS_3 /* save interruptee's PS */
|
rsr a0, XT_REG_EPS_3 /* save interruptee's PS */
|
||||||
s32i a0, sp, XT_STK_PS
|
s32i a0, sp, XT_STK_PS
|
||||||
rsr a0, EPC_3 /* save interruptee's PC */
|
rsr a0, XT_REG_EPC_3 /* save interruptee's PC */
|
||||||
s32i a0, sp, XT_STK_PC
|
s32i a0, sp, XT_STK_PC
|
||||||
rsr a0, EXCSAVE_3 /* save interruptee's a0 */
|
rsr a0, XT_REG_EXCSAVE_3 /* save interruptee's a0 */
|
||||||
s32i a0, sp, XT_STK_A0
|
s32i a0, sp, XT_STK_A0
|
||||||
movi a0, _xt_medint3_exit /* save exit point for dispatch */
|
movi a0, _xt_medint3_exit /* save exit point for dispatch */
|
||||||
s32i a0, sp, XT_STK_EXIT
|
s32i a0, sp, XT_STK_EXIT
|
||||||
@ -1386,7 +1386,7 @@ _xt_medint3:
|
|||||||
#ifdef XT_DEBUG_BACKTRACE
|
#ifdef XT_DEBUG_BACKTRACE
|
||||||
#ifndef __XTENSA_CALL0_ABI__
|
#ifndef __XTENSA_CALL0_ABI__
|
||||||
mov a0, sp
|
mov a0, sp
|
||||||
wsr a0, EXCSAVE_3
|
wsr a0, XT_REG_EXCSAVE_3
|
||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -1401,7 +1401,7 @@ _xt_medint3:
|
|||||||
#else
|
#else
|
||||||
movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE
|
movi a0, PS_INTLEVEL(3) | PS_UM | PS_WOE
|
||||||
#endif
|
#endif
|
||||||
wsr a0, PS
|
wsr a0, XT_REG_PS
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
/* OK to call C code at this point, dispatch user ISRs */
|
/* OK to call C code at this point, dispatch user ISRs */
|
||||||
@ -1421,9 +1421,9 @@ _xt_medint3:
|
|||||||
_xt_medint3_exit:
|
_xt_medint3_exit:
|
||||||
/* Restore only level-specific regs (the rest were already restored) */
|
/* Restore only level-specific regs (the rest were already restored) */
|
||||||
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
l32i a0, sp, XT_STK_PS /* retrieve interruptee's PS */
|
||||||
wsr a0, EPS_3
|
wsr a0, XT_REG_EPS_3
|
||||||
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
l32i a0, sp, XT_STK_PC /* retrieve interruptee's PC */
|
||||||
wsr a0, EPC_3
|
wsr a0, XT_REG_EPC_3
|
||||||
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
l32i a0, sp, XT_STK_A0 /* retrieve interruptee's A0 */
|
||||||
l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
|
l32i sp, sp, XT_STK_A1 /* remove interrupt stack frame */
|
||||||
rsync /* ensure EPS and EPC written */
|
rsync /* ensure EPS and EPC written */
|
||||||
@ -1803,7 +1803,7 @@ _xt_highint3:
|
|||||||
.global xt_highint4
|
.global xt_highint4
|
||||||
.align 4
|
.align 4
|
||||||
_Level4Vector:
|
_Level4Vector:
|
||||||
wsr a0, EXCSAVE_4 /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE_4 /* preserve a0 */
|
||||||
call0 xt_highint4 /* load interrupt handler */
|
call0 xt_highint4 /* load interrupt handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -1833,7 +1833,7 @@ _xt_highint4:
|
|||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.L_xt_highint4_exit:
|
.L_xt_highint4_exit:
|
||||||
rsr a0, EXCSAVE_4 /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_4 /* restore a0 */
|
||||||
rfi 4
|
rfi 4
|
||||||
|
|
||||||
#endif /* Level 4 */
|
#endif /* Level 4 */
|
||||||
@ -1847,7 +1847,7 @@ _xt_highint4:
|
|||||||
.global xt_highint5
|
.global xt_highint5
|
||||||
.align 4
|
.align 4
|
||||||
_Level5Vector:
|
_Level5Vector:
|
||||||
wsr a0, EXCSAVE_5 /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE_5 /* preserve a0 */
|
||||||
call0 xt_highint5 /* load interrupt handler */
|
call0 xt_highint5 /* load interrupt handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -1877,7 +1877,7 @@ _xt_highint5:
|
|||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.L_xt_highint5_exit:
|
.L_xt_highint5_exit:
|
||||||
rsr a0, EXCSAVE_5 /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE_5 /* restore a0 */
|
||||||
rfi 5
|
rfi 5
|
||||||
|
|
||||||
#endif /* Level 5 */
|
#endif /* Level 5 */
|
||||||
@ -1935,7 +1935,7 @@ _xt_highint6:
|
|||||||
.global xt_nmi
|
.global xt_nmi
|
||||||
.align 4
|
.align 4
|
||||||
_NMIExceptionVector:
|
_NMIExceptionVector:
|
||||||
wsr a0, EXCSAVE + XCHAL_NMILEVEL /* preserve a0 */
|
wsr a0, XT_REG_EXCSAVE + XCHAL_NMILEVEL /* preserve a0 */
|
||||||
call0 xt_nmi /* load interrupt handler */
|
call0 xt_nmi /* load interrupt handler */
|
||||||
/* never returns here - call0 is used as a jump (see note at top) */
|
/* never returns here - call0 is used as a jump (see note at top) */
|
||||||
|
|
||||||
@ -1965,7 +1965,7 @@ _xt_nmi:
|
|||||||
|
|
||||||
.align 4
|
.align 4
|
||||||
.L_xt_nmi_exit:
|
.L_xt_nmi_exit:
|
||||||
rsr a0, EXCSAVE + XCHAL_NMILEVEL /* restore a0 */
|
rsr a0, XT_REG_EXCSAVE + XCHAL_NMILEVEL /* restore a0 */
|
||||||
rfi XCHAL_NMILEVEL
|
rfi XCHAL_NMILEVEL
|
||||||
|
|
||||||
#endif /* NMI */
|
#endif /* NMI */
|
||||||
@ -2072,15 +2072,15 @@ The code is optimized to avoid unaligned branches and minimize cache misses.
|
|||||||
.global _xt_alloca_exc
|
.global _xt_alloca_exc
|
||||||
_xt_alloca_exc:
|
_xt_alloca_exc:
|
||||||
|
|
||||||
rsr a0, WINDOWBASE /* grab WINDOWBASE before rotw changes it */
|
rsr a0, XT_REG_WINDOWBASE /* grab WINDOWBASE before rotw changes it */
|
||||||
rotw -1 /* WINDOWBASE goes to a4, new a0-a3 are scratch */
|
rotw -1 /* WINDOWBASE goes to a4, new a0-a3 are scratch */
|
||||||
rsr a2, PS
|
rsr a2, XT_REG_PS
|
||||||
extui a3, a2, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS
|
extui a3, a2, XCHAL_PS_OWB_SHIFT, XCHAL_PS_OWB_BITS
|
||||||
xor a3, a3, a4 /* bits changed from old to current windowbase */
|
xor a3, a3, a4 /* bits changed from old to current windowbase */
|
||||||
rsr a4, EXCSAVE_1 /* restore original a0 (now in a4) */
|
rsr a4, XT_REG_EXCSAVE_1 /* restore original a0 (now in a4) */
|
||||||
slli a3, a3, XCHAL_PS_OWB_SHIFT
|
slli a3, a3, XCHAL_PS_OWB_SHIFT
|
||||||
xor a2, a2, a3 /* flip changed bits in old window base */
|
xor a2, a2, a3 /* flip changed bits in old window base */
|
||||||
wsr a2, PS /* update PS.OWB to new window base */
|
wsr a2, XT_REG_PS /* update PS.OWB to new window base */
|
||||||
rsync
|
rsync
|
||||||
|
|
||||||
bbci.l a4, 31, _WindowUnderflow4
|
bbci.l a4, 31, _WindowUnderflow4
|
||||||
|
@ -10,3 +10,4 @@ Migration from 5.5 to 6.0
|
|||||||
peripherals
|
peripherals
|
||||||
security
|
security
|
||||||
tools
|
tools
|
||||||
|
system
|
||||||
|
10
docs/en/migration-guides/release-6.x/6.0/system.rst
Normal file
10
docs/en/migration-guides/release-6.x/6.0/system.rst
Normal file
@ -0,0 +1,10 @@
|
|||||||
|
System
|
||||||
|
======
|
||||||
|
|
||||||
|
:link_to_translation:`zh_CN:[中文]`
|
||||||
|
|
||||||
|
Xtensa
|
||||||
|
------
|
||||||
|
|
||||||
|
The Xtensa special register header files have been updated to use a new naming convention. The old ``specreg.h`` header files are now deprecated and will be removed in a future release.
|
||||||
|
The register names have been updated to use the ``XT_REG_`` prefix. Please use the new ``xt_specreg.h`` file instead.
|
@ -10,3 +10,4 @@
|
|||||||
peripherals
|
peripherals
|
||||||
security
|
security
|
||||||
tools
|
tools
|
||||||
|
system
|
||||||
|
11
docs/zh_CN/migration-guides/release-6.x/6.0/system.rst
Normal file
11
docs/zh_CN/migration-guides/release-6.x/6.0/system.rst
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
系统
|
||||||
|
====
|
||||||
|
|
||||||
|
:link_to_translation:`en:[English]`
|
||||||
|
|
||||||
|
Xtensa
|
||||||
|
------
|
||||||
|
|
||||||
|
Xtensa 特殊寄存器头文件已更新,使用新的命名约定。旧的 ``specreg.h`` 头文件现已被弃用,并将在未来版本中移除。
|
||||||
|
|
||||||
|
寄存器名称已更新为使用 ``XT_REG_`` 前缀。请使用新的 ``xt_specreg.h`` 文件。
|
@ -17,7 +17,7 @@ nmi_triggered:
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @brief This current ISR was called via `call0` instruction, so `a0` (return address)
|
* @brief This current ISR was called via `call0` instruction, so `a0` (return address)
|
||||||
* was altered. Fortunately, `a0` was saved in EXCSAVE registers, restore it before
|
* was altered. Fortunately, `a0` was saved in XT_REG_EXCSAVE registers, restore it before
|
||||||
* returning
|
* returning
|
||||||
*/
|
*/
|
||||||
.section .iram1, "ax"
|
.section .iram1, "ax"
|
||||||
@ -41,7 +41,7 @@ xt_nmi:
|
|||||||
/* Restore a3 and a0 before leaving*/
|
/* Restore a3 and a0 before leaving*/
|
||||||
l32i a3, sp, 0
|
l32i a3, sp, 0
|
||||||
addi sp, sp, 16
|
addi sp, sp, 16
|
||||||
rsr a0, EXCSAVE + XCHAL_NMILEVEL
|
rsr a0, XT_REG_EXCSAVE + XCHAL_NMILEVEL
|
||||||
|
|
||||||
/* Return from NMI, we need to specify the level */
|
/* Return from NMI, we need to specify the level */
|
||||||
rfi XCHAL_NMILEVEL
|
rfi XCHAL_NMILEVEL
|
||||||
|
Reference in New Issue
Block a user