]> git.proxmox.com Git - mirror_edk2.git/blame_incremental - ArmPkg/Library/ArmLib/Common/AArch64/ArmLibSupport.S
ArmPkg/Library: Add ArmReadSctlr for AArch64
[mirror_edk2.git] / ArmPkg / Library / ArmLib / Common / AArch64 / ArmLibSupport.S
... / ...
CommitLineData
1#------------------------------------------------------------------------------\r
2#\r
3# Copyright (c) 2008 - 2009, Apple Inc. All rights reserved.<BR>\r
4# Copyright (c) 2011 - 2016, ARM Limited. All rights reserved.\r
5#\r
6# This program and the accompanying materials\r
7# are licensed and made available under the terms and conditions of the BSD License\r
8# which accompanies this distribution. The full text of the license may be found at\r
9# http://opensource.org/licenses/bsd-license.php\r
10#\r
11# THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS,\r
12# WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED.\r
13#\r
14#------------------------------------------------------------------------------\r
15\r
16#include <AsmMacroIoLibV8.h>\r
17\r
18.text\r
19.align 3\r
20GCC_ASM_EXPORT (ArmReadMidr)\r
21GCC_ASM_EXPORT (ArmCacheInfo)\r
22GCC_ASM_EXPORT (ArmGetInterruptState)\r
23GCC_ASM_EXPORT (ArmGetFiqState)\r
24GCC_ASM_EXPORT (ArmGetTTBR0BaseAddress)\r
25GCC_ASM_EXPORT (ArmSetTTBR0)\r
26GCC_ASM_EXPORT (ArmGetTCR)\r
27GCC_ASM_EXPORT (ArmSetTCR)\r
28GCC_ASM_EXPORT (ArmGetMAIR)\r
29GCC_ASM_EXPORT (ArmSetMAIR)\r
30GCC_ASM_EXPORT (ArmWriteCpacr)\r
31GCC_ASM_EXPORT (ArmWriteAuxCr)\r
32GCC_ASM_EXPORT (ArmReadAuxCr)\r
33GCC_ASM_EXPORT (ArmInvalidateTlb)\r
34GCC_ASM_EXPORT (ArmUpdateTranslationTableEntry)\r
35GCC_ASM_EXPORT (ArmWriteCptr)\r
36GCC_ASM_EXPORT (ArmWriteScr)\r
37GCC_ASM_EXPORT (ArmWriteMVBar)\r
38GCC_ASM_EXPORT (ArmCallWFE)\r
39GCC_ASM_EXPORT (ArmCallSEV)\r
40GCC_ASM_EXPORT (ArmReadCpuActlr)\r
41GCC_ASM_EXPORT (ArmWriteCpuActlr)\r
42GCC_ASM_EXPORT (ArmReadSctlr)\r
43\r
44#------------------------------------------------------------------------------\r
45\r
46.set DAIF_RD_FIQ_BIT, (1 << 6)\r
47.set DAIF_RD_IRQ_BIT, (1 << 7)\r
48\r
49ASM_PFX(ArmReadMidr):\r
50 mrs x0, midr_el1 // Read from Main ID Register (MIDR)\r
51 ret\r
52\r
53ASM_PFX(ArmCacheInfo):\r
54 mrs x0, ctr_el0 // Read from Cache Type Regiter (CTR)\r
55 ret\r
56\r
57ASM_PFX(ArmGetInterruptState):\r
58 mrs x0, daif\r
59 tst w0, #DAIF_RD_IRQ_BIT // Check if IRQ is enabled. Enabled if 0 (Z=1)\r
60 cset w0, eq // if Z=1 return 1, else 0\r
61 ret\r
62\r
63ASM_PFX(ArmGetFiqState):\r
64 mrs x0, daif\r
65 tst w0, #DAIF_RD_FIQ_BIT // Check if FIQ is enabled. Enabled if 0 (Z=1)\r
66 cset w0, eq // if Z=1 return 1, else 0\r
67 ret\r
68\r
69ASM_PFX(ArmWriteCpacr):\r
70 msr cpacr_el1, x0 // Coprocessor Access Control Reg (CPACR)\r
71 ret\r
72\r
73ASM_PFX(ArmWriteAuxCr):\r
74 EL1_OR_EL2(x1)\r
751:msr actlr_el1, x0 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3\r
76 ret\r
772:msr actlr_el2, x0 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3\r
78 ret\r
79\r
80ASM_PFX(ArmReadAuxCr):\r
81 EL1_OR_EL2(x1)\r
821:mrs x0, actlr_el1 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3\r
83 ret\r
842:mrs x0, actlr_el2 // Aux Control Reg (ACTLR) at EL1. Also available in EL2 and EL3\r
85 ret\r
86\r
87ASM_PFX(ArmSetTTBR0):\r
88 EL1_OR_EL2_OR_EL3(x1)\r
891:msr ttbr0_el1, x0 // Translation Table Base Reg 0 (TTBR0)\r
90 b 4f\r
912:msr ttbr0_el2, x0 // Translation Table Base Reg 0 (TTBR0)\r
92 b 4f\r
933:msr ttbr0_el3, x0 // Translation Table Base Reg 0 (TTBR0)\r
944:isb\r
95 ret\r
96\r
97ASM_PFX(ArmGetTTBR0BaseAddress):\r
98 EL1_OR_EL2(x1)\r
991:mrs x0, ttbr0_el1\r
100 b 3f\r
1012:mrs x0, ttbr0_el2\r
1023:LoadConstantToReg(0xFFFFFFFFFFFF, x1) /* Look at bottom 48 bits */\r
103 and x0, x0, x1\r
104 isb\r
105 ret\r
106\r
107ASM_PFX(ArmGetTCR):\r
108 EL1_OR_EL2_OR_EL3(x1)\r
1091:mrs x0, tcr_el1\r
110 b 4f\r
1112:mrs x0, tcr_el2\r
112 b 4f\r
1133:mrs x0, tcr_el3\r
1144:isb\r
115 ret\r
116\r
117ASM_PFX(ArmSetTCR):\r
118 EL1_OR_EL2_OR_EL3(x1)\r
1191:msr tcr_el1, x0\r
120 b 4f\r
1212:msr tcr_el2, x0\r
122 b 4f\r
1233:msr tcr_el3, x0\r
1244:isb\r
125 ret\r
126\r
127ASM_PFX(ArmGetMAIR):\r
128 EL1_OR_EL2_OR_EL3(x1)\r
1291:mrs x0, mair_el1\r
130 b 4f\r
1312:mrs x0, mair_el2\r
132 b 4f\r
1333:mrs x0, mair_el3\r
1344:isb\r
135 ret\r
136\r
137ASM_PFX(ArmSetMAIR):\r
138 EL1_OR_EL2_OR_EL3(x1)\r
1391:msr mair_el1, x0\r
140 b 4f\r
1412:msr mair_el2, x0\r
142 b 4f\r
1433:msr mair_el3, x0\r
1444:isb\r
145 ret\r
146\r
147\r
148//\r
149//VOID\r
150//ArmUpdateTranslationTableEntry (\r
151// IN VOID *TranslationTableEntry // X0\r
152// IN VOID *MVA // X1\r
153// );\r
154ASM_PFX(ArmUpdateTranslationTableEntry):\r
155 dc civac, x0 // Clean and invalidate data line\r
156 dsb sy\r
157 EL1_OR_EL2_OR_EL3(x0)\r
1581: tlbi vaae1, x1 // TLB Invalidate VA , EL1\r
159 b 4f\r
1602: tlbi vae2, x1 // TLB Invalidate VA , EL2\r
161 b 4f\r
1623: tlbi vae3, x1 // TLB Invalidate VA , EL3\r
1634: dsb sy\r
164 isb\r
165 ret\r
166\r
167ASM_PFX(ArmInvalidateTlb):\r
168 EL1_OR_EL2_OR_EL3(x0)\r
1691: tlbi vmalle1\r
170 b 4f\r
1712: tlbi alle2\r
172 b 4f\r
1733: tlbi alle3\r
1744: dsb sy\r
175 isb\r
176 ret\r
177\r
178ASM_PFX(ArmWriteCptr):\r
179 msr cptr_el3, x0 // EL3 Coprocessor Trap Reg (CPTR)\r
180 ret\r
181\r
182ASM_PFX(ArmWriteScr):\r
183 msr scr_el3, x0 // Secure configuration register EL3\r
184 isb\r
185 ret\r
186\r
187ASM_PFX(ArmWriteMVBar):\r
188 msr vbar_el3, x0 // Exception Vector Base address for Monitor on EL3\r
189 ret\r
190\r
191ASM_PFX(ArmCallWFE):\r
192 wfe\r
193 ret\r
194\r
195ASM_PFX(ArmCallSEV):\r
196 sev\r
197 ret\r
198\r
199ASM_PFX(ArmReadCpuActlr):\r
200 mrs x0, S3_1_c15_c2_0\r
201 ret\r
202\r
203ASM_PFX(ArmWriteCpuActlr):\r
204 msr S3_1_c15_c2_0, x0\r
205 dsb sy\r
206 isb\r
207 ret\r
208\r
209ASM_PFX(ArmReadSctlr):\r
210 EL1_OR_EL2_OR_EL3(x1)\r
2111:mrs x0, sctlr_el1\r
212 ret\r
2132:mrs x0, sctlr_el2\r
214 ret\r
2153:mrs x0, sctlr_el3\r
2164:ret\r
217\r
218ASM_FUNCTION_REMOVE_IF_UNREFERENCED\r