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

    .thumb

    .ref pxCurrentTCB
    .ref vTaskSwitchContext
    .ref ulMaxSyscallInterruptPriority

    .def xPortPendSVHandler
    .def ulPortGetIPSR
    .def vPortSVCHandler
    .def vPortStartFirstTask
    .def vPortEnableVFP

NVICOffsetConst:                    .word   0xE000ED08
CPACRConst:                         .word   0xE000ED88
pxCurrentTCBConst:                  .word   pxCurrentTCB
ulMaxSyscallInterruptPriorityConst: .word ulMaxSyscallInterruptPriority

; -----------------------------------------------------------

    .align 4
ulPortGetIPSR: .asmfunc
    mrs r0, ipsr
    bx r14
    .endasmfunc
 ; -----------------------------------------------------------

    .align 4
vPortSetInterruptMask: .asmfunc
    push {r0}
    ldr r0, ulMaxSyscallInterruptPriorityConst
    msr basepri, r0
    pop {r0}
    bx r14
    .endasmfunc
; -----------------------------------------------------------

    .align 4
xPortPendSVHandler: .asmfunc
    mrs r0, psp
    isb

    ;/* Get the location of the current TCB. */
    ldr r3, pxCurrentTCBConst
    ldr r2, [r3]

    ;/* Is the task using the FPU context?  If so, push high vfp registers. */
    tst r14, #0x10
    it eq
    vstmdbeq r0!, {s16-s31}

    ;/* Save the core registers. */
    stmdb r0!, {r4-r11, r14}

    ;/* Save the new top of stack into the first member of the TCB. */
    str r0, [r2]

    stmdb sp!, {r0, r3}
    ldr r0, ulMaxSyscallInterruptPriorityConst
    ldr r1, [r0]
    msr basepri, r1
    dsb
    isb
    bl vTaskSwitchContext
    mov r0, #0
    msr basepri, r0
    ldmia sp!, {r0, r3}

    ;/* The first item in pxCurrentTCB is the task top of stack. */
    ldr r1, [r3]
    ldr r0, [r1]

    ;/* Pop the core registers. */
    ldmia r0!, {r4-r11, r14}

    ;/* Is the task using the FPU context?  If so, pop the high vfp registers
    ;too. */
    tst r14, #0x10
    it eq
    vldmiaeq r0!, {s16-s31}

    msr psp, r0
    isb
    bx r14
    .endasmfunc

; -----------------------------------------------------------

    .align 4
vPortSVCHandler: .asmfunc
    ;/* Get the location of the current TCB. */
    ldr r3, pxCurrentTCBConst
    ldr r1, [r3]
    ldr r0, [r1]
    ;/* Pop the core registers. */
    ldmia r0!, {r4-r11, r14}
    msr psp, r0
    isb
    mov r0, #0
    msr basepri, r0
    bx r14
    .endasmfunc

; -----------------------------------------------------------

    .align 4
vPortStartFirstTask: .asmfunc
    ;/* Use the NVIC offset register to locate the stack. */
    ldr r0, NVICOffsetConst
    ldr r0, [r0]
    ldr r0, [r0]
    ;/* Set the msp back to the start of the stack. */
    msr msp, r0
    ;/* Clear the bit that indicates the FPU is in use in case the FPU was used
    ;before the scheduler was started - which would otherwise result in the
    ;unnecessary leaving of space in the SVC stack for lazy saving of FPU
    ;registers. */
    mov r0, #0
    msr control, r0
    ;/* Call SVC to start the first task. */
    cpsie i
    cpsie f
    dsb
    isb
    svc #0
    .endasmfunc

; -----------------------------------------------------------

    .align 4
vPortEnableVFP: .asmfunc
    ;/* The FPU enable bits are in the CPACR. */
    ldr.w r0, CPACRConst
    ldr r1, [r0]

    ;/* Enable CP10 and CP11 coprocessors, then save back. */
    orr r1, r1, #( 0xf << 20 )
    str r1, [r0]
    bx  r14
    .endasmfunc

    .end

; -----------------------------------------------------------
