First version
[3rdparty/ote_partner/tlk.git] / arch / arm / include / arch / arm / monitor_vectors.h
1 /*
2  * Copyright (c) 2012-2014, NVIDIA CORPORATION. All rights reserved
3  *
4  * Permission is hereby granted, free of charge, to any person obtaining
5  * a copy of this software and associated documentation files
6  * (the "Software"), to deal in the Software without restriction,
7  * including without limitation the rights to use, copy, modify, merge,
8  * publish, distribute, sublicense, and/or sell copies of the Software,
9  * and to permit persons to whom the Software is furnished to do so,
10  * subject to the following conditions:
11  *
12  * The above copyright notice and this permission notice shall be
13  * included in all copies or substantial portions of the Software.
14  *
15  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
16  * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
17  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.
18  * IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY
19  * CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT,
20  * TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE
21  * SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
22  */
23 #ifndef __MONITOR_VECTORS_H
24 #define __MONITOR_VECTORS_H
25
26 #define SAVED_STATE_WORDS       7
27
28 /* save exception SP and VFP state (assumes SCR.NS=0) */
29 .macro SAVE_STATE, base, tmp
30         cps     #0x11                   /* fiq */
31         str     sp, [\base], #4
32         cps     #0x12                   /* irq */
33         str     sp, [\base], #4
34         cps     #0x13                   /* svc */
35         str     sp, [\base], #4
36         str     lr, [\base], #4
37         cps     #0x17                   /* abt */
38         str     sp, [\base], #4
39         cps     #0x1b                   /* und */
40         str     sp, [\base], #4
41         cps     #0x1f                   /* sys */
42         str     sp, [\base], #4
43
44         /* return in monitor mode */
45         cps     #0x16                   /* mon */
46 .endm
47
48 /* restore exception SP and VFP state (assumes SCR.NS=0) */
49 .macro RESTORE_STATE, base, tmp
50         cps     #0x11                   /* fiq */
51         ldr     sp, [\base], #4
52         cps     #0x12                   /* irq */
53         ldr     sp, [\base], #4
54         cps     #0x13                   /* svc */
55         ldr     sp, [\base], #4
56         ldr     lr, [\base], #4
57         cps     #0x17                   /* abt */
58         ldr     sp, [\base], #4
59         cps     #0x1b                   /* und */
60         ldr     sp, [\base], #4
61         cps     #0x1f                   /* sys */
62         ldr     sp, [\base], #4
63
64         /* return in monitor mode */
65         cps     #0x16                   /* mon */
66 .endm
67
68 .macro SAVE_SECURE_STATE, base, tmp
69         adr             \base, secure_state
70         SAVE_STATE      \base, \tmp
71 .endm
72
73 .macro RESTORE_SECURE_STATE, base, tmp
74         adr             \base, secure_state
75         RESTORE_STATE   \base, \tmp
76 .endm
77
78 .macro SAVE_NONSECURE_STATE, base, tmp
79         adr             \base, nonsecure_state
80         SAVE_STATE      \base, \tmp
81 .endm
82
83 .macro RESTORE_NONSECURE_STATE, base, tmp
84         adr             \base, nonsecure_state
85         RESTORE_STATE   \base, \tmp
86 .endm
87
88 /* sets SCR.NS bit to 1 (assumes monitor mode) */
89 .macro SWITCH_SCR_TO_NONSECURE, tmp
90         mrc     p15, 0, \tmp, c1, c1, 0
91         orr     \tmp, \tmp, #0x1
92         mcr     p15, 0, \tmp, c1, c1, 0
93         isb
94 .endm
95
96 /* sets SCR.NS bit to 0 (assumes monitor mode) */
97 .macro SWITCH_SCR_TO_SECURE, tmp
98         mrc     p15, 0, \tmp, c1, c1, 0
99         bic     \tmp, \tmp, #0x1
100         mcr     p15, 0, \tmp, c1, c1, 0
101         isb
102 .endm
103
104 /* tz_monitor_frame is 15 entries of 8 bytes each */
105 #define MON_FRAME_ENTRIES       15
106 #define MON_FRAME_ENTRY_BITS    3
107 #define MON_FRAME_ENTRY_SIZE    (1 << MON_FRAME_ENTRY_BITS)
108
109 .macro SAVE_MON_FRAME_TO_STACK
110         sub     sp, sp, #(MON_FRAME_ENTRIES << MON_FRAME_ENTRY_BITS)
111         str     r0,  [sp, #0x00]
112         str     r1,  [sp, #0x08]
113         str     r2,  [sp, #0x10]
114         str     r3,  [sp, #0x18]
115         str     r4,  [sp, #0x20]
116         str     r5,  [sp, #0x28]
117         str     r6,  [sp, #0x30]
118         str     r7,  [sp, #0x38]
119         str     r8,  [sp, #0x40]
120         str     r9,  [sp, #0x48]
121         str     r10, [sp, #0x50]
122         str     r11, [sp, #0x58]
123         str     r12, [sp, #0x60]
124         str     r14, [sp, #0x68]
125         mrs     r14, spsr
126         str     r14, [sp, #0x70]
127 .endm
128
129 .macro RESTORE_MON_FRAME_FROM_STACK
130         mov     r14, sp
131         add     sp, sp, #(MON_FRAME_ENTRIES << MON_FRAME_ENTRY_BITS)
132         ldr     r1,  [r14, #0x70]
133         msr     spsr_cfsx, r1
134         ldr     r0,  [r14, #0x00]
135         ldr     r1,  [r14, #0x08]
136         ldr     r2,  [r14, #0x10]
137         ldr     r3,  [r14, #0x18]
138         ldr     r4,  [r14, #0x20]
139         ldr     r5,  [r14, #0x28]
140         ldr     r6,  [r14, #0x30]
141         ldr     r7,  [r14, #0x38]
142         ldr     r8,  [r14, #0x40]
143         ldr     r9,  [r14, #0x48]
144         ldr     r10, [r14, #0x50]
145         ldr     r11, [r14, #0x58]
146         ldr     r12, [r14, #0x60]
147         ldr     r14, [r14, #0x68]
148 .endm
149
150 .macro RESTORE_MON_FRAME_FROM_ARG, arg
151         mov     r14, \arg
152         ldr     \arg,  [r14, #0x70]
153         msr     spsr_cfsx, \arg
154         ldr     r0,  [r14, #0x00]
155         ldr     r1,  [r14, #0x08]
156         ldr     r2,  [r14, #0x10]
157         ldr     r3,  [r14, #0x18]
158         ldr     r4,  [r14, #0x20]
159         ldr     r5,  [r14, #0x28]
160         ldr     r6,  [r14, #0x30]
161         ldr     r7,  [r14, #0x38]
162         ldr     r8,  [r14, #0x40]
163         ldr     r9,  [r14, #0x48]
164         ldr     r10, [r14, #0x50]
165         ldr     r11, [r14, #0x58]
166         ldr     r12, [r14, #0x60]
167         ldr     r14, [r14, #0x68]
168 .endm
169
170 #endif