/*
 * 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
 *
 * 1 tab == 4 spaces!
 */

/*
 * 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 */
