/*
 * Copyright (c) 2015-2019 Cadence Design Systems, Inc.
 *
 * Permission is hereby granted, free of charge, to any person obtaining
 * a copy of this software and associated documentation files (the
 * "Software"), to deal in the Software without restriction, including
 * without limitation the rights to use, copy, modify, merge, publish,
 * distribute, sublicense, and/or sell copies of the Software, and to
 * permit persons to whom the Software is furnished to do so, subject to
 * the following conditions:
 *
 * The above copyright notice and this permission notice shall be included
 * in all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
 * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
 * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
 * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
 * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
 */

/*
 * XTENSA CONTEXT FRAMES AND MACROS FOR RTOS ASSEMBLER SOURCES
 *
 * This header contains definitions and macros for use primarily by Xtensa
 * RTOS assembly coded source files. It includes and uses the Xtensa hardware
 * abstraction layer (HAL) to deal with config specifics. It may also be
 * included in C source files.
 *
 * !! Supports only Xtensa Exception Architecture 2 (XEA2). XEA1 not supported. !!
 *
 * NOTE: The Xtensa architecture requires stack pointer alignment to 16 bytes.
 */

#ifndef XTENSA_CONTEXT_H
#define XTENSA_CONTEXT_H

#ifdef __ASSEMBLER__
    #include    <xtensa/coreasm.h>
#endif

#include    <xtensa/config/tie.h>
#include    <xtensa/corebits.h>
#include    <xtensa/config/system.h>


/* Align a value up to nearest n-byte boundary, where n is a power of 2. */
#define ALIGNUP( n, val )    ( ( ( val ) + ( n ) - 1 ) & -( n ) )


/*
 * -------------------------------------------------------------------------------
 * Macros that help define structures for both C and assembler.
 * -------------------------------------------------------------------------------
 */
#if defined( _ASMLANGUAGE ) || defined( __ASSEMBLER__ )

    #define STRUCT_BEGIN    .pushsection.text; .struct 0
    #define STRUCT_FIELD( ctype, size, asname, name ) asname:.space size
    #define STRUCT_AFIELD( ctype, size, asname, name, n )    asname:.space( size ) *( n )
    #define STRUCT_END( sname )                              sname ## Size:; .popsection

#else

    #define STRUCT_BEGIN    typedef struct {
    #define STRUCT_FIELD( ctype, size, asname, name )        ctype name;
    #define STRUCT_AFIELD( ctype, size, asname, name, n )    ctype name[ n ];
    #define STRUCT_END( sname ) \
    }                           \
    sname;

#endif //_ASMLANGUAGE || __ASSEMBLER__


/*
 * -------------------------------------------------------------------------------
 * INTERRUPT/EXCEPTION STACK FRAME FOR A THREAD OR NESTED INTERRUPT
 *
 * A stack frame of this structure is allocated for any interrupt or exception.
 * It goes on the current stack. If the RTOS has a system stack for handling
 * interrupts, every thread stack must allow space for just one interrupt stack
 * frame, then nested interrupt stack frames go on the system stack.
 *
 * The frame includes basic registers (explicit) and "extra" registers introduced
 * by user TIE or the use of the MAC16 option in the user's Xtensa config.
 * The frame size is minimized by omitting regs not applicable to user's config.
 *
 * For Windowed ABI, this stack frame includes the interruptee's base save area,
 * another base save area to manage gcc nested functions, and a little temporary
 * space to help manage the spilling of the register windows.
 * -------------------------------------------------------------------------------
 */

STRUCT_BEGIN STRUCT_FIELD( long,
                           4,
                           XT_STK_EXIT,
                           exit )      /* exit point for dispatch */
