/*
 * FreeRTOS Kernel <DEVELOPMENT BRANCH>
 * Copyright (C) 2021 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
 *
 * SPDX-License-Identifier: MIT
 *
 * 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.
 *
 * https://www.FreeRTOS.org
 * https://github.com/FreeRTOS
 *
 */

/* Scheduler includes. */
#include "FreeRTOS.h"
#include "task.h"

/* Hardware includes. */
#include <microblaze_exceptions_i.h>
#include <microblaze_exceptions_g.h>

/* The Xilinx library defined exception entry point stacks a number of
registers.  These definitions are offsets from the stack pointer to the various
stacked register values. */
#define portexR3_STACK_OFFSET   4
#define portexR4_STACK_OFFSET   5
#define portexR5_STACK_OFFSET   6
#define portexR6_STACK_OFFSET   7
#define portexR7_STACK_OFFSET   8
#define portexR8_STACK_OFFSET   9
#define portexR9_STACK_OFFSET   10
#define portexR10_STACK_OFFSET  11
#define portexR11_STACK_OFFSET  12
#define portexR12_STACK_OFFSET  13
#define portexR15_STACK_OFFSET  16
#define portexR18_STACK_OFFSET  19
#define portexMSR_STACK_OFFSET  20
#define portexR19_STACK_OFFSET  -1

/* This is defined to equal the size, in bytes, of the stack frame generated by
the Xilinx standard library exception entry point.  It is required to determine
the stack pointer value prior to the exception being entered. */
#define portexASM_HANDLER_STACK_FRAME_SIZE 84UL

/* The number of bytes a MicroBlaze instruction consumes. */
#define portexINSTRUCTION_SIZE  4

/* Exclude this entire file if the MicroBlaze is not configured to handle
exceptions, or the application defined configuration constant
configINSTALL_EXCEPTION_HANDLERS is not set to 1. */
#if ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 )

/* This variable is set in the exception entry code, before
vPortExceptionHandler is called. */
uint32_t *pulStackPointerOnFunctionEntry = NULL;

/* This is the structure that is filled with the MicroBlaze context as it
existed immediately prior to the exception occurrence.  A pointer to this
structure is passed into the vApplicationExceptionRegisterDump() callback
function, if one is defined. */
static xPortRegisterDump xRegisterDump;

/* This is the FreeRTOS exception handler that is installed for all exception
types.  It is called from vPortExceptionHanlderEntry() - which is itself defined
in portasm.S. */
void vPortExceptionHandler( void *pvExceptionID );
extern void vPortExceptionHandlerEntry( void *pvExceptionID );

/*-----------------------------------------------------------*/

/* vApplicationExceptionRegisterDump() is a callback function that the
application can optionally define to receive a populated xPortRegisterDump
structure.  If the application chooses not to define a version of
vApplicationExceptionRegisterDump() then this weekly defined default
implementation will be called instead. */
extern void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump ) __attribute__((weak));
void vApplicationExceptionRegisterDump( xPortRegisterDump *xRegisterDump )
{
    ( void ) xRegisterDump;

    for( ;; )
    {
        portNOP();
    }
}
/*-----------------------------------------------------------*/

void vPortExceptionHandler( void *pvExceptionID )
{
extern void *pxCurrentTCB;

    /* Fill an xPortRegisterDump structure with the MicroBlaze context as it
    was immediately before the exception occurrence. */

    /* First fill in the name and handle of the task that was in the Running
    state when the exception occurred. */
    xRegisterDump.xCurrentTaskHandle = pxCurrentTCB;
    xRegisterDump.pcCurrentTaskName = pcTaskGetName( NULL );

    configASSERT( pulStackPointerOnFunctionEntry );

    /* Obtain the values of registers that were stacked prior to this function
    being called, and may have changed since they were stacked. */
    xRegisterDump.ulR3 = pulStackPointerOnFunctionEntry[ portexR3_STACK_OFFSET ];
    xRegisterDump.ulR4 = pulStackPointerOnFunctionEntry[ portexR4_STACK_OFFSET ];
    xRegisterDump.ulR5 = pulStackPointerOnFunctionEntry[ portexR5_STACK_OFFSET ];
    xRegisterDump.ulR6 = pulStackPointerOnFunctionEntry[ portexR6_STACK_OFFSET ];
    xRegisterDump.ulR7 = pulStackPointerOnFunctionEntry[ portexR7_STACK_OFFSET ];
    xRegisterDump.ulR8 = pulStackPointerOnFunctionEntry[ portexR8_STACK_OFFSET ];
    xRegisterDump.ulR9 = pulStackPointerOnFunctionEntry[ portexR9_STACK_OFFSET ];
    xRegisterDump.ulR10 = pulStackPointerOnFunctionEntry[ portexR10_STACK_OFFSET ];
    xRegisterDump.ulR11 = pulStackPointerOnFunctionEntry[ portexR11_STACK_OFFSET ];
    xRegisterDump.ulR12 = pulStackPointerOnFunctionEntry[ portexR12_STACK_OFFSET ];
    xRegisterDump.ulR15_return_address_from_subroutine = pulStackPointerOnFunctionEntry[ portexR15_STACK_OFFSET ];
    xRegisterDump.ulR18 = pulStackPointerOnFunctionEntry[ portexR18_STACK_OFFSET ];
    xRegisterDump.ulR19 = pulStackPointerOnFunctionEntry[ portexR19_STACK_OFFSET ];
    xRegisterDump.ulMSR = pulStackPointerOnFunctionEntry[ portexMSR_STACK_OFFSET ];

    /* Obtain the value of all other registers. */
    xRegisterDump.ulR2_small_data_area = mfgpr( R2 );
    xRegisterDump.ulR13_read_write_small_data_area = mfgpr( R13 );
    xRegisterDump.ulR14_return_address_from_interrupt = mfgpr( R14 );
    xRegisterDump.ulR16_return_address_from_trap = mfgpr( R16 );
    xRegisterDump.ulR17_return_address_from_exceptions = mfgpr( R17 );
    xRegisterDump.ulR20 = mfgpr( R20 );
    xRegisterDump.ulR21 = mfgpr( R21 );
    xRegisterDump.ulR22 = mfgpr( R22 );
    xRegisterDump.ulR23 = mfgpr( R23 );
    xRegisterDump.ulR24 = mfgpr( R24 );
    xRegisterDump.ulR25 = mfgpr( R25 );
    xRegisterDump.ulR26 = mfgpr( R26 );
    xRegisterDump.ulR27 = mfgpr( R27 );
    xRegisterDump.ulR28 = mfgpr( R28 );
    xRegisterDump.ulR29 = mfgpr( R29 );
    xRegisterDump.ulR30 = mfgpr( R30 );
    xRegisterDump.ulR31 = mfgpr( R31 );
    xRegisterDump.ulR1_SP = ( ( uint32_t ) pulStackPointerOnFunctionEntry ) + portexASM_HANDLER_STACK_FRAME_SIZE;
    xRegisterDump.ulEAR = mfear();
    xRegisterDump.ulESR = mfesr();
    xRegisterDump.ulEDR = mfedr();

    /* Move the saved program counter back to the instruction that was executed
    when the exception occurred.  This is only valid for certain types of
    exception. */
    xRegisterDump.ulPC = xRegisterDump.ulR17_return_address_from_exceptions - portexINSTRUCTION_SIZE;

    #if( XPAR_MICROBLAZE_USE_FPU != 0 )
    {
        xRegisterDump.ulFSR = mffsr();
    }
    #else
    {
        xRegisterDump.ulFSR = 0UL;
    }
    #endif

    /* Also fill in a string that describes what type of exception this is.
    The string uses the same ID names as defined in the MicroBlaze standard
    library exception header files. */
    switch( ( uint32_t ) pvExceptionID )
    {
        case XEXC_ID_FSL :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FSL";
                break;

        case XEXC_ID_UNALIGNED_ACCESS :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_UNALIGNED_ACCESS";
                break;

        case XEXC_ID_ILLEGAL_OPCODE :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_ILLEGAL_OPCODE";
                break;

        case XEXC_ID_M_AXI_I_EXCEPTION :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_I_EXCEPTION or XEXC_ID_IPLB_EXCEPTION";
                break;

        case XEXC_ID_M_AXI_D_EXCEPTION :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_M_AXI_D_EXCEPTION or XEXC_ID_DPLB_EXCEPTION";
                break;

        case XEXC_ID_DIV_BY_ZERO :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_DIV_BY_ZERO";
                break;

        case XEXC_ID_STACK_VIOLATION :
                xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_STACK_VIOLATION or XEXC_ID_MMU";
                break;

        #if( XPAR_MICROBLAZE_USE_FPU != 0 )

            case XEXC_ID_FPU :
                        xRegisterDump.pcExceptionCause = ( int8_t * const ) "XEXC_ID_FPU see ulFSR value";
                        break;

        #endif /* XPAR_MICROBLAZE_USE_FPU */
    }

    /* vApplicationExceptionRegisterDump() is a callback function that the
    application can optionally define to receive the populated xPortRegisterDump
    structure.  If the application chooses not to define a version of
    vApplicationExceptionRegisterDump() then the weekly defined default
    implementation within this file will be called instead. */
    vApplicationExceptionRegisterDump( &xRegisterDump );

    /* Must not attempt to leave this function! */
    for( ;; )
    {
        portNOP();
    }
}
/*-----------------------------------------------------------*/

