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