source: rtems/cpukit/score/cpu/arm/arm-context-validate.S @ 39993d6

4.115
Last change on this file since 39993d6 was 39993d6, checked in by Sebastian Huber <sebastian.huber@…>, on May 7, 2013 at 8:14:55 AM

score: Add CPU context validation

  • Property mode set to 100644
File size: 2.4 KB
Line 
1/*
2 * Copyright (c) 2013 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.com/license/LICENSE.
13 */
14
15#ifdef HAVE_CONFIG_H
16  #include "config.h"
17#endif
18
19#include <rtems/asm.h>
20
21#define FRAME_OFFSET_R4 0
22#define FRAME_OFFSET_R5 4
23#define FRAME_OFFSET_R6 8
24#define FRAME_OFFSET_R7 12
25#define FRAME_OFFSET_R8 16
26#define FRAME_OFFSET_R9 20
27#define FRAME_OFFSET_R10 24
28#define FRAME_OFFSET_R11 28
29#define FRAME_OFFSET_LR 32
30
31#define FRAME_SIZE (FRAME_OFFSET_LR + 4)
32
33        .section        .text
34
35FUNCTION_THUMB_ENTRY(_CPU_Context_validate)
36
37        /* Save */
38
39        sub     sp, sp, #FRAME_SIZE
40
41        mov     r1, r4
42        str     r1, [sp, #FRAME_OFFSET_R4]
43        mov     r1, r5
44        str     r1, [sp, #FRAME_OFFSET_R5]
45        mov     r1, r6
46        str     r1, [sp, #FRAME_OFFSET_R6]
47        mov     r1, r7
48        str     r1, [sp, #FRAME_OFFSET_R7]
49        mov     r1, r8
50        str     r1, [sp, #FRAME_OFFSET_R8]
51        mov     r1, r9
52        str     r1, [sp, #FRAME_OFFSET_R9]
53        mov     r1, r10
54        str     r1, [sp, #FRAME_OFFSET_R10]
55        mov     r1, r11
56        str     r1, [sp, #FRAME_OFFSET_R11]
57        mov     r1, lr
58        str     r1, [sp, #FRAME_OFFSET_LR]
59
60        /* Fill */
61
62        /* R1 is used for temporary values */
63        mov     r1, r0
64
65        /* R2 contains the stack pointer */
66        mov     r2, sp
67
68.macro fill_register reg
69        add     r1, r1, #1
70        mov     \reg, r1
71.endm
72
73        fill_register   r3
74        fill_register   r4
75        fill_register   r5
76        fill_register   r6
77        fill_register   r7
78        fill_register   r8
79        fill_register   r9
80        fill_register   r10
81        fill_register   r11
82        fill_register   r12
83        fill_register   lr
84
85        /* Check */
86check:
87
88.macro check_register reg
89        add     r1, r1, #1
90        cmp     \reg, r1
91        bne     restore
92.endm
93
94        cmp     r2, sp
95        bne     restore
96
97        mov     r1, r0
98
99        check_register  r3
100        check_register  r4
101        check_register  r5
102        check_register  r6
103        check_register  r7
104        check_register  r8
105        check_register  r9
106        check_register  r10
107        check_register  r11
108        check_register  r12
109        check_register  lr
110
111        b       check
112
113        /* Restore */
114restore:
115
116        ldr     r1, [sp, #FRAME_OFFSET_R4]
117        mov     r4, r1
118        ldr     r1, [sp, #FRAME_OFFSET_R5]
119        mov     r5, r1
120        ldr     r1, [sp, #FRAME_OFFSET_R6]
121        mov     r6, r1
122        ldr     r1, [sp, #FRAME_OFFSET_R7]
123        mov     r7, r1
124        ldr     r1, [sp, #FRAME_OFFSET_R8]
125        mov     r8, r1
126        ldr     r1, [sp, #FRAME_OFFSET_R9]
127        mov     r9, r1
128        ldr     r1, [sp, #FRAME_OFFSET_R10]
129        mov     r10, r1
130        ldr     r1, [sp, #FRAME_OFFSET_R11]
131        mov     r11, r1
132        ldr     r1, [sp, #FRAME_OFFSET_LR]
133        mov     lr, r1
134
135        add     sp, sp, #FRAME_SIZE
136
137        bx      lr
138
139FUNCTION_END(_CPU_Context_validate)
Note: See TracBrowser for help on using the repository browser.