source: rtems/cpukit/score/cpu/arm/arm-context-validate.S @ 0daa8ab

Last change on this file since 0daa8ab was 0daa8ab, checked in by Sebastian Huber <sebastian.huber@…>, on Aug 10, 2017 at 7:03:36 AM

arm: Use ARM code on Thumb 1 targets

Update #3093.

  • Property mode set to 100644
File size: 6.0 KB
Line 
1/*
2 * Copyright (c) 2013, 2017 embedded brains GmbH.  All rights reserved.
3 *
4 *  embedded brains GmbH
5 *  Dornierstr. 4
6 *  82178 Puchheim
7 *  Germany
8 *  <rtems@embedded-brains.de>
9 *
10 * The license and distribution terms for this file may be
11 * found in the file LICENSE in this distribution or at
12 * http://www.rtems.org/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <rtems/asm.h>
20#include <rtems/score/cpu.h>
21
22#define FRAME_OFFSET_R4 0
23#define FRAME_OFFSET_R5 4
24#define FRAME_OFFSET_R6 8
25#define FRAME_OFFSET_R7 12
26#define FRAME_OFFSET_R8 16
27#define FRAME_OFFSET_R9 20
28#define FRAME_OFFSET_R10 24
29#define FRAME_OFFSET_R11 28
30#define FRAME_OFFSET_LR 32
31
32#ifdef ARM_MULTILIB_VFP
33  #define FRAME_OFFSET_D8 40
34  #define FRAME_OFFSET_D9 48
35  #define FRAME_OFFSET_D10 56
36  #define FRAME_OFFSET_D11 64
37  #define FRAME_OFFSET_D12 72
38  #define FRAME_OFFSET_D13 80
39  #define FRAME_OFFSET_D14 88
40  #define FRAME_OFFSET_D15 96
41
42  #define FRAME_SIZE (FRAME_OFFSET_D15 + 8)
43#else
44  #define FRAME_SIZE (FRAME_OFFSET_LR + 4)
45#endif
46
47        .syntax unified
48        .section        .text
49
50#ifdef __thumb2__
51FUNCTION_THUMB_ENTRY(_CPU_Context_validate)
52#else
53FUNCTION_ENTRY(_CPU_Context_validate)
54#endif
55
56        /* Save */
57
58        sub     sp, sp, #FRAME_SIZE
59
60        mov     r1, r4
61        str     r1, [sp, #FRAME_OFFSET_R4]
62        mov     r1, r5
63        str     r1, [sp, #FRAME_OFFSET_R5]
64        mov     r1, r6
65        str     r1, [sp, #FRAME_OFFSET_R6]
66        mov     r1, r7
67        str     r1, [sp, #FRAME_OFFSET_R7]
68        mov     r1, r8
69        str     r1, [sp, #FRAME_OFFSET_R8]
70        mov     r1, r9
71        str     r1, [sp, #FRAME_OFFSET_R9]
72        mov     r1, r10
73        str     r1, [sp, #FRAME_OFFSET_R10]
74        mov     r1, r11
75        str     r1, [sp, #FRAME_OFFSET_R11]
76        mov     r1, lr
77        str     r1, [sp, #FRAME_OFFSET_LR]
78
79#ifdef ARM_MULTILIB_VFP
80        vstr    d8, [sp, #FRAME_OFFSET_D8]
81        vstr    d9, [sp, #FRAME_OFFSET_D9]
82        vstr    d10, [sp, #FRAME_OFFSET_D10]
83        vstr    d11, [sp, #FRAME_OFFSET_D11]
84        vstr    d12, [sp, #FRAME_OFFSET_D12]
85        vstr    d13, [sp, #FRAME_OFFSET_D13]
86        vstr    d14, [sp, #FRAME_OFFSET_D14]
87        vstr    d15, [sp, #FRAME_OFFSET_D15]
88#endif
89
90        /* Fill */
91
92        /* R1 is used for temporary values */
93        mov     r1, r0
94
95        /* R2 contains the stack pointer */
96        mov     r2, sp
97
98.macro fill_register reg
99        add     r1, r1, #1
100        mov     \reg, r1
101.endm
102
103
104#ifdef ARM_MULTILIB_VFP
105        /* R3 contains the FPSCR */
106        vmrs    r3, FPSCR
107        ldr     r4, =0xf000001f
108        bic     r3, r3, r4
109        and     r4, r4, r0
110        orr     r3, r3, r4
111        vmsr    FPSCR, r3
112#else
113        fill_register   r3
114#endif
115
116        fill_register   r4
117        fill_register   r5
118        fill_register   r6
119        fill_register   r7
120        fill_register   r8
121        fill_register   r9
122        fill_register   r10
123        fill_register   r11
124        fill_register   r12
125        fill_register   lr
126
127#ifdef ARM_MULTILIB_VFP
128.macro fill_vfp_register reg
129        add     r1, r1, #1
130        vmov    \reg, r1, r1
131.endm
132
133        fill_vfp_register       d0
134        fill_vfp_register       d1
135        fill_vfp_register       d2
136        fill_vfp_register       d3
137        fill_vfp_register       d4
138        fill_vfp_register       d5
139        fill_vfp_register       d6
140        fill_vfp_register       d7
141        fill_vfp_register       d8
142        fill_vfp_register       d9
143        fill_vfp_register       d10
144        fill_vfp_register       d11
145        fill_vfp_register       d12
146        fill_vfp_register       d13
147        fill_vfp_register       d14
148        fill_vfp_register       d15
149#ifdef ARM_MULTILIB_VFP_D32
150        fill_vfp_register       d16
151        fill_vfp_register       d17
152        fill_vfp_register       d18
153        fill_vfp_register       d19
154        fill_vfp_register       d20
155        fill_vfp_register       d21
156        fill_vfp_register       d22
157        fill_vfp_register       d23
158        fill_vfp_register       d24
159        fill_vfp_register       d25
160        fill_vfp_register       d26
161        fill_vfp_register       d27
162        fill_vfp_register       d28
163        fill_vfp_register       d29
164        fill_vfp_register       d30
165        fill_vfp_register       d31
166#endif /* ARM_MULTILIB_VFP_D32 */
167#endif /* ARM_MULTILIB_VFP */
168
169        /* Check */
170check:
171
172.macro check_register reg
173        add     r1, r1, #1
174        cmp     \reg, r1
175        bne     restore
176.endm
177
178        /* A compare involving the stack pointer is deprecated */
179        mov     r1, sp
180        cmp     r2, r1
181        bne     restore
182
183        mov     r1, r0
184
185#ifdef __thumb2__
186        cmp     r1, r1
187        itttt   eq
188        addeq   r1, #1
189        addeq   r1, #2
190        addeq   r1, #4
191        addeq   r1, #8
192        subs    r1, #15
193        cmp     r1, r0
194        bne     restore
195        cmp     r1, r1
196        iteee   eq
197        addeq   r1, #1
198        addne   r1, #2
199        addne   r1, #4
200        addne   r1, #8
201        subs    r1, #1
202        cmp     r1, r0
203        bne     restore
204#endif
205
206#ifndef ARM_MULTILIB_VFP
207        check_register  r3
208#endif
209
210        check_register  r4
211        check_register  r5
212        check_register  r6
213        check_register  r7
214        check_register  r8
215        check_register  r9
216        check_register  r10
217        check_register  r11
218        check_register  r12
219        check_register  lr
220
221#ifdef ARM_MULTILIB_VFP
222        b       check_vfp
223#endif
224
225        b       check
226
227        /* Restore */
228restore:
229
230        ldr     r1, [sp, #FRAME_OFFSET_R4]
231        mov     r4, r1
232        ldr     r1, [sp, #FRAME_OFFSET_R5]
233        mov     r5, r1
234        ldr     r1, [sp, #FRAME_OFFSET_R6]
235        mov     r6, r1
236        ldr     r1, [sp, #FRAME_OFFSET_R7]
237        mov     r7, r1
238        ldr     r1, [sp, #FRAME_OFFSET_R8]
239        mov     r8, r1
240        ldr     r1, [sp, #FRAME_OFFSET_R9]
241        mov     r9, r1
242        ldr     r1, [sp, #FRAME_OFFSET_R10]
243        mov     r10, r1
244        ldr     r1, [sp, #FRAME_OFFSET_R11]
245        mov     r11, r1
246        ldr     r1, [sp, #FRAME_OFFSET_LR]
247        mov     lr, r1
248
249#ifdef ARM_MULTILIB_VFP
250        vldr    d8, [sp, #FRAME_OFFSET_D8]
251        vldr    d9, [sp, #FRAME_OFFSET_D9]
252        vldr    d10, [sp, #FRAME_OFFSET_D10]
253        vldr    d11, [sp, #FRAME_OFFSET_D11]
254        vldr    d12, [sp, #FRAME_OFFSET_D12]
255        vldr    d13, [sp, #FRAME_OFFSET_D13]
256        vldr    d14, [sp, #FRAME_OFFSET_D14]
257        vldr    d15, [sp, #FRAME_OFFSET_D15]
258#endif
259
260        add     sp, sp, #FRAME_SIZE
261
262        bx      lr
263
264FUNCTION_END(_CPU_Context_validate)
265
266#ifdef ARM_MULTILIB_VFP
267check_vfp:
268
269.macro check_vfp_register reg
270        add     r1, r1, #1
271        vmov    r4, r5, \reg
272        cmp     r4, r5
273        bne     1f
274        cmp     r1, r4
275        bne     1f
276        b       2f
2771:
278        b       restore
2792:
280.endm
281
282        vmrs    r4, FPSCR
283        cmp     r4, r3
284        bne     restore
285
286        check_vfp_register      d0
287        check_vfp_register      d1
288        check_vfp_register      d2
289        check_vfp_register      d3
290        check_vfp_register      d4
291        check_vfp_register      d5
292        check_vfp_register      d6
293        check_vfp_register      d7
294        check_vfp_register      d8
295        check_vfp_register      d9
296        check_vfp_register      d10
297        check_vfp_register      d11
298        check_vfp_register      d12
299        check_vfp_register      d13
300        check_vfp_register      d14
301        check_vfp_register      d15
302#ifdef ARM_MULTILIB_VFP_D32
303        check_vfp_register      d16
304        check_vfp_register      d17
305        check_vfp_register      d18
306        check_vfp_register      d19
307        check_vfp_register      d20
308        check_vfp_register      d21
309        check_vfp_register      d22
310        check_vfp_register      d23
311        check_vfp_register      d24
312        check_vfp_register      d25
313        check_vfp_register      d26
314        check_vfp_register      d27
315        check_vfp_register      d28
316        check_vfp_register      d29
317        check_vfp_register      d30
318        check_vfp_register      d31
319#endif /* ARM_MULTILIB_VFP_D32 */
320
321        /* Restore r4 and r5 */
322        mov     r1, r0
323        fill_register   r4
324        fill_register   r5
325
326        b       check
327#endif /* ARM_MULTILIB_VFP */
Note: See TracBrowser for help on using the repository browser.