; /*
   * ; * FreeRTOS Kernel V10.3.1
   * ; * Copyright (C) 2020 Amazon.com, Inc. or its affiliates.  All Rights Reserved.
   * ; *
   * ; * 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.
   * ; *
   * ; * http://www.FreeRTOS.org
   * ; * http://aws.amazon.com/freertos
   * ; *
   * ; * 1 tab == 4 spaces!
   * ; */

EXTERN pxCurrentTCB
EXTERN ulCriticalNesting

;
Context save and restore macro definitions
;

portSAVE_CONTEXT MACRO

;
Push R0 as we are going to use the register.
   STMDB SP !, { R0 }

;
Set R0 to point to the task stack pointer.
   STMDB SP, { SP } ^
NOP
SUB SP, SP, # 4
LDMIA SP !, { R0 }

;
Push the return address onto the stack.
          STMDB R0 !, { LR }

;

Now we have saved LR we can use it instead of R0.
   MOV LR, R0

;
Pop R0 so we can save it onto the system mode stack.
   LDMIA SP !, { R0 }

;
Push all the system mode registers onto the task stack.
   STMDB LR, { R0 - LR } ^
NOP
SUB LR, LR, # 60

;
Push the SPSR onto the task stack.
   MRS R0, SPSR
STMDB LR !, { R0 }

LDR R0, = ulCriticalNesting
          LDR R0, [ R0 ]
STMDB LR !, { R0 }

;
Store the new top of stack for the task.
   LDR R1, = pxCurrentTCB
             LDR R0, [ R1 ]
STR LR, [ R0 ]

ENDM


portRESTORE_CONTEXT MACRO

;
Set the LR to the task stack.
   LDR R1, = pxCurrentTCB
             LDR R0, [ R1 ]
LDR LR, [ R0 ]

;
The critical nesting depth is the first item on the stack.
   ;
Load it into the ulCriticalNesting variable.
   LDR R0, = ulCriticalNesting
             LDMFD LR !, { R1 }
STR R1, [ R0 ]

;
Get the SPSR from the stack.
   LDMFD LR !, { R0 }
MSR SPSR_cxsf, R0

;
Restore all system mode registers for the task.
   LDMFD LR, { R0 - R14 } ^
NOP

;
Restore the return address.
          LDR LR, [ LR, # + 60 ]

;

And return -correcting the offset in the LR to obtain the
;

correct address.
   SUBS PC, LR, # 4

ENDM
