/*
 * 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
 *
 */
    .extern pxCurrentTCB
    .extern vTaskISRHandler
    .extern vTaskSwitchContext
    .extern uxCriticalNesting
    .extern pulISRStack

    .global __FreeRTOS_interrupt_handler
    .global VPortYieldASM
    .global vStartFirstTask


.macro portSAVE_CONTEXT
    /* Make room for the context on the stack. */
    addik r1, r1, -132
    /* Save r31 so it can then be used. */
    swi r31, r1, 4
    /* Copy the msr into r31 - this is stacked later. */
    mfs r31, rmsr
    /* Stack general registers. */
    swi r30, r1, 12
    swi r29, r1, 16
    swi r28, r1, 20
    swi r27, r1, 24
    swi r26, r1, 28
    swi r25, r1, 32
    swi r24, r1, 36
    swi r23, r1, 40
    swi r22, r1, 44
    swi r21, r1, 48
    swi r20, r1, 52
    swi r19, r1, 56
    swi r18, r1, 60
    swi r17, r1, 64
    swi r16, r1, 68
    swi r15, r1, 72
    swi r13, r1, 80
    swi r12, r1, 84
    swi r11, r1, 88
    swi r10, r1, 92
    swi r9, r1, 96
    swi r8, r1, 100
    swi r7, r1, 104
    swi r6, r1, 108
    swi r5, r1, 112
    swi r4, r1, 116
    swi r3, r1, 120
    swi r2, r1, 124
    /* Stack the critical section nesting value. */
    lwi r3, r0, uxCriticalNesting
    swi r3, r1, 128
    /* Save the top of stack value to the TCB. */
    lwi r3, r0, pxCurrentTCB
    sw  r1, r0, r3

    .endm

.macro portRESTORE_CONTEXT
    /* Load the top of stack value from the TCB. */
    lwi r3, r0, pxCurrentTCB
    lw  r1, r0, r3
    /* Restore the general registers. */
    lwi r31, r1, 4
    lwi r30, r1, 12
    lwi r29, r1, 16
    lwi r28, r1, 20
    lwi r27, r1, 24
    lwi r26, r1, 28
    lwi r25, r1, 32
    lwi r24, r1, 36
    lwi r23, r1, 40
    lwi r22, r1, 44
    lwi r21, r1, 48
    lwi r20, r1, 52
    lwi r19, r1, 56
    lwi r18, r1, 60
    lwi r17, r1, 64
    lwi r16, r1, 68
    lwi r15, r1, 72
    lwi r14, r1, 76
    lwi r13, r1, 80
    lwi r12, r1, 84
    lwi r11, r1, 88
    lwi r10, r1, 92
    lwi r9, r1, 96
    lwi r8, r1, 100
    lwi r7, r1, 104
    lwi r6, r1, 108
    lwi r5, r1, 112
    lwi r4, r1, 116
    lwi r2, r1, 124

    /* Load the critical nesting value. */
    lwi r3, r1, 128
    swi r3, r0, uxCriticalNesting

    /* Obtain the MSR value from the stack. */
    lwi r3, r1, 8

    /* Are interrupts enabled in the MSR?  If so return using an return from
    interrupt instruction to ensure interrupts are enabled only once the task
    is running again. */
    andi r3, r3, 2
    beqid r3, 36
    or r0, r0, r0

    /* Reload the rmsr from the stack, clear the enable interrupt bit in the
    value before saving back to rmsr register, then return enabling interrupts
    as we return. */
    lwi r3, r1, 8
    andi r3, r3, ~2
    mts rmsr, r3
    lwi r3, r1, 120
    addik r1, r1, 132
    rtid r14, 0
    or r0, r0, r0

    /* Reload the rmsr from the stack, place it in the rmsr register, and
    return without enabling interrupts. */
    lwi r3, r1, 8
    mts rmsr, r3
    lwi r3, r1, 120
    addik r1, r1, 132
    rtsd r14, 0
    or r0, r0, r0

    .endm

    .text
    .align  2


__FreeRTOS_interrupt_handler:
    portSAVE_CONTEXT
    /* Entered via an interrupt so interrupts must be enabled in msr. */
    ori r31, r31, 2
    /* Stack msr. */
    swi r31, r1, 8
    /* Stack the return address.  As we entered via an interrupt we do
    not need to modify the return address prior to stacking. */
    swi r14, r1, 76
    /* Now switch to use the ISR stack. */
    lwi r3, r0, pulISRStack
    add r1, r3, r0
    bralid r15, vTaskISRHandler
    or r0, r0, r0
    portRESTORE_CONTEXT


VPortYieldASM:
    portSAVE_CONTEXT
    /* Stack msr. */
    swi r31, r1, 8
    /* Modify the return address so we return to the instruction after the
    exception. */
    addi r14, r14, 8
    swi r14, r1, 76
    /* Now switch to use the ISR stack. */
    lwi r3, r0, pulISRStack
    add r1, r3, r0
    bralid r15, vTaskSwitchContext
    or r0, r0, r0
    portRESTORE_CONTEXT

vStartFirstTask:
    portRESTORE_CONTEXT


