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 29 #include "FreeRTOSConfig.h" 30 31 ; 32 Variables used by scheduler 33 ; 34 ------------------------------------------------------------------------------ 35 EXTERN pxCurrentTCB 36 EXTERN usCriticalNesting 37 38 ; 39 ------------------------------------------------------------------------------ 40 ; 41 portSAVE_CONTEXT MACRO 42 ; 43 Saves the context of the general purpose registers, CS and ES( only in far 44 ; 45 memory mode ) registers the usCriticalNesting Value and the Stack Pointer 46 ; 47 of the active Task onto the task stack 48 ; 49 ------------------------------------------------------------------------------ 50 portSAVE_CONTEXT MACRO 51 52 PUSH AX; 53 Save AX Register to stack. 54 PUSH HL 55 MOV A, CS; 56 Save CS register. 57 XCH A, X 58 MOV A, ES; 59 Save ES register. 60 PUSH AX 61 PUSH DE; 62 Save the remaining general purpose registers. 63 PUSH BC 64 MOVW AX, usCriticalNesting; 65 Save the usCriticalNesting value. 66 PUSH AX 67 MOVW AX, pxCurrentTCB; 68 Save the Stack pointer. 69 MOVW HL, AX 70 MOVW AX, SP 71 MOVW[ HL ], AX 72 ENDM 73 ; 74 ------------------------------------------------------------------------------ 75 76 ; 77 ------------------------------------------------------------------------------ 78 ; 79 portRESTORE_CONTEXT MACRO 80 ; 81 Restores the task Stack Pointer then use this to restore usCriticalNesting, 82 ; 83 general purpose registers and the CS and ES( only in far memory mode ) 84 ; 85 of the selected task from the task stack 86 ; 87 ------------------------------------------------------------------------------ 88 portRESTORE_CONTEXT MACRO 89 MOVW AX, pxCurrentTCB; 90 Restore the Stack pointer. 91 MOVW HL, AX 92 MOVW AX, [ HL ] 93 MOVW SP, AX 94 POP AX; 95 Restore usCriticalNesting value. 96 MOVW usCriticalNesting, AX 97 POP BC; 98 Restore the necessary general purpose registers. 99 POP DE 100 POP AX; 101 Restore the ES register. 102 MOV ES, A 103 XCH A, X; 104 Restore the CS register. 105 MOV CS, A 106 POP HL; 107 Restore general purpose register HL. 108 POP AX; 109 Restore AX. 110 ENDM 111 ; 112 ------------------------------------------------------------------------------ 113