source: rtems/cpukit/score/cpu/aarch64/aarch64-context-validate.S @ 9165349d

Last change on this file since 9165349d was f046af5, checked in by Kinsey Moore <kinsey.moore@…>, on 12/07/20 at 20:51:10

cpukit/aarch64: Use hex consistently for offsets

  • Property mode set to 100644
File size: 6.7 KB
Line 
1/* SPDX-License-Identifier: BSD-2-Clause */
2
3/**
4 * @file
5 *
6 * @ingroup RTEMSScoreCPUAArch64
7 *
8 * @brief Implementation of _CPU_Context_validate
9 *
10 * This file implements _CPU_Context_validate for use in spcontext01.
11 */
12
13/*
14 * Copyright (C) 2020 On-Line Applications Research Corporation (OAR)
15 * Written by Kinsey Moore <kinsey.moore@oarcorp.com>
16 *
17 * Redistribution and use in source and binary forms, with or without
18 * modification, are permitted provided that the following conditions
19 * are met:
20 * 1. Redistributions of source code must retain the above copyright
21 *    notice, this list of conditions and the following disclaimer.
22 * 2. Redistributions in binary form must reproduce the above copyright
23 *    notice, this list of conditions and the following disclaimer in the
24 *    documentation and/or other materials provided with the distribution.
25 *
26 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
27 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
28 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
29 * ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
30 * LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
31 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
32 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
33 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
34 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
35 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE
36 * POSSIBILITY OF SUCH DAMAGE.
37 */
38
39#ifdef HAVE_CONFIG_H
40#include "config.h"
41#endif
42
43#include <rtems/asm.h>
44#include <rtems/score/cpu.h>
45
46#define FRAME_OFFSET_X4  0x00
47#define FRAME_OFFSET_X5  0x08
48#define FRAME_OFFSET_X6  0x10
49#define FRAME_OFFSET_X7  0x18
50#define FRAME_OFFSET_X8  0x20
51#define FRAME_OFFSET_X9  0x28
52#define FRAME_OFFSET_X10 0x30
53#define FRAME_OFFSET_X11 0x38
54#define FRAME_OFFSET_LR  0x40
55
56#ifdef AARCH64_MULTILIB_VFP
57  #define FRAME_OFFSET_V8  0x48
58  #define FRAME_OFFSET_V9  0x58
59  #define FRAME_OFFSET_V10 0x68
60  #define FRAME_OFFSET_V11 0x78
61  #define FRAME_OFFSET_V12 0x88
62  #define FRAME_OFFSET_V13 0x98
63  #define FRAME_OFFSET_V14 0xA8
64  #define FRAME_OFFSET_V15 0xB8
65
66  #define FRAME_SIZE (FRAME_OFFSET_V15 + 0x10)
67#else
68  #define FRAME_SIZE (FRAME_OFFSET_LR + 0x08)
69#endif
70
71        .section        .text
72
73FUNCTION_ENTRY(_CPU_Context_validate)
74
75        /* Save */
76
77        sub     sp, sp, #FRAME_SIZE
78
79        str     x4, [sp, #FRAME_OFFSET_X4]
80        str     x5, [sp, #FRAME_OFFSET_X5]
81        str     x6, [sp, #FRAME_OFFSET_X6]
82        str     x7, [sp, #FRAME_OFFSET_X7]
83        str     x8, [sp, #FRAME_OFFSET_X8]
84        str     x9, [sp, #FRAME_OFFSET_X9]
85        str     x10, [sp, #FRAME_OFFSET_X10]
86        str     x11, [sp, #FRAME_OFFSET_X11]
87        str     lr, [sp, #FRAME_OFFSET_LR]
88
89#ifdef AARCH64_MULTILIB_VFP
90        str     d8, [sp, #FRAME_OFFSET_V8]
91        str     d9, [sp, #FRAME_OFFSET_V9]
92        str     d10, [sp, #FRAME_OFFSET_V10]
93        str     d11, [sp, #FRAME_OFFSET_V11]
94        str     d12, [sp, #FRAME_OFFSET_V12]
95        str     d13, [sp, #FRAME_OFFSET_V13]
96        str     d14, [sp, #FRAME_OFFSET_V14]
97        str     d15, [sp, #FRAME_OFFSET_V15]
98#endif
99
100        /* Fill */
101
102        /* R1 is used for temporary values */
103        mov     x1, x0
104
105        /* R2 contains the stack pointer */
106        mov     x2, sp
107
108.macro fill_register reg
109        add     x1, x1, #1
110        mov     \reg, x1
111.endm
112
113
114#ifdef AARCH64_MULTILIB_VFP
115        /* X3 contains the FPSCR */
116        mrs     x3, FPSR
117        ldr     x4, =0xf000001f
118        bic     x3, x3, x4
119        and     x4, x4, x0
120        orr     x3, x3, x4
121        msr     FPSR, x3
122#else
123        fill_register   x3
124#endif
125
126        fill_register   x4
127        fill_register   x5
128        fill_register   x6
129        fill_register   x7
130        fill_register   x8
131        fill_register   x9
132        fill_register   x10
133        fill_register   x11
134        fill_register   x12
135        fill_register   lr
136
137#ifdef AARCH64_MULTILIB_VFP
138.macro fill_vfp_register regnum
139        add     x1, x1, #1
140        fmov    d\regnum\(), x1
141        fmov    v\regnum\().D[1], x1
142.endm
143
144        fill_vfp_register       0
145        fill_vfp_register       1
146        fill_vfp_register       2
147        fill_vfp_register       3
148        fill_vfp_register       4
149        fill_vfp_register       5
150        fill_vfp_register       6
151        fill_vfp_register       7
152        fill_vfp_register       8
153        fill_vfp_register       9
154        fill_vfp_register       10
155        fill_vfp_register       11
156        fill_vfp_register       12
157        fill_vfp_register       13
158        fill_vfp_register       14
159        fill_vfp_register       15
160        fill_vfp_register       16
161        fill_vfp_register       17
162        fill_vfp_register       18
163        fill_vfp_register       19
164        fill_vfp_register       20
165        fill_vfp_register       21
166        fill_vfp_register       22
167        fill_vfp_register       23
168        fill_vfp_register       24
169        fill_vfp_register       25
170        fill_vfp_register       26
171        fill_vfp_register       27
172        fill_vfp_register       28
173        fill_vfp_register       29
174        fill_vfp_register       30
175        fill_vfp_register       31
176#endif /* AARCH64_MULTILIB_VFP */
177
178        /* Check */
179check:
180
181.macro check_register reg
182        add     x1, x1, #1
183        cmp     \reg, x1
184        bne     restore
185.endm
186
187        /* A compare involving the stack pointer is deprecated */
188        mov     x1, sp
189        cmp     x2, x1
190        bne     restore
191
192        mov     x1, x0
193
194#ifndef AARCH64_MULTILIB_VFP
195        check_register  x3
196#endif
197
198        check_register  x4
199        check_register  x5
200        check_register  x6
201        check_register  x7
202        check_register  x8
203        check_register  x9
204        check_register  x10
205        check_register  x11
206        check_register  x12
207        check_register  lr
208
209#ifdef AARCH64_MULTILIB_VFP
210        b       check_vfp
211#endif
212
213        b       check
214
215        /* Restore */
216restore:
217
218        ldr     x4, [sp, #FRAME_OFFSET_X4]
219        ldr     x5, [sp, #FRAME_OFFSET_X5]
220        ldr     x6, [sp, #FRAME_OFFSET_X6]
221        ldr     x7, [sp, #FRAME_OFFSET_X7]
222        ldr     x8, [sp, #FRAME_OFFSET_X8]
223        ldr     x9, [sp, #FRAME_OFFSET_X9]
224        ldr     x10, [sp, #FRAME_OFFSET_X10]
225        ldr     x11, [sp, #FRAME_OFFSET_X11]
226        ldr     lr, [sp, #FRAME_OFFSET_LR]
227
228#ifdef AARCH64_MULTILIB_VFP
229        ldr     d8, [sp, #FRAME_OFFSET_V8]
230        ldr     d9, [sp, #FRAME_OFFSET_V9]
231        ldr     d10, [sp, #FRAME_OFFSET_V10]
232        ldr     d11, [sp, #FRAME_OFFSET_V11]
233        ldr     d12, [sp, #FRAME_OFFSET_V12]
234        ldr     d13, [sp, #FRAME_OFFSET_V13]
235        ldr     d14, [sp, #FRAME_OFFSET_V14]
236        ldr     d15, [sp, #FRAME_OFFSET_V15]
237#endif
238
239        add     sp, sp, #FRAME_SIZE
240
241        ret
242
243FUNCTION_END(_CPU_Context_validate)
244
245#ifdef AARCH64_MULTILIB_VFP
246check_vfp:
247
248.macro check_vfp_register regnum
249        add     x1, x1, #1
250        fmov    x4, d\regnum
251        fmov    x5, v\regnum\().D[1]
252        cmp     x5, x4
253        bne     1f
254        cmp     x1, x4
255        bne     1f
256        b       2f
2571:
258        b       restore
2592:
260.endm
261
262        mrs     x4, FPSR
263        cmp     x4, x3
264        bne     restore
265
266        check_vfp_register      0
267        check_vfp_register      1
268        check_vfp_register      2
269        check_vfp_register      3
270        check_vfp_register      4
271        check_vfp_register      5
272        check_vfp_register      6
273        check_vfp_register      7
274        check_vfp_register      8
275        check_vfp_register      9
276        check_vfp_register      10
277        check_vfp_register      11
278        check_vfp_register      12
279        check_vfp_register      13
280        check_vfp_register      14
281        check_vfp_register      15
282        check_vfp_register      16
283        check_vfp_register      17
284        check_vfp_register      18
285        check_vfp_register      19
286        check_vfp_register      20
287        check_vfp_register      21
288        check_vfp_register      22
289        check_vfp_register      23
290        check_vfp_register      24
291        check_vfp_register      25
292        check_vfp_register      26
293        check_vfp_register      27
294        check_vfp_register      28
295        check_vfp_register      29
296        check_vfp_register      30
297        check_vfp_register      31
298
299        /* Restore x4 and x5 */
300        mov     x1, x0
301        fill_register   x4
302        fill_register   x5
303
304        b       check
305#endif /* AARCH64_MULTILIB_VFP */
Note: See TracBrowser for help on using the repository browser.