/*
 * 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
 *
 */

#include "FreeRTOSConfig.h"

#define portCONTEXT_SIZE                160
#define portEPC_STACK_LOCATION          152
#define portSTATUS_STACK_LOCATION       156
#define portFPCSR_STACK_LOCATION        0
#define portTASK_HAS_FPU_STACK_LOCATION     0
#define portFPU_CONTEXT_SIZE            264

/******************************************************************/
.macro  portSAVE_FPU_REGS    offset, base
    /* Macro to assist with saving just the FPU registers to the
     * specified address and base offset,
     * offset is a constant, base is the base pointer register  */

    sdc1        $f31, \offset + 248(\base)
    sdc1        $f30, \offset + 240(\base)
    sdc1        $f29, \offset + 232(\base)
    sdc1        $f28, \offset + 224(\base)
    sdc1        $f27, \offset + 216(\base)
    sdc1        $f26, \offset + 208(\base)
    sdc1        $f25, \offset + 200(\base)
    sdc1        $f24, \offset + 192(\base)
    sdc1        $f23, \offset + 184(\base)
    sdc1        $f22, \offset + 176(\base)
    sdc1        $f21, \offset + 168(\base)
    sdc1        $f20, \offset + 160(\base)
    sdc1        $f19, \offset + 152(\base)
    sdc1        $f18, \offset + 144(\base)
    sdc1        $f17, \offset + 136(\base)
    sdc1        $f16, \offset + 128(\base)
    sdc1        $f15, \offset + 120(\base)
    sdc1        $f14, \offset + 112(\base)
    sdc1        $f13, \offset + 104(\base)
    sdc1        $f12, \offset + 96(\base)
    sdc1        $f11, \offset + 88(\base)
    sdc1        $f10, \offset + 80(\base)
    sdc1        $f9, \offset + 72(\base)
    sdc1        $f8, \offset + 64(\base)
    sdc1        $f7, \offset + 56(\base)
    sdc1        $f6, \offset + 48(\base)
    sdc1        $f5, \offset + 40(\base)
    sdc1        $f4, \offset + 32(\base)
    sdc1        $f3, \offset + 24(\base)
    sdc1        $f2, \offset + 16(\base)
    sdc1        $f1, \offset + 8(\base)
    sdc1        $f0, \offset + 0(\base)

    .endm

/******************************************************************/
.macro  portLOAD_FPU_REGS    offset, base
    /* Macro to assist with loading just the FPU registers from the
     * specified address and base offset, offset is a constant,
     * base is the base pointer register  */

    ldc1        $f0, \offset + 0(\base)
    ldc1        $f1, \offset + 8(\base)
    ldc1        $f2, \offset + 16(\base)
    ldc1        $f3, \offset + 24(\base)
    ldc1        $f4, \offset + 32(\base)
    ldc1        $f5, \offset + 40(\base)
    ldc1        $f6, \offset + 48(\base)
    ldc1        $f7, \offset + 56(\base)
    ldc1        $f8, \offset + 64(\base)
    ldc1        $f9, \offset + 72(\base)
    ldc1        $f10, \offset + 80(\base)
    ldc1        $f11, \offset + 88(\base)
    ldc1        $f12, \offset + 96(\base)
    ldc1        $f13, \offset + 104(\base)
    ldc1        $f14, \offset + 112(\base)
    ldc1        $f15, \offset + 120(\base)
    ldc1        $f16, \offset + 128(\base)
    ldc1        $f17, \offset + 136(\base)
    ldc1        $f18, \offset + 144(\base)
    ldc1        $f19, \offset + 152(\base)
    ldc1        $f20, \offset + 160(\base)
    ldc1        $f21, \offset + 168(\base)
    ldc1        $f22, \offset + 176(\base)
    ldc1        $f23, \offset + 184(\base)
    ldc1        $f24, \offset + 192(\base)
    ldc1        $f25, \offset + 200(\base)
    ldc1        $f26, \offset + 208(\base)
    ldc1        $f27, \offset + 216(\base)
    ldc1        $f28, \offset + 224(\base)
    ldc1        $f29, \offset + 232(\base)
    ldc1        $f30, \offset + 240(\base)
    ldc1        $f31, \offset + 248(\base)

    .endm

