]> begriffs open source - freertos/blob - portable/IAR/V850ES/ISR_Support.h
[AUTO][RELEASE]: Bump file header version to "10.6.2"
[freertos] / portable / IAR / V850ES / ISR_Support.h
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     EXTERN pxCurrentTCB
30     EXTERN usCriticalNesting
31
32 #include "FreeRTOSConfig.h"
33
34 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
35 ; Context save and restore macro definitions
36 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
37
38 portSAVE_CONTEXT MACRO
39
40     add     -0x0C,sp            ; prepare stack to save necessary values
41     st.w    lp,8[sp]            ; store LP to stack
42     stsr    0,r31
43     st.w    lp,4[sp]            ; store EIPC to stack
44     stsr    1,lp
45     st.w    lp,0[sp]            ; store EIPSW to stack
46 #if configDATA_MODE == 1                                        ; Using the Tiny data model
47     prepare {r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30},76,sp ; save general purpose registers
48     sst.w   r19,72[ep]
49     sst.w   r18,68[ep]
50     sst.w   r17,64[ep]
51     sst.w   r16,60[ep]
52     sst.w   r15,56[ep]
53     sst.w   r14,52[ep]
54     sst.w   r13,48[ep]
55     sst.w   r12,44[ep]
56     sst.w   r11,40[ep]
57     sst.w   r10,36[ep]
58     sst.w   r9,32[ep]
59     sst.w   r8,28[ep]
60     sst.w   r7,24[ep]
61     sst.w   r6,20[ep]
62     sst.w   r5,16[ep]
63     sst.w   r4,12[ep]
64 #else                                                           ; Using the Small/Large data model
65     prepare {r20,r21,r22,r23,r24,r26,r27,r28,r29,r30},72,sp     ; save general purpose registers
66     sst.w   r19,68[ep]
67     sst.w   r18,64[ep]
68     sst.w   r17,60[ep]
69     sst.w   r16,56[ep]
70     sst.w   r15,52[ep]
71     sst.w   r14,48[ep]
72     sst.w   r13,44[ep]
73     sst.w   r12,40[ep]
74     sst.w   r11,36[ep]
75     sst.w   r10,32[ep]
76     sst.w   r9,28[ep]
77     sst.w   r8,24[ep]
78     sst.w   r7,20[ep]
79     sst.w   r6,16[ep]
80     sst.w   r5,12[ep]
81 #endif /* configDATA_MODE */
82     sst.w   r2,8[ep]
83     sst.w   r1,4[ep]
84     MOVHI   hi1(usCriticalNesting),r0,r1    ; save usCriticalNesting value to stack
85     ld.w    lw1(usCriticalNesting)[r1],r2
86     sst.w   r2,0[ep]
87     MOVHI   hi1(pxCurrentTCB),r0,r1         ; save SP to top of current TCB
88     ld.w    lw1(pxCurrentTCB)[r1],r2
89     st.w    sp,0[r2]
90     ENDM
91
92
93 portRESTORE_CONTEXT MACRO
94
95     MOVHI   hi1(pxCurrentTCB),r0,r1         ; get Stackpointer address
96     ld.w    lw1(pxCurrentTCB)[r1],sp
97     MOV     sp,r1
98     ld.w    0[r1],sp                        ; load stackpointer
99     MOV     sp,ep                           ; set stack pointer to element pointer
100     sld.w   0[ep],r1                        ; load usCriticalNesting value from stack
101     MOVHI   hi1(usCriticalNesting),r0,r2
102     st.w    r1,lw1(usCriticalNesting)[r2]
103     sld.w   4[ep],r1                        ; restore general purpose registers
104     sld.w   8[ep],r2
105 #if configDATA_MODE == 1                    ; Using Tiny data model
106     sld.w   12[ep],r4
107     sld.w   16[ep],r5
108     sld.w   20[ep],r6
109     sld.w   24[ep],r7
110     sld.w   28[ep],r8
111     sld.w   32[ep],r9
112     sld.w   36[ep],r10
113     sld.w   40[ep],r11
114     sld.w   44[ep],r12
115     sld.w   48[ep],r13
116     sld.w   52[ep],r14
117     sld.w   56[ep],r15
118     sld.w   60[ep],r16
119     sld.w   64[ep],r17
120     sld.w   68[ep],r18
121     sld.w   72[ep],r19
122     dispose 76,{r20,r21,r22,r23,r24,r25,r26,r27,r28,r29,r30}
123 #else                                       ; Using Small/Large data model
124     sld.w   12[ep],r5
125     sld.w   16[ep],r6
126     sld.w   20[ep],r7
127     sld.w   24[ep],r8
128     sld.w   28[ep],r9
129     sld.w   32[ep],r10
130     sld.w   36[ep],r11
131     sld.w   40[ep],r12
132     sld.w   44[ep],r13
133     sld.w   48[ep],r14
134     sld.w   52[ep],r15
135     sld.w   56[ep],r16
136     sld.w   60[ep],r17
137     sld.w   64[ep],r18
138     sld.w   68[ep],r19
139     dispose 72,{r20,r21,r22,r23,r24,r26,r27,r28,r29,r30}
140 #endif /* configDATA_MODE */
141     ld.w    0[sp],lp                        ; restore EIPSW from stack
142     ldsr    lp,1
143     ld.w    4[sp],lp                        ; restore EIPC from stack
144     ldsr    lp,0
145     ld.w    8[sp],lp                        ; restore LP from stack
146     add     0x0C,sp                         ; set SP to right position
147
148     RETI
149
150     ENDM