| /* |
| * Copyright (c) 2016 Cadence Design Systems, Inc. |
| * SPDX-License-Identifier: Apache-2.0 |
| */ |
| |
| #ifndef XTENSA_CONFIG_H |
| #define XTENSA_CONFIG_H |
| |
| #ifdef __cplusplus |
| extern "C" { |
| #endif |
| |
| #include <xtensa/hal.h> |
| #include <xtensa/config/core.h> |
| #include <xtensa/config/system.h> /* required for XSHAL_CLIB */ |
| |
| #include "xtensa_context.h" |
| |
| /* |
| * STACK REQUIREMENTS |
| * |
| * This section defines the minimum stack size, and the extra space required to |
| * be allocated for saving coprocessor state and/or C library state information |
| * (if thread safety is enabled for the C library). The sizes are in bytes. |
| * |
| * Stack sizes for individual tasks should be derived from these minima based |
| * on the maximum call depth of the task and the maximum level of interrupt |
| * nesting. A minimum stack size is defined by XT_STACK_MIN_SIZE. This minimum |
| * is based on the requirement for a task that calls nothing else but can be |
| * interrupted. This assumes that interrupt handlers do not call more than a |
| * few levels deep. If this is not true, i.e. one or more interrupt handlers |
| * make deep calls then the minimum must be increased. |
| * |
| * If the Xtensa processor configuration includes coprocessors, then space is |
| * allocated to save the coprocessor state on the stack. |
| * |
| * If thread safety is enabled for the C runtime library, |
| * (XT_USE_THREAD_SAFE_CLIB is defined) then space is allocated to save the C |
| * library context in the TCB. |
| * |
| * Allocating insufficient stack space is a common source of hard-to-find |
| * errors. During development, it is best to enable the FreeRTOS stack |
| * checking features. |
| * |
| * Usage: |
| * |
| * XT_USE_THREAD_SAFE_CLIB -- Define this to a nonzero value to enable |
| * thread-safe use of the C library. This will require extra stack space to be |
| * allocated for tasks that use the C library reentrant functions. See below |
| * for more information. |
| * |
| * NOTE: The Xtensa toolchain supports multiple C libraries and not all of them |
| * support thread safety. Check your core configuration to see which C library |
| * was chosen for your system. |
| * |
| * XT_STACK_MIN_SIZE -- The minimum stack size for any task. It is |
| * recommended that you do not use a stack smaller than this for any task. In |
| * case you want to use stacks smaller than this size, you must verify that the |
| * smaller size(s) will work under all operating conditions. |
| * |
| * XT_STACK_EXTRA -- The amount of extra stack space to allocate for a |
| * task that does not make C library reentrant calls. Add this to the amount of |
| * stack space required by the task itself. |
| * |
| * XT_STACK_EXTRA_CLIB -- The amount of space to allocate for C library |
| * state. |
| */ |
| |
| /* Extra space required for interrupt/exception hooks. */ |
| #ifdef XT_INTEXC_HOOKS |
| #ifdef __XTENSA_CALL0_ABI__ |
| #define STK_INTEXC_EXTRA 0x200 |
| #else |
| #define STK_INTEXC_EXTRA 0x180 |
| #endif |
| #else |
| #define STK_INTEXC_EXTRA 0 |
| #endif |
| |
| /* Check C library thread safety support and compute size of C library save |
| * area. |
| */ |
| #if XT_USE_THREAD_SAFE_CLIB > 0u |
| #if XSHAL_CLIB == XTHAL_CLIB_XCLIB |
| #define XT_HAVE_THREAD_SAFE_CLIB 0 |
| #error "Thread-safe operation is not yet supported for the XCLIB C library." |
| #elif XSHAL_CLIB == XTHAL_CLIB_NEWLIB |
| #define XT_HAVE_THREAD_SAFE_CLIB 1 |
| #if !defined __ASSEMBLER__ |
| #include <sys/reent.h> |
| #define XT_CLIB_CONTEXT_AREA_SIZE ((sizeof(struct _reent) + 15) + (-16)) |
| #define XT_CLIB_GLOBAL_PTR _impure_ptr |
| #endif |
| #else |
| #define XT_HAVE_THREAD_SAFE_CLIB 0 |
| #error "The selected C runtime library is not thread safe." |
| #endif |
| #else |
| #define XT_CLIB_CONTEXT_AREA_SIZE 0 |
| #endif |
| |
| /* Extra size -- interrupt frame plus coprocessor save area plus hook space. |
| * |
| * NOTE: Make sure XT_INTEXC_HOOKS is undefined unless you really need the |
| * hooks. |
| */ |
| #ifdef __XTENSA_CALL0_ABI__ |
| #define XT_XTRA_SIZE (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x10 + XT_CP_SIZE) |
| #else |
| #define XT_XTRA_SIZE (XT_STK_FRMSZ + STK_INTEXC_EXTRA + 0x20 + XT_CP_SIZE) |
| #endif |
| |
| /* |
| * Space allocated for user code -- function calls and local variables. |
| * |
| * NOTE: This number can be adjusted to suit your needs. You must verify that |
| * the amount of space you reserve is adequate for the worst-case conditions in |
| * your application. NOTE: The windowed ABI requires more stack, since space |
| * has to be reserved for spilling register windows. |
| */ |
| #ifdef __XTENSA_CALL0_ABI__ |
| #define XT_USER_SIZE 0x200 |
| #else |
| #define XT_USER_SIZE 0x400 |
| #endif |
| |
| /* Minimum recommended stack size. */ |
| #define XT_STACK_MIN_SIZE \ |
| ((XT_XTRA_SIZE + XT_USER_SIZE) / sizeof(unsigned char)) |
| |
| /* OS overhead with and without C library thread context. */ |
| #define XT_STACK_EXTRA (XT_XTRA_SIZE) |
| #define XT_STACK_EXTRA_CLIB (XT_XTRA_SIZE + XT_CLIB_CONTEXT_AREA_SIZE) |
| |
| |
| #ifdef __cplusplus |
| } |
| #endif |
| |
| #endif /* XTENSA_CONFIG_H */ |
| |