| /* |
| * Copyright (c) 2017, Intel Corporation |
| * |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| #ifndef ZEPHYR_ARCH_XTENSA_INCLUDE_XTENSA_ASM2_CONTEXT_H_ |
| #define ZEPHYR_ARCH_XTENSA_INCLUDE_XTENSA_ASM2_CONTEXT_H_ |
| |
| #include <xtensa/corebits.h> |
| #include <xtensa/config/core-isa.h> |
| |
| /* |
| * Stack frame layout for a saved processor context, in memory order, |
| * high to low address: |
| * |
| * SP-0 <-- Interrupted stack pointer points here |
| * |
| * SP-4 Caller A3 spill slot \ |
| * SP-8 Caller A2 spill slot | |
| * SP-12 Caller A1 spill slot + (Part of ABI standard) |
| * SP-16 Caller A0 spill slot / |
| * |
| * SP-20 Saved A3 |
| * SP-24 Saved A2 |
| * SP-28 Unused (not "Saved A1" because the SP is saved externally as a handle) |
| * SP-32 Saved A0 |
| * |
| * SP-36 Saved PC (address to jump to following restore) |
| * SP-40 Saved/interrupted PS special register |
| * |
| * SP-44 Saved SAR special register |
| * |
| * SP-48 Saved LBEG special register (if loops enabled) |
| * SP-52 Saved LEND special register (if loops enabled) |
| * SP-56 Saved LCOUNT special register (if loops enabled) |
| * |
| * SP-60 Saved SCOMPARE special register (if S32C1I enabled) |
| * |
| * (The above fixed-size region is known as the "base save area" in the |
| * code below) |
| * |
| * - Saved A7 \ |
| * - Saved A6 | |
| * - Saved A5 +- If not in-use by another frame |
| * - Saved A4 / |
| * |
| * - Saved A11 \ |
| * - Saved A10 | |
| * - Saved A9 +- If not in-use by another frame |
| * - Saved A8 / |
| * |
| * - Saved A15 \ |
| * - Saved A14 | |
| * - Saved A13 +- If not in-use by another frame |
| * - Saved A12 / |
| * |
| * - Saved intermediate stack pointer (points to low word of base save |
| * area, i.e. the saved LCOUNT or SAR). The pointer to this value |
| * (i.e. the final stack pointer) is stored externally as the |
| * "restore handle" in the thread context. |
| * |
| * Essentially, you can recover a pointer to the BSA by loading *SP. |
| * Adding the fixed BSA size to that gets you back to the |
| * original/interrupted stack pointer. |
| */ |
| |
| #define BASE_SAVE_AREA_SIZE_COMMON 44 |
| #define BASE_SAVE_AREA_SIZE_EXCCAUSE 4 |
| |
| #if XCHAL_HAVE_LOOPS |
| #define BASE_SAVE_AREA_SIZE_LOOPS 12 |
| #else |
| #define BASE_SAVE_AREA_SIZE_LOOPS 0 |
| #endif |
| |
| #if XCHAL_HAVE_S32C1I |
| #define BASE_SAVE_AREA_SIZE_SCOMPARE 4 |
| #else |
| #define BASE_SAVE_AREA_SIZE_SCOMPARE 0 |
| #endif |
| |
| #if XCHAL_HAVE_THREADPTR && defined(CONFIG_THREAD_LOCAL_STORAGE) |
| #define BASE_SAVE_AREA_SIZE_THREADPTR 4 |
| #else |
| #define BASE_SAVE_AREA_SIZE_THREADPTR 0 |
| #endif |
| |
| #define BASE_SAVE_AREA_SIZE \ |
| (BASE_SAVE_AREA_SIZE_COMMON + \ |
| BASE_SAVE_AREA_SIZE_LOOPS + \ |
| BASE_SAVE_AREA_SIZE_EXCCAUSE + \ |
| BASE_SAVE_AREA_SIZE_SCOMPARE + \ |
| BASE_SAVE_AREA_SIZE_THREADPTR) |
| |
| #define BSA_A3_OFF (BASE_SAVE_AREA_SIZE - 20) |
| #define BSA_A2_OFF (BASE_SAVE_AREA_SIZE - 24) |
| #define BSA_SCRATCH_OFF (BASE_SAVE_AREA_SIZE - 28) |
| #define BSA_A0_OFF (BASE_SAVE_AREA_SIZE - 32) |
| #define BSA_PC_OFF (BASE_SAVE_AREA_SIZE - 36) |
| #define BSA_PS_OFF (BASE_SAVE_AREA_SIZE - 40) |
| #define BSA_SAR_OFF (BASE_SAVE_AREA_SIZE - 44) |
| #define BSA_LBEG_OFF (BASE_SAVE_AREA_SIZE - 48) |
| #define BSA_LEND_OFF (BASE_SAVE_AREA_SIZE - 52) |
| #define BSA_LCOUNT_OFF (BASE_SAVE_AREA_SIZE - 56) |
| |
| #define BSA_EXCCAUSE_OFF \ |
| (BASE_SAVE_AREA_SIZE - \ |
| (BASE_SAVE_AREA_SIZE_COMMON + \ |
| BASE_SAVE_AREA_SIZE_LOOPS + \ |
| BASE_SAVE_AREA_SIZE_EXCCAUSE)) |
| #if XCHAL_HAVE_S32C1I |
| #define BSA_SCOMPARE1_OFF \ |
| (BASE_SAVE_AREA_SIZE - \ |
| (BASE_SAVE_AREA_SIZE_COMMON + \ |
| BASE_SAVE_AREA_SIZE_LOOPS + \ |
| BASE_SAVE_AREA_SIZE_EXCCAUSE + \ |
| BASE_SAVE_AREA_SIZE_SCOMPARE)) |
| #endif |
| |
| #if XCHAL_HAVE_THREADPTR && defined(CONFIG_THREAD_LOCAL_STORAGE) |
| #define BSA_THREADPTR_OFF \ |
| (BASE_SAVE_AREA_SIZE - \ |
| (BASE_SAVE_AREA_SIZE_COMMON + \ |
| BASE_SAVE_AREA_SIZE_LOOPS + \ |
| BASE_SAVE_AREA_SIZE_EXCCAUSE + \ |
| BASE_SAVE_AREA_SIZE_SCOMPARE + \ |
| BASE_SAVE_AREA_SIZE_THREADPTR)) |
| #endif |
| |
| #endif /* ZEPHYR_ARCH_XTENSA_INCLUDE_XTENSA_ASM2_CONTEXT_H_ */ |