/*
 * FreeRTOS Kernel V10.0.0
 * Copyright (C) 2017 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * 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. If you wish to use our Amazon
 * FreeRTOS name, please do so in a fair use way that does not cause confusion.
 *
 * 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.
 *
 * http://www.FreeRTOS.org
 * http://aws.amazon.com/freertos
 *
 */

/*
 * 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.
 */

#ifndef PORTMACRO_H
    #define PORTMACRO_H

    #ifdef __cplusplus
        extern "C" {
    #endif

    #ifndef __ASSEMBLER__

        #include <stdint.h>

        #include <xtensa/tie/xt_core.h>
        #include <xtensa/hal.h>
        #include <xtensa/config/core.h>
        #include <xtensa/config/system.h> /* required for XSHAL_CLIB */
        #include <xtensa/xtruntime.h>

/*#include "xtensa_context.h" */

/*-----------------------------------------------------------
 * Port specific definitions.
 *
 * The settings in this file configure FreeRTOS correctly for the
 * given hardware and compiler.
 *
 * These settings should not be altered.
 *-----------------------------------------------------------
 */

/* Type definitions. */

        #define portCHAR          int8_t
        #define portFLOAT         float
        #define portDOUBLE        double
        #define portLONG          int32_t
        #define portSHORT         int16_t
        #define portSTACK_TYPE    uint32_t
        #define portBASE_TYPE     int

        typedef portSTACK_TYPE           StackType_t;
        typedef portBASE_TYPE            BaseType_t;
        typedef unsigned portBASE_TYPE   UBaseType_t;

        #if ( configUSE_16_BIT_TICKS == 1 )
            typedef uint16_t             TickType_t;
            #define portMAX_DELAY    ( TickType_t ) 0xffff
        #else
            typedef uint32_t             TickType_t;
            #define portMAX_DELAY    ( TickType_t ) 0xffffffffUL
        #endif
/*-----------------------------------------------------------*/

/* portbenchmark */
        #include "portbenchmark.h"

/* Critical section management. NW-TODO: replace XTOS_SET_INTLEVEL with more efficient version, if any? */
/* These cannot be nested. They should be used with a lot of care and cannot be called from interrupt level. */
        #define portDISABLE_INTERRUPTS()    do { XTOS_SET_INTLEVEL( XCHAL_EXCM_LEVEL ); portbenchmarkINTERRUPT_DISABLE(); } while( 0 )
        #define portENABLE_INTERRUPTS()     do { portbenchmarkINTERRUPT_RESTORE( 0 ); XTOS_SET_INTLEVEL( 0 ); } while( 0 )

/* These can be nested */
        #define portCRITICAL_NESTING_IN_TCB    1/* For now, let FreeRTOS' (tasks.c) manage critical nesting */
        void vTaskEnterCritical( void );
        void vTaskExitCritical( void );
        #define portENTER_CRITICAL()    vTaskEnterCritical()
        #define portEXIT_CRITICAL()     vTaskExitCritical()

/* Cleaner and preferred solution allows nested interrupts disabling and restoring via local registers or stack. */
/* They can be called from interrupts too. */
        static inline unsigned portENTER_CRITICAL_NESTED()
        {
            unsigned state = XTOS_SET_INTLEVEL( XCHAL_EXCM_LEVEL );

            portbenchmarkINTERRUPT_DISABLE();
            return state;
        }
        #define portEXIT_CRITICAL_NESTED( state )             do { portbenchmarkINTERRUPT_RESTORE( state ); XTOS_RESTORE_JUST_INTLEVEL( state ); } while( 0 )

/* These FreeRTOS versions are similar to the nested versions above */
        #define portSET_INTERRUPT_MASK_FROM_ISR()             portENTER_CRITICAL_NESTED()
        #define portCLEAR_INTERRUPT_MASK_FROM_ISR( state )    portEXIT_CRITICAL_NESTED( state )

/*-----------------------------------------------------------*/

/* Architecture specifics. */
        #define portSTACK_GROWTH      ( -1 )
        #define portTICK_PERIOD_MS    ( ( TickType_t ) 1000 / configTICK_RATE_HZ )
        #define portBYTE_ALIGNMENT    4
        #define portNOP()    XT_NOP()
/*-----------------------------------------------------------*/

/* Fine resolution time */
        #define portGET_RUN_TIME_COUNTER_VALUE()    xthal_get_ccount()

/* Kernel utilities. */
        void vPortYield( void );
        void _frxt_setup_switch( void );
        #define portYIELD()    vPortYield()
        #define portYIELD_FROM_ISR( xHigherPriorityTaskWoken ) \
    if( ( xHigherPriorityTaskWoken ) != 0 ) {                  \
        _frxt_setup_switch();                                  \
    }

/*-----------------------------------------------------------*/

/* Task function macros as described on the FreeRTOS.org WEB site. */
        #define portTASK_FUNCTION_PROTO( vFunction, pvParameters )    void vFunction( void * pvParameters )
        #define portTASK_FUNCTION( vFunction, pvParameters )          void vFunction( void * pvParameters )

/* When coprocessors are defined, we to maintain a pointer to coprocessors area. */
/* We currently use a hack: redefine field xMPU_SETTINGS in TCB block as a structure that can hold: */
/* MPU wrappers, coprocessor area pointer, trace code structure, and more if needed. */
/* The field is normally used for memory protection. FreeRTOS should create another general purpose field. */
        typedef struct
        {
            #if XCHAL_CP_NUM > 0
                volatile StackType_t * coproc_area; /* Pointer to coprocessor save area; MUST BE FIRST */
            #endif

            #if portUSING_MPU_WRAPPERS
                /* Define here mpu_settings, which is port dependent */
                int mpu_setting; /* Just a dummy example here; MPU not ported to Xtensa yet */
            #endif

            #if configUSE_TRACE_FACILITY_2
                struct
                {
                    /* Cf. porttraceStamp() */
                    int taskstamp;      /* Stamp from inside task to see where we are */
                    int taskstampcount; /* A counter usually incremented when we restart the task's loop */
                } porttrace;
            #endif
        } xMPU_SETTINGS;

/* Main hack to use MPU_wrappers even when no MPU is defined (warning: mpu_setting should not be accessed; otherwise move this above xMPU_SETTINGS) */
        #if ( XCHAL_CP_NUM > 0 || configUSE_TRACE_FACILITY_2 ) && !portUSING_MPU_WRAPPERS /* If MPU wrappers not used, we still need to allocate coproc area */
            #undef portUSING_MPU_WRAPPERS
            #define portUSING_MPU_WRAPPERS    1                                           /* Enable it to allocate coproc area */
            #define MPU_WRAPPERS_H                                                        /* Override mpu_wrapper.h to disable unwanted code */
            #define PRIVILEGED_FUNCTION
            #define PRIVILEGED_DATA
        #endif

/* porttrace */
        #if configUSE_TRACE_FACILITY_2
            #include "porttrace.h"
        #endif

/* configASSERT_2 if requested */
        #if configASSERT_2
            #include <stdio.h>
            void exit( int );
            #define configASSERT( x )    if( !( x ) ) { porttracePrint( -1 ); printf( "\nAssertion failed in %s:%d\n", __FILE__, __LINE__ ); exit( -1 ); }
        #endif


/* C library support -- only XCLIB and NEWLIB are supported. */

/* To enable thread-safe C library support, XT_USE_THREAD_SAFE_CLIB must be
 * defined to be > 0 somewhere above or on the command line. */

        #if ( XT_USE_THREAD_SAFE_CLIB > 0u ) && ( XSHAL_CLIB == XTHAL_CLIB_XCLIB )
            extern void vPortClibInit( void );

/* No cleanup necessary at this time. */
            #define portCLEAN_UP_TCB( pxTCB )
        #endif // XCLIB support

        #if ( XT_USE_THREAD_SAFE_CLIB > 0u ) && ( XSHAL_CLIB == XTHAL_CLIB_NEWLIB )
            extern void vPortClibInit( void );

/* This C library cleanup is not currently done by FreeRTOS when deleting a task */
            #include <stdio.h>
            #define portCLEAN_UP_TCB( pxTCB )    vPortCleanUpTcbClib( &( ( pxTCB )->xNewLib_reent ) )
            static inline void vPortCleanUpTcbClib( struct _reent * ptr )
            {
                FILE * fp = &( ptr->__sf[ 0 ] );
                int    i;

                for( i = 0; i < 3; ++i, ++fp )
                {
                    fp->_close = NULL;
                }
            }
        #endif // NEWLIB support

    #endif // __ASSEMBLER__

    #ifdef __cplusplus
        }
    #endif

#endif /* PORTMACRO_H */
