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