/*
 * 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
 *
 */

EXTERN pxCurrentTCB
EXTERN usCriticalNesting

#include "FreeRTOSConfig.h"

;
Context save and restore macro definitions
;

portSAVE_CONTEXT MACRO

               add - 0x0C, sp;
prepare stack to save necessary values
st.w           lp, 8[ sp ];
store LP to stack
               stsr    0, r31
    st.w lp, 4[ sp ];
store EIPC to stack
               stsr    1, lp
    st.w lp, 0[ sp ];
store EIPSW to stack
#if configDATA_MODE == 1; Using the Tiny data model
    prepare { r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30 }, 76, sp;
    save general purpose registers
    sst.w      r19, 72[ ep ]
    sst.w r18, 68[ ep ]
    sst.w r17, 64[ ep ]
    sst.w r16, 60[ ep ]
    sst.w r15, 56[ ep ]
    sst.w r14, 52[ ep ]
    sst.w r13, 48[ ep ]
    sst.w r12, 44[ ep ]
    sst.w r11, 40[ ep ]
    sst.w r10, 36[ ep ]
    sst.w r9, 32[ ep ]
    sst.w r8, 28[ ep ]
    sst.w r7, 24[ ep ]
    sst.w r6, 20[ ep ]
    sst.w r5, 16[ ep ]
    sst.w r4, 12[ ep ]
#else; Using the Small / Large data model
    prepare { r20, r21, r22, r23, r24, r26, r27, r28, r29, r30 }, 72, sp;
    save general purpose registers
    sst.w r19, 68[ ep ]
    sst.w r18, 64[ ep ]
    sst.w r17, 60[ ep ]
    sst.w r16, 56[ ep ]
    sst.w r15, 52[ ep ]
    sst.w r14, 48[ ep ]
    sst.w r13, 44[ ep ]
    sst.w r12, 40[ ep ]
    sst.w r11, 36[ ep ]
    sst.w r10, 32[ ep ]
    sst.w r9, 28[ ep ]
    sst.w r8, 24[ ep ]
    sst.w r7, 20[ ep ]
    sst.w r6, 16[ ep ]
    sst.w r5, 12[ ep ]
#endif /* configDATA_MODE */
sst.w r2, 8[ ep ]
sst.w r1, 4[ ep ]
MOVHI hi1( usCriticalNesting ), r0, r1;
save usCriticalNesting value to stack
ld.w  lw1( usCriticalNesting )[ r1 ], r2
sst.w r2, 0[ ep ]
MOVHI hi1( pxCurrentTCB ), r0, r1;
save SP to top of current TCB
ld.w  lw1( pxCurrentTCB )[ r1 ], r2
st.w sp, 0[ r2 ]
ENDM


portRESTORE_CONTEXT MACRO

MOVHI hi1( pxCurrentTCB ), r0, r1;
get Stackpointer address
ld.w  lw1( pxCurrentTCB )[ r1 ], sp
MOV sp, r1
ld.w    0[ r1 ], sp;
load stackpointer
MOV   sp, ep;
set stack pointer to element pointer
sld.w   0[ ep ], r1;
load usCriticalNesting value from stack
MOVHI hi1( usCriticalNesting ), r0, r2
st.w r1, lw1( usCriticalNesting )[ r2 ]
sld.w   4[ ep ], r1;
restore general purpose registers
sld.w   8[ ep ], r2
#if configDATA_MODE == 1; Using Tiny data model
    sld.w   12[ ep ], r4
    sld.w   16[ ep ], r5
    sld.w   20[ ep ], r6
    sld.w   24[ ep ], r7
    sld.w   28[ ep ], r8
    sld.w   32[ ep ], r9
    sld.w   36[ ep ], r10
    sld.w   40[ ep ], r11
    sld.w   44[ ep ], r12
    sld.w   48[ ep ], r13
    sld.w   52[ ep ], r14
    sld.w   56[ ep ], r15
    sld.w   60[ ep ], r16
    sld.w   64[ ep ], r17
    sld.w   68[ ep ], r18
    sld.w   72[ ep ], r19
    dispose 76, { r20, r21, r22, r23, r24, r25, r26, r27, r28, r29, r30 }
#else; Using Small / Large data model
    sld.w   12[ ep ], r5
    sld.w   16[ ep ], r6
    sld.w   20[ ep ], r7
    sld.w   24[ ep ], r8
    sld.w   28[ ep ], r9
    sld.w   32[ ep ], r10
    sld.w   36[ ep ], r11
    sld.w   40[ ep ], r12
    sld.w   44[ ep ], r13
    sld.w   48[ ep ], r14
    sld.w   52[ ep ], r15
    sld.w   56[ ep ], r16
    sld.w   60[ ep ], r17
    sld.w   64[ ep ], r18
    sld.w   68[ ep ], r19
    dispose 72, { r20, r21, r22, r23, r24, r26, r27, r28, r29, r30 }
#endif /* configDATA_MODE */
ld.w    0[ sp ], lp;
restore EIPSW from stack
ldsr lp, 1
ld.w    4[ sp ], lp;
restore EIPC from stack
ldsr lp, 0
ld.w    8[ sp ], lp;
restore LP from stack
     add     0x0C, sp;
set SP to right position

RETI

ENDM
