xref: /Kernel-v10.6.2/portable/Paradigm/Tern_EE/small/portasm.h (revision ef7b253b56c9788077f5ecd6c9deb4021923d646)
1 /*
2  * FreeRTOS Kernel V10.6.2
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 #ifndef PORT_ASM_H
30 #define PORT_ASM_H
31 
32 typedef void TCB_t;
33 extern volatile TCB_t * volatile pxCurrentTCB;
34 extern void vTaskSwitchContext( void );
35 
36 /*
37  * Saves the stack pointer for one task into its TCB, calls
38  * vTaskSwitchContext() to update the TCB being used, then restores the stack
39  * from the new TCB read to run the task.
40  */
41 void portEND_SWITCHING_ISR( void );
42 
43 /*
44  * Load the stack pointer from the TCB of the task which is going to be first
45  * to execute.  Then force an IRET so the registers and IP are popped off the
46  * stack.
47  */
48 void portFIRST_CONTEXT( void );
49 
50 #define portEND_SWITCHING_ISR()                                         \
51                             asm { mov   bx, [pxCurrentTCB]          }   \
52                             asm { mov   word ptr [bx], sp           }   \
53                             asm { call  far ptr vTaskSwitchContext  }   \
54                             asm { mov   bx, [pxCurrentTCB]          }   \
55                             asm { mov   sp, [bx]                    }
56 
57 #define portFIRST_CONTEXT()                                         \
58                             asm { mov   bx, [pxCurrentTCB]          }   \
59                             asm { mov   sp, [bx]                    }   \
60                             asm { pop   bp                          }   \
61                             asm { pop   di                          }   \
62                             asm { pop   si                          }   \
63                             asm { pop   ds                          }   \
64                             asm { pop   es                          }   \
65                             asm { pop   dx                          }   \
66                             asm { pop   cx                          }   \
67                             asm { pop   bx                          }   \
68                             asm { pop   ax                          }   \
69                             asm { iret                              }
70 
71 
72 #endif
73