First version
[3rdparty/ote_partner/tlk.git] / lib / monitor / arm64 / include / arm64 / monitor_macros.h
1 /*
2  * Copyright (c) 2013-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_MACROS_H
24 #define __MONITOR_MACROS_H
25
26 /* number of regs of each type */
27 #define NUM_GPR_REGS            28
28 #define NUM_MMU_REGS            6
29 #define NUM_SYS_REGS            7
30
31 #define NUM_CTX_REGS    (NUM_GPR_REGS + NUM_MMU_REGS + NUM_SYS_REGS)
32
33 /* byte offsets with context buffer */
34 #define CTX_GPR_OFFSET          0
35 #define CTX_MMU_OFFSET          (NUM_GPR_REGS << 0x3)
36 #define CTX_SYS_OFFSET          (CTX_MMU_OFFSET + (NUM_MMU_REGS << 0x3))
37
38 .macro mon_save_el1_gpr, ctxptr
39         /* save general purpose CPU state */
40         stp     x4, x5,   [\ctxptr, #CTX_GPR_OFFSET]
41         stp     x6, x7,   [\ctxptr, #(CTX_GPR_OFFSET + 0x10)]
42         stp     x8, x9,   [\ctxptr, #(CTX_GPR_OFFSET + 0x20)]
43         stp     x10, x11, [\ctxptr, #(CTX_GPR_OFFSET + 0x30)]
44         stp     x12, x13, [\ctxptr, #(CTX_GPR_OFFSET + 0x40)]
45         stp     x14, x15, [\ctxptr, #(CTX_GPR_OFFSET + 0x50)]
46         stp     x16, x17, [\ctxptr, #(CTX_GPR_OFFSET + 0x60)]
47         stp     x18, x19, [\ctxptr, #(CTX_GPR_OFFSET + 0x70)]
48         stp     x20, x21, [\ctxptr, #(CTX_GPR_OFFSET + 0x80)]
49         stp     x22, x23, [\ctxptr, #(CTX_GPR_OFFSET + 0x90)]
50         stp     x24, x25, [\ctxptr, #(CTX_GPR_OFFSET + 0xA0)]
51         stp     x26, x27, [\ctxptr, #(CTX_GPR_OFFSET + 0xB0)]
52         mrs     x27, sp_el1
53         stp     x28, x27, [\ctxptr, #(CTX_GPR_OFFSET + 0xC0)]
54         stp     x29, x30, [\ctxptr, #(CTX_GPR_OFFSET + 0xD0)]
55 .endm
56
57 .macro mon_save_el1_mmu, ctxptr
58         /* save MMU related CPU state */
59
60         .if (\ctxptr == x0 || \ctxptr == x1)
61         .error "can't use x0 or x1 as ctxptr (used internally)."
62         .endif
63
64         mrs     x0, mair_el1
65         mrs     x1, tcr_el1
66         stp     x0, x1, [\ctxptr, #CTX_MMU_OFFSET]
67         mrs     x0, ttbr0_el1
68         mrs     x1, ttbr1_el1
69         stp     x0, x1, [\ctxptr, #(CTX_MMU_OFFSET + 0x10)]
70         mrs     x0, contextidr_el1
71         mrs     x1, sctlr_el1           /* for M bit */
72         stp     x0, x1, [\ctxptr, #(CTX_MMU_OFFSET + 0x20)]
73 .endm
74
75 .macro mon_save_el1_sys, ctxptr
76         /* save SYS related CPU state */
77
78         .if (\ctxptr == x0 || \ctxptr == x1)
79         .error "can't use x0 or x1 as ctxptr (used internally)."
80         .endif
81
82         mrs     x0, cpacr_el1
83         mrs     x1, actlr_el1
84         stp     x0, x1, [\ctxptr, #CTX_SYS_OFFSET]
85         mrs     x0, vbar_el1
86         mrs     x1, tpidr_el1
87         stp     x0, x1, [\ctxptr, #(CTX_SYS_OFFSET + 0x10)]
88         mrs     x0, spsr_el3
89         mrs     x1, elr_el3
90         stp     x0, x1, [\ctxptr, #(CTX_SYS_OFFSET + 0x20)]
91         mrs     x0, tpidrro_el0
92         str     x0, [\ctxptr, #(CTX_SYS_OFFSET + 0x30)]
93 .endm
94
95 .macro mon_save_el1_regs, ctxptr
96         mon_save_el1_gpr \ctxptr
97         mon_save_el1_mmu \ctxptr
98         mon_save_el1_sys \ctxptr
99 .endm
100
101 .macro mon_restore_el1_gpr, ctxptr
102         /* restore general purpose CPU state */
103
104         ldp     x4, x5,   [\ctxptr, #CTX_GPR_OFFSET]
105         ldp     x6, x7,   [\ctxptr, #(CTX_GPR_OFFSET + 0x10)]
106         ldp     x8, x9,   [\ctxptr, #(CTX_GPR_OFFSET + 0x20)]
107         ldp     x10, x11, [\ctxptr, #(CTX_GPR_OFFSET + 0x30)]
108         ldp     x12, x13, [\ctxptr, #(CTX_GPR_OFFSET + 0x40)]
109         ldp     x14, x15, [\ctxptr, #(CTX_GPR_OFFSET + 0x50)]
110         ldp     x16, x17, [\ctxptr, #(CTX_GPR_OFFSET + 0x60)]
111         ldp     x18, x19, [\ctxptr, #(CTX_GPR_OFFSET + 0x70)]
112         ldp     x20, x21, [\ctxptr, #(CTX_GPR_OFFSET + 0x80)]
113         ldp     x22, x23, [\ctxptr, #(CTX_GPR_OFFSET + 0x90)]
114         ldp     x24, x25, [\ctxptr, #(CTX_GPR_OFFSET + 0xA0)]
115         ldp     x26, x27, [\ctxptr, #(CTX_GPR_OFFSET + 0xB0)]
116         ldp     x28, x29, [\ctxptr, #(CTX_GPR_OFFSET + 0xC0)]
117         msr     sp_el1, x29
118         ldp     x29, x30, [\ctxptr, #(CTX_GPR_OFFSET + 0xD0)]
119 .endm
120
121 .macro mon_restore_el1_mmu, ctxptr
122         /* restore MMU related CPU state */
123
124         .if (\ctxptr == x0 || \ctxptr == x1)
125         .error "can't use x0 or x1 as ctxptr (used internally)."
126         .endif
127
128         ldp     x0, x1, [\ctxptr, #CTX_MMU_OFFSET]
129         msr     mair_el1, x0
130         msr     tcr_el1, x1
131         ldp     x0, x1, [\ctxptr, #(CTX_MMU_OFFSET + 0x10)]
132         msr     ttbr0_el1, x0
133         msr     ttbr1_el1, x1
134         ldp     x0, x1, [\ctxptr, #(CTX_MMU_OFFSET + 0x20)]
135         msr     contextidr_el1, x0
136         msr     sctlr_el1, x1           /* for M bit */
137         isb
138 .endm
139
140 .macro mon_restore_el1_sys, ctxptr
141         /* save SYS related CPU state */
142
143         .if (\ctxptr == x0 || \ctxptr == x1)
144         .error "can't use x0 or x1 as ctxptr (used internally)."
145         .endif
146
147         ldp     x0, x1, [\ctxptr, #CTX_SYS_OFFSET]
148         msr     cpacr_el1, x0
149         msr     actlr_el1, x1
150         ldp     x0, x1, [\ctxptr, #(CTX_SYS_OFFSET + 0x10)]
151         msr     vbar_el1, x0
152         msr     tpidr_el1, x1
153         ldp     x0, x1, [\ctxptr, #(CTX_SYS_OFFSET + 0x20)]
154         msr     spsr_el3, x0
155         msr     elr_el3, x1
156         ldr     x0, [\ctxptr, #(CTX_SYS_OFFSET + 0x30)]
157         msr     tpidrro_el0, x0
158         isb
159 .endm
160
161 .macro mon_restore_el1_regs, ctxptr
162         mon_restore_el1_mmu \ctxptr
163         mon_restore_el1_sys \ctxptr
164         mon_restore_el1_gpr \ctxptr
165 .endm
166
167 #endif