1 ; /* 2 * ; * FreeRTOS Kernel V11.1.0 3 * ; * Copyright (C) 2021 Amazon.com, Inc. or its affiliates. All Rights Reserved. 4 * ; * 5 * ; * SPDX-License-Identifier: MIT 6 * ; * 7 * ; * Permission is hereby granted, free of charge, to any person obtaining a copy of 8 * ; * this software and associated documentation files (the "Software"), to deal in 9 * ; * the Software without restriction, including without limitation the rights to 10 * ; * use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of 11 * ; * the Software, and to permit persons to whom the Software is furnished to do so, 12 * ; * subject to the following conditions: 13 * ; * 14 * ; * The above copyright notice and this permission notice shall be included in all 15 * ; * copies or substantial portions of the Software. 16 * ; * 17 * ; * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 18 * ; * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS 19 * ; * FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR 20 * ; * COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER 21 * ; * IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN 22 * ; * CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE. 23 * ; * 24 * ; * https://www.FreeRTOS.org 25 * ; * https://github.com/FreeRTOS 26 * ; * 27 * ; */ 28 EXTERN pxCurrentTCB 29 EXTERN ulCriticalNesting 30 31 ; 32 Context save and restore macro definitions 33 ; 34 35 portSAVE_CONTEXT MACRO 36 37 ; 38 Push R0 as we are going to use the register. 39 STMDB SP !, { 40 R0 41 } 42 43 Set R0 to point to the task stack pointer. 44 STMDB SP, { 45 SP 46 } 47 ^ 48 NOP 49 SUB SP, SP, # 4 50 LDMIA SP !, { 51 R0 52 } 53 54 ; 55 Push the return address onto the stack. 56 STMDB R0 !, { 57 LR 58 } 59 60 Now we have saved LR we can use it instead of R0. 61 MOV LR, R0 62 63 ; 64 65 Pop R0 so we can save it onto the system mode stack. 66 LDMIA SP !, { 67 R0 68 } 69 70 Push all the system mode registers onto the task stack. 71 STMDB LR, { 72 R0 - LR 73 } 74 ^ 75 NOP 76 SUB LR, LR, # 60 77 78 ; 79 Push the SPSR onto the task stack. 80 MRS R0, SPSR 81 STMDB LR !, { 82 R0 83 } 84 85 LDR R0, = ulCriticalNesting 86 LDR R0, [ R0 ] 87 STMDB LR !, { 88 R0 89 } 90 91 Store the new top of stack 92 93 for the task. 94 LDR R1, = pxCurrentTCB 95 LDR R0, [ R1 ] 96 STR LR, [ R0 ] 97 98 ENDM 99 100 101 portRESTORE_CONTEXT MACRO 102 103 ; 104 Set the LR to the task stack. 105 LDR R1, = pxCurrentTCB 106 LDR R0, [ R1 ] 107 LDR LR, [ R0 ] 108 109 ; 110 The critical nesting depth is the first item on the stack. 111 ; 112 Load it into the ulCriticalNesting variable. 113 LDR R0, = ulCriticalNesting 114 LDMFD LR !, { 115 R1 116 } 117 118 STR R1, [ R0 ] 119 120 ; 121 Get the SPSR from the stack. 122 LDMFD LR !, { 123 R0 124 } 125 MSR SPSR_cxsf, R0 126 127 ; 128 Restore all system mode registers 129 130 for the task. 131 LDMFD LR, { 132 R0 - R14 133 } 134 135 ^ 136 NOP 137 138 ; 139 Restore the return address. 140 LDR LR, [ LR, # + 60 ] 141 142 ; 143 144 And return -correcting the offset in the LR to obtain the 145 ; 146 147 correct address. 148 SUBS PC, LR, # 4 149 150 ENDM 151