/******************************************************************/
.macro  portSAVE_CONTEXT

    /* Make room for the context. First save the current status so it can be
    manipulated, and the cause and EPC registers so their original values are
    captured. */
    mfc0        k0, _CP0_CAUSE
    addiu       sp, sp, -portCONTEXT_SIZE

    #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
        /* Test if we are already using the system stack. Only tasks may use the
        FPU so if we are already in a nested interrupt then the FPU context does
        not require saving. */
        la          k1, uxInterruptNesting
        lw          k1, 0(k1)
        bne         k1, zero, 2f
        nop

        /* Test if the current task needs the FPU context saving. */
        la          k1, ulTaskHasFPUContext
        lw          k1, 0(k1)
        beq         k1, zero, 1f
        nop

        /* Adjust the stack to account for the additional FPU context.*/
        addiu       sp, sp, -portFPU_CONTEXT_SIZE

    1:
        /* Save the ulTaskHasFPUContext flag. */
        sw          k1, portTASK_HAS_FPU_STACK_LOCATION(sp)

    2:
    #endif

    mfc0        k1, _CP0_STATUS

    /* Also save s7, s6 and s5 so they can be used.  Any nesting interrupts
    should maintain the values of these registers across the ISR. */
    sw          s7, 48(sp)
    sw          s6, 44(sp)
    sw          s5, 40(sp)
    sw          k1, portSTATUS_STACK_LOCATION(sp)

    /* Prepare to enable interrupts above the current priority. */
    srl         k0, k0, 0xa
    ins         k1, k0, 10, 7
    srl         k0, k0, 0x7 /* This copies the MSB of the IPL, but it would be an error if it was set anyway. */
    ins         k1, k0, 18, 1
    ins         k1, zero, 1, 4

    /* s5 is used as the frame pointer. */
    add         s5, zero, sp

    /* Check the nesting count value. */
    la          k0, uxInterruptNesting
    lw          s6, (k0)

    /* If the nesting count is 0 then swap to the the system stack, otherwise
    the system stack is already being used. */
    bne         s6, zero, 1f
    nop

    /* Swap to the system stack. */
    la          sp, xISRStackTop
    lw          sp, (sp)

    /* Increment and save the nesting count. */
1:  addiu       s6, s6, 1
    sw          s6, 0(k0)

    /* s6 holds the EPC value, this is saved after interrupts are re-enabled. */
    mfc0        s6, _CP0_EPC

    /* Re-enable interrupts. */
    mtc0        k1, _CP0_STATUS

    /* Save the context into the space just created.  s6 is saved again
    here as it now contains the EPC value.  No other s registers need be
    saved. */
    sw          ra, 120(s5)
    sw          s8, 116(s5)
    sw          t9, 112(s5)
    sw          t8, 108(s5)
    sw          t7, 104(s5)
    sw          t6, 100(s5)
    sw          t5, 96(s5)
    sw          t4, 92(s5)
    sw          t3, 88(s5)
    sw          t2, 84(s5)
    sw          t1, 80(s5)
    sw          t0, 76(s5)
    sw          a3, 72(s5)
    sw          a2, 68(s5)
    sw          a1, 64(s5)
    sw          a0, 60(s5)
    sw          v1, 56(s5)
    sw          v0, 52(s5)
    sw          s6, portEPC_STACK_LOCATION(s5)
    sw          $1, 16(s5)

    /* Save the AC0, AC1, AC2, AC3 registers from the DSP.  s6 is used as a
    scratch register. */
    mfhi        s6, $ac1
    sw          s6, 128(s5)
    mflo        s6, $ac1
    sw          s6, 124(s5)

    mfhi        s6, $ac2
    sw          s6, 136(s5)
    mflo        s6, $ac2
    sw          s6, 132(s5)

    mfhi        s6, $ac3
    sw          s6, 144(s5)
    mflo        s6, $ac3
    sw          s6, 140(s5)

    /* Save the DSP Control register */
    rddsp       s6
    sw          s6, 148(s5)

    /* ac0 is done separately to match the MX port. */
    mfhi        s6, $ac0
    sw          s6, 12(s5)
    mflo        s6, $ac0
    sw          s6, 8(s5)

    /* Save the FPU context if the nesting count was zero. */
    #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
        la          s6, uxInterruptNesting
        lw          s6, 0(s6)
        addiu       s6, s6, -1
        bne         s6, zero, 1f
        nop

        /* Test if the current task needs the FPU context saving. */
        lw          s6, portTASK_HAS_FPU_STACK_LOCATION(s5)
        beq         s6, zero, 1f
        nop

        /* Save the FPU registers. */
        portSAVE_FPU_REGS ( portCONTEXT_SIZE + 8 ), s5

        /* Save the FPU status register */
        cfc1        s6, $f31
        sw          s6, (portCONTEXT_SIZE + portFPCSR_STACK_LOCATION)(s5)

        1:
    #endif

    /* Update the task stack pointer value if nesting is zero. */
    la          s6, uxInterruptNesting
    lw          s6, (s6)
    addiu       s6, s6, -1
    bne         s6, zero, 1f
    nop

    /* Save the stack pointer. */
    la          s6, uxSavedTaskStackPointer
    sw          s5, (s6)
1:
    .endm