void vPortExceptionsInstallHandlers( void )
{
static uint32_t ulHandlersAlreadyInstalled = pdFALSE;

    if( ulHandlersAlreadyInstalled == pdFALSE )
    {
        ulHandlersAlreadyInstalled = pdTRUE;

        #if XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS == 1
            microblaze_register_exception_handler( XEXC_ID_UNALIGNED_ACCESS, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_UNALIGNED_ACCESS );
        #endif /* XPAR_MICROBLAZE_UNALIGNED_EXCEPTIONS*/

        #if XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_ILLEGAL_OPCODE, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_ILLEGAL_OPCODE );
        #endif /* XPAR_MICROBLAZE_ILL_OPCODE_EXCEPTION */

        #if XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_M_AXI_I_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_I_EXCEPTION );
        #endif /* XPAR_MICROBLAZE_M_AXI_I_BUS_EXCEPTION */

        #if XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_M_AXI_D_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_M_AXI_D_EXCEPTION );
        #endif /* XPAR_MICROBLAZE_M_AXI_D_BUS_EXCEPTION */

        #if XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_IPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_IPLB_EXCEPTION );
        #endif /* XPAR_MICROBLAZE_IPLB_BUS_EXCEPTION */

        #if XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_DPLB_EXCEPTION, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DPLB_EXCEPTION );
        #endif /* XPAR_MICROBLAZE_DPLB_BUS_EXCEPTION */

        #if XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_DIV_BY_ZERO, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_DIV_BY_ZERO );
        #endif /* XPAR_MICROBLAZE_DIV_ZERO_EXCEPTION */

        #if XPAR_MICROBLAZE_FPU_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_FPU, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FPU );
        #endif /* XPAR_MICROBLAZE_FPU_EXCEPTION */

        #if XPAR_MICROBLAZE_FSL_EXCEPTION == 1
            microblaze_register_exception_handler( XEXC_ID_FSL, vPortExceptionHandlerEntry, ( void * ) XEXC_ID_FSL );
        #endif /* XPAR_MICROBLAZE_FSL_EXCEPTION */

        microblaze_enable_exceptions();
    }
}

/* Exclude the entire file if the MicroBlaze is not configured to handle
exceptions, or the application defined configuration item
configINSTALL_EXCEPTION_HANDLERS is not set to 1. */
#endif /* ( MICROBLAZE_EXCEPTIONS_ENABLED == 1 ) && ( configINSTALL_EXCEPTION_HANDLERS == 1 ) */
