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