/******************************************************************/
.macro  portRESTORE_CONTEXT

    /* Restore the stack pointer from the TCB.  This is only done if the
    nesting count is 1. */
    la          s6, uxInterruptNesting
    lw          s6, (s6)
    addiu       s6, s6, -1
    bne         s6, zero, 1f
    nop
    la          s6, uxSavedTaskStackPointer
    lw          s5, (s6)

    #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
        /* Restore the FPU context if required. */
        lw          s6, portTASK_HAS_FPU_STACK_LOCATION(s5)
        beq         s6, zero, 1f
        nop

        /* Restore the FPU registers. */
        portLOAD_FPU_REGS   ( portCONTEXT_SIZE + 8 ), s5

        /* Restore the FPU status register. */
        lw          s6, ( portCONTEXT_SIZE + portFPCSR_STACK_LOCATION )(s5)
        ctc1        s6, $f31
    #endif

1:

    /* Restore the context. */
    lw          s6, 128(s5)
    mthi        s6, $ac1
    lw          s6, 124(s5)
    mtlo        s6, $ac1

    lw          s6, 136(s5)
    mthi        s6, $ac2
    lw          s6, 132(s5)
    mtlo        s6, $ac2

    lw          s6, 144(s5)
    mthi        s6, $ac3
    lw          s6, 140(s5)
    mtlo        s6, $ac3

    /* Restore DSPControl. */
    lw          s6, 148(s5)
    wrdsp       s6

    lw          s6, 8(s5)
    mtlo        s6, $ac0
    lw          s6, 12(s5)
    mthi        s6, $ac0
    lw          $1, 16(s5)

    /* s6 is loaded as it was used as a scratch register and therefore saved
    as part of the interrupt context. */
    lw          s7, 48(s5)
    lw          s6, 44(s5)
    lw          v0, 52(s5)
    lw          v1, 56(s5)
    lw          a0, 60(s5)
    lw          a1, 64(s5)
    lw          a2, 68(s5)
    lw          a3, 72(s5)
    lw          t0, 76(s5)
    lw          t1, 80(s5)
    lw          t2, 84(s5)
    lw          t3, 88(s5)
    lw          t4, 92(s5)
    lw          t5, 96(s5)
    lw          t6, 100(s5)
    lw          t7, 104(s5)
    lw          t8, 108(s5)
    lw          t9, 112(s5)
    lw          s8, 116(s5)
    lw          ra, 120(s5)

    /* Protect access to the k registers, and others. */
    di
    ehb

    /* Decrement the nesting count. */
    la          k0, uxInterruptNesting
    lw          k1, (k0)
    addiu       k1, k1, -1
    sw          k1, 0(k0)

    #if ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )
        /* If the nesting count is now zero then the FPU context may be restored. */
        bne         k1, zero, 1f
        nop

        /* Restore the value of ulTaskHasFPUContext */
        la          k0, ulTaskHasFPUContext
        lw          k1, 0(s5)
        sw          k1, 0(k0)

        /* If the task does not have an FPU context then adjust the stack normally. */
        beq         k1, zero, 1f
        nop

        /* Restore the STATUS and EPC registers */
        lw          k0, portSTATUS_STACK_LOCATION(s5)
        lw          k1, portEPC_STACK_LOCATION(s5)

        /* Leave the stack in its original state.  First load sp from s5, then
        restore s5 from the stack. */
        add         sp, zero, s5
        lw          s5, 40(sp)

        /* Adjust the stack pointer to remove the FPU context */
        addiu       sp, sp, portFPU_CONTEXT_SIZE
        beq         zero, zero, 2f
        nop

        1:  /* Restore the STATUS and EPC registers */
        lw          k0, portSTATUS_STACK_LOCATION(s5)
        lw          k1, portEPC_STACK_LOCATION(s5)

        /* Leave the stack in its original state.  First load sp from s5, then
        restore s5 from the stack. */
        add         sp, zero, s5
        lw          s5, 40(sp)

        2:  /* Adjust the stack pointer */
        addiu       sp, sp, portCONTEXT_SIZE

    #else

        /* Restore the frame when there is no hardware FP support. */
        lw          k0, portSTATUS_STACK_LOCATION(s5)
        lw          k1, portEPC_STACK_LOCATION(s5)

        /* Leave the stack in its original state.  First load sp from s5, then
        restore s5 from the stack. */
        add         sp, zero, s5
        lw          s5, 40(sp)

        addiu       sp, sp, portCONTEXT_SIZE

    #endif // ( __mips_hard_float == 1 ) && ( configUSE_TASK_FPU_SUPPORT == 1 )

    mtc0        k0, _CP0_STATUS
    mtc0        k1, _CP0_EPC
    ehb
    eret
    nop

    .endm