STRUCT_FIELD( long, 4, XT_STK_PC, pc ) /* return PC */
STRUCT_FIELD( long, 4, XT_STK_PS, ps ) /* return PS */
STRUCT_FIELD( long, 4, XT_STK_A0, a0 )
STRUCT_FIELD( long, 4, XT_STK_A1, a1 ) /* stack pointer before interrupt */
STRUCT_FIELD( long, 4, XT_STK_A2, a2 )
STRUCT_FIELD( long, 4, XT_STK_A3, a3 )
STRUCT_FIELD( long, 4, XT_STK_A4, a4 )
STRUCT_FIELD( long, 4, XT_STK_A5, a5 )
STRUCT_FIELD( long, 4, XT_STK_A6, a6 )
STRUCT_FIELD( long, 4, XT_STK_A7, a7 )
STRUCT_FIELD( long, 4, XT_STK_A8, a8 )
STRUCT_FIELD( long, 4, XT_STK_A9, a9 )
STRUCT_FIELD( long, 4, XT_STK_A10, a10 )
STRUCT_FIELD( long, 4, XT_STK_A11, a11 )
STRUCT_FIELD( long, 4, XT_STK_A12, a12 )
STRUCT_FIELD( long, 4, XT_STK_A13, a13 )
STRUCT_FIELD( long, 4, XT_STK_A14, a14 )
STRUCT_FIELD( long, 4, XT_STK_A15, a15 )
STRUCT_FIELD( long, 4, XT_STK_SAR, sar )
STRUCT_FIELD( long, 4, XT_STK_EXCCAUSE, exccause )
STRUCT_FIELD( long, 4, XT_STK_EXCVADDR, excvaddr )
#if XCHAL_HAVE_LOOPS
    STRUCT_FIELD( long, 4, XT_STK_LBEG, lbeg )
    STRUCT_FIELD( long, 4, XT_STK_LEND, lend )
    STRUCT_FIELD( long, 4, XT_STK_LCOUNT, lcount )
#endif
#ifndef __XTENSA_CALL0_ABI__
/* Temporary space for saving stuff during window spill */
    STRUCT_FIELD( long, 4, XT_STK_TMP0, tmp0 )
    STRUCT_FIELD( long, 4, XT_STK_TMP1, tmp1 )
    STRUCT_FIELD( long, 4, XT_STK_TMP2, tmp2 )
#endif
#ifdef XT_USE_SWPRI
/* Storage for virtual priority mask */
    STRUCT_FIELD( long, 4, XT_STK_VPRI, vpri )
#endif
#ifdef XT_USE_OVLY
/* Storage for overlay state */
    STRUCT_FIELD( long, 4, XT_STK_OVLY, ovly )
#endif
STRUCT_END( XtExcFrame )

#if defined( _ASMLANGUAGE ) || defined( __ASSEMBLER__ )
#define XT_STK_NEXT1    XtExcFrameSize
#else
#define XT_STK_NEXT1    sizeof( XtExcFrame )
#endif

/* Allocate extra storage if needed */
#if XCHAL_EXTRA_SA_SIZE != 0

    #if XCHAL_EXTRA_SA_ALIGN <= 16
#define XT_STK_EXTRA    ALIGNUP( XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1 )
    #else
/* If need more alignment than stack, add space for dynamic alignment */
#define XT_STK_EXTRA    ( ALIGNUP( XCHAL_EXTRA_SA_ALIGN, XT_STK_NEXT1 ) + XCHAL_EXTRA_SA_ALIGN )
    #endif
#define XT_STK_NEXT2    ( XT_STK_EXTRA + XCHAL_EXTRA_SA_SIZE )

#else

#define XT_STK_NEXT2    XT_STK_NEXT1

#endif /* if XCHAL_EXTRA_SA_SIZE != 0 */

/*
 * -------------------------------------------------------------------------------
 * This is the frame size. Add space for 4 registers (interruptee's base save
 * area) and some space for gcc nested functions if any.
 * -------------------------------------------------------------------------------
 */
#define XT_STK_FRMSZ    ( ALIGNUP( 0x10, XT_STK_NEXT2 ) + 0x20 )


/*
 * -------------------------------------------------------------------------------
 * SOLICITED STACK FRAME FOR A THREAD
 *
 * A stack frame of this structure is allocated whenever a thread enters the
 * RTOS kernel intentionally (and synchronously) to submit to thread scheduling.
 * It goes on the current thread's stack.
 *
 * The solicited frame only includes registers that are required to be preserved
 * by the callee according to the compiler's ABI conventions, some space to save
 * the return address for returning to the caller, and the caller's PS register.
 *
 * For Windowed ABI, this stack frame includes the caller's base save area.
 *
 * Note on XT_SOL_EXIT field:
 *    It is necessary to distinguish a solicited from an interrupt stack frame.
 *    This field corresponds to XT_STK_EXIT in the interrupt stack frame and is
 *    always at the same offset (0). It can be written with a code (usually 0)
 *    to distinguish a solicted frame from an interrupt frame. An RTOS port may
 *    opt to ignore this field if it has another way of distinguishing frames.
 * -------------------------------------------------------------------------------
 */

STRUCT_BEGIN
#ifdef __XTENSA_CALL0_ABI__
    STRUCT_FIELD( long,
                  4,
                  XT_SOL_EXIT,
                  exit )
    STRUCT_FIELD( long, 4, XT_SOL_PC, pc )
    STRUCT_FIELD( long, 4, XT_SOL_PS, ps )
    STRUCT_FIELD( long, 4, XT_SOL_NEXT, next )
    STRUCT_FIELD( long, 4, XT_SOL_A12, a12 ) /* should be on 16-byte alignment */
    STRUCT_FIELD( long, 4, XT_SOL_A13, a13 )
    STRUCT_FIELD( long, 4, XT_SOL_A14, a14 )
    STRUCT_FIELD( long, 4, XT_SOL_A15, a15 )
#else /* ifdef __XTENSA_CALL0_ABI__ */
    STRUCT_FIELD( long, 4, XT_SOL_EXIT, exit )
    STRUCT_FIELD( long, 4, XT_SOL_PC, pc )
    STRUCT_FIELD( long, 4, XT_SOL_PS, ps )
    STRUCT_FIELD( long, 4, XT_SOL_NEXT, next )
    STRUCT_FIELD( long, 4, XT_SOL_A0, a0 ) /* should be on 16-byte alignment */
    STRUCT_FIELD( long, 4, XT_SOL_A1, a1 )
    STRUCT_FIELD( long, 4, XT_SOL_A2, a2 )
    STRUCT_FIELD( long, 4, XT_SOL_A3, a3 )
#endif /* ifdef __XTENSA_CALL0_ABI__ */
STRUCT_END( XtSolFrame )

/* Size of solicited stack frame */
#define XT_SOL_FRMSZ    ALIGNUP( 0x10, XtSolFrameSize )


/*
 * -------------------------------------------------------------------------------
 * CO-PROCESSOR STATE SAVE AREA FOR A THREAD
 *
 * The RTOS must provide an area per thread to save the state of co-processors
 * when that thread does not have control. Co-processors are context-switched
 * lazily (on demand) only when a new thread uses a co-processor instruction,
 * otherwise a thread retains ownership of the co-processor even when it loses
 * control of the processor. An Xtensa co-processor exception is triggered when
 * any co-processor instruction is executed by a thread that is not the owner,
 * and the context switch of that co-processor is then peformed by the handler.
 * Ownership represents which thread's state is currently in the co-processor.
 *
 * Co-processors may not be used by interrupt or exception handlers. If an
 * co-processor instruction is executed by an interrupt or exception handler,
 * the co-processor exception handler will trigger a kernel panic and freeze.
 * This restriction is introduced to reduce the overhead of saving and restoring
 * co-processor state (which can be quite large) and in particular remove that
 * overhead from interrupt handlers.
 *
 * The co-processor state save area may be in any convenient per-thread location
 * such as in the thread control block or above the thread stack area. It need
 * not be in the interrupt stack frame since interrupts don't use co-processors.
 *
 * Along with the save area for each co-processor, two bitmasks with flags per
 * co-processor (laid out as in the CPENABLE reg) help manage context-switching
 * co-processors as efficiently as possible:
 *
 * XT_CPENABLE
 *  The contents of a non-running thread's CPENABLE register.
 *  It represents the co-processors owned (and whose state is still needed)
 *  by the thread. When a thread is preempted, its CPENABLE is saved here.
 *  When a thread solicits a context-swtich, its CPENABLE is cleared - the
 *  compiler has saved the (caller-saved) co-proc state if it needs to.
 *  When a non-running thread loses ownership of a CP, its bit is cleared.
 *  When a thread runs, it's XT_CPENABLE is loaded into the CPENABLE reg.
 *  Avoids co-processor exceptions when no change of ownership is needed.
 *
 * XT_CPSTORED
 *  A bitmask with the same layout as CPENABLE, a bit per co-processor.
 *  Indicates whether the state of each co-processor is saved in the state
 *  save area. When a thread enters the kernel, only the state of co-procs
 *  still enabled in CPENABLE is saved. When the co-processor exception
 *  handler assigns ownership of a co-processor to a thread, it restores
 *  the saved state only if this bit is set, and clears this bit.
 *
 * XT_CP_CS_ST
 *  A bitmask with the same layout as CPENABLE, a bit per co-processor.
 *  Indicates whether callee-saved state is saved in the state save area.
 *  Callee-saved state is saved by itself on a solicited context switch,
 *  and restored when needed by the coprocessor exception handler.
 *  Unsolicited switches will cause the entire coprocessor to be saved
 *  when necessary.
 *
 * XT_CP_ASA
 *  Pointer to the aligned save area.  Allows it to be aligned more than
 *  the overall save area (which might only be stack-aligned or TCB-aligned).
 *  Especially relevant for Xtensa cores configured with a very large data
 *  path that requires alignment greater than 16 bytes (ABI stack alignment).
 * -------------------------------------------------------------------------------
 */

