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

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]

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

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

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

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

    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}
    msr psp, r0
    isb
    mov r0, #0
    msr basepri, r0
    orr r14, #0xd
    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

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