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

    RSEG    CODE:CODE(2)
    thumb

    EXTERN vPortYieldFromISR
    EXTERN pxCurrentTCB
    EXTERN vTaskSwitchContext

    PUBLIC vSetMSP
    PUBLIC xPortPendSVHandler
    PUBLIC vPortSVCHandler
    PUBLIC vPortStartFirstTask
    PUBLIC ulSetInterruptMaskFromISR
    PUBLIC vClearInterruptMaskFromISR

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

vSetMSP
    msr msp, r0
    bx lr

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

xPortPendSVHandler:
    mrs r0, psp

    ldr r3, =pxCurrentTCB   /* Get the location of the current TCB. */
    ldr r2, [r3]

    subs r0, r0, #32        /* Make space for the remaining low registers. */
    str r0, [r2]            /* Save the new top of stack. */
    stmia r0!, {r4-r7}      /* Store the low registers that are not saved automatically. */
    mov r4, r8              /* Store the high registers. */
    mov r5, r9
    mov r6, r10
    mov r7, r11
    stmia r0!, {r4-r7}

    push {r3, r14}
    cpsid i
    bl vTaskSwitchContext
    cpsie i
    pop {r2, r3}            /* lr goes in r3. r2 now holds tcb pointer. */

    ldr r1, [r2]
    ldr r0, [r1]            /* The first item in pxCurrentTCB is the task top of stack. */
    adds r0, r0, #16        /* Move to the high registers. */
    ldmia r0!, {r4-r7}      /* Pop the high registers. */
    mov r8, r4
    mov r9, r5
    mov r10, r6
    mov r11, r7

    msr psp, r0             /* Remember the new top of stack for the task. */

    subs r0, r0, #32        /* Go back for the low registers that are not automatically restored. */
    ldmia r0!, {r4-r7}      /* Pop low registers.  */

    bx r3

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

vPortSVCHandler;
    /* This function is no longer used, but retained for backward
     * compatibility. */
    bx lr

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

vPortStartFirstTask
    /* Don't reset the MSP stack as is done on CM3/4 devices. The vector table
     * in some CM0 devices cannot be modified and thus may not hold the
     * application's initial MSP value. */

    ldr r3, =pxCurrentTCB   /* Obtain location of pxCurrentTCB. */
    ldr r1, [r3]
    ldr r0, [r1]            /* The first item in pxCurrentTCB is the task top of stack. */
    adds r0, #32            /* Discard everything up to r0. */
    msr psp, r0             /* This is now the new top of stack to use in the task. */
    movs r0, #2             /* Switch to the psp stack. */
    msr CONTROL, r0
    isb
    pop {r0-r5}             /* Pop the registers that are saved automatically. */
    mov lr, r5              /* lr is now in r5. */
    pop {r3}                /* The return address is now in r3. */
    pop {r2}                /* Pop and discard the XPSR. */
    cpsie i                 /* The first task has its context and interrupts can be enabled. */
    bx r3                   /* Jump to the user defined task code. */

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

ulSetInterruptMaskFromISR
    mrs r0, PRIMASK
    cpsid i
    bx lr

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

vClearInterruptMaskFromISR
    msr PRIMASK, r0
    bx lr

    END