#if XCHAL_CP_NUM > 0

/*  Offsets of each coprocessor save area within the 'aligned save area':  */
#define XT_CP0_SA        0
#define XT_CP1_SA        ALIGNUP( XCHAL_CP1_SA_ALIGN, XT_CP0_SA + XCHAL_CP0_SA_SIZE )
#define XT_CP2_SA        ALIGNUP( XCHAL_CP2_SA_ALIGN, XT_CP1_SA + XCHAL_CP1_SA_SIZE )
#define XT_CP3_SA        ALIGNUP( XCHAL_CP3_SA_ALIGN, XT_CP2_SA + XCHAL_CP2_SA_SIZE )
#define XT_CP4_SA        ALIGNUP( XCHAL_CP4_SA_ALIGN, XT_CP3_SA + XCHAL_CP3_SA_SIZE )
#define XT_CP5_SA        ALIGNUP( XCHAL_CP5_SA_ALIGN, XT_CP4_SA + XCHAL_CP4_SA_SIZE )
#define XT_CP6_SA        ALIGNUP( XCHAL_CP6_SA_ALIGN, XT_CP5_SA + XCHAL_CP5_SA_SIZE )
#define XT_CP7_SA        ALIGNUP( XCHAL_CP7_SA_ALIGN, XT_CP6_SA + XCHAL_CP6_SA_SIZE )
#define XT_CP_SA_SIZE    ALIGNUP( 16, XT_CP7_SA + XCHAL_CP7_SA_SIZE )

/*  Offsets within the overall save area:  */
#define XT_CPENABLE      0 /* (2 bytes) coprocessors active for this thread */
#define XT_CPSTORED      2 /* (2 bytes) coprocessors saved for this thread */
#define XT_CP_CS_ST      4 /* (2 bytes) coprocessor callee-saved regs stored for this thread */
#define XT_CP_ASA        8 /* (4 bytes) ptr to aligned save area */
/*  Overall size allows for dynamic alignment:  */
#define XT_CP_SIZE       ( 12 + XT_CP_SA_SIZE + XCHAL_TOTAL_SA_ALIGN )
#else /* if XCHAL_CP_NUM > 0 */
#define XT_CP_SIZE       0
#endif /* if XCHAL_CP_NUM > 0 */


/*
 * -------------------------------------------------------------------------------
 * MACROS TO HANDLE ABI SPECIFICS OF FUNCTION ENTRY AND RETURN
 *
 * Convenient where the frame size requirements are the same for both ABIs.
 *  ENTRY(sz), RET(sz) are for framed functions (have locals or make calls).
 *  ENTRY0,    RET0    are for frameless functions (no locals, no calls).
 *
 * where size = size of stack frame in bytes (must be >0 and aligned to 16).
 * For framed functions the frame is created and the return address saved at
 * base of frame (Call0 ABI) or as determined by hardware (Windowed ABI).
 * For frameless functions, there is no frame and return address remains in a0.
 * Note: Because CPP macros expand to a single line, macros requiring multi-line
 * expansions are implemented as assembler macros.
 * -------------------------------------------------------------------------------
 */

#ifdef __ASSEMBLER__
    #ifdef __XTENSA_CALL0_ABI__
        /* Call0 */
#define ENTRY( sz )    entry1 sz
           .macro entry1 size = 0x10
                                addi sp, sp, -\ size
        s32i a0, sp, 0
           .endm
#define ENTRY0
#define RET( sz )    ret1 sz
           .macro ret1 size   = 0x10
                                l32i a0, sp, 0
        addi sp, sp, \ size
        ret
           .endm
#define RET0    ret
    #else /* ifdef __XTENSA_CALL0_ABI__ */
        /* Windowed */
#define ENTRY( sz )    entry sp, sz
#define ENTRY0    entry sp, 0x10
#define RET( sz )      retw
#define RET0      retw
    #endif /* ifdef __XTENSA_CALL0_ABI__ */
#endif /* ifdef __ASSEMBLER__ */


#endif /* XTENSA_CONTEXT_H */
