|
27 | 27 | ubfx x0, x0, #ID_AA64MMFR1_EL1_HCX_SHIFT, #4
|
28 | 28 | cbz x0, .Lskip_hcrx_\@
|
29 | 29 | mov_q x0, HCRX_HOST_FLAGS
|
| 30 | + |
| 31 | + /* Enable GCS if supported */ |
| 32 | + mrs_s x1, SYS_ID_AA64PFR1_EL1 |
| 33 | + ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4 |
| 34 | + cbz x1, .Lset_hcrx_\@ |
| 35 | + orr x0, x0, #HCRX_EL2_GCSEn |
| 36 | + |
| 37 | +.Lset_hcrx_\@: |
30 | 38 | msr_s SYS_HCRX_EL2, x0
|
31 | 39 | .Lskip_hcrx_\@:
|
32 | 40 | .endm
|
|
200 | 208 | orr x0, x0, #HFGxTR_EL2_nPOR_EL0
|
201 | 209 |
|
202 | 210 | .Lskip_poe_fgt_\@:
|
| 211 | + /* GCS depends on PIE so we don't check it if PIE is absent */ |
| 212 | + mrs_s x1, SYS_ID_AA64PFR1_EL1 |
| 213 | + ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4 |
| 214 | + cbz x1, .Lset_fgt_\@ |
| 215 | + |
| 216 | + /* Disable traps of access to GCS registers at EL0 and EL1 */ |
| 217 | + orr x0, x0, #HFGxTR_EL2_nGCS_EL1_MASK |
| 218 | + orr x0, x0, #HFGxTR_EL2_nGCS_EL0_MASK |
| 219 | + |
| 220 | +.Lset_fgt_\@: |
203 | 221 | msr_s SYS_HFGRTR_EL2, x0
|
204 | 222 | msr_s SYS_HFGWTR_EL2, x0
|
205 | 223 | msr_s SYS_HFGITR_EL2, xzr
|
|
215 | 233 | .Lskip_fgt_\@:
|
216 | 234 | .endm
|
217 | 235 |
|
| 236 | +.macro __init_el2_gcs |
| 237 | + mrs_s x1, SYS_ID_AA64PFR1_EL1 |
| 238 | + ubfx x1, x1, #ID_AA64PFR1_EL1_GCS_SHIFT, #4 |
| 239 | + cbz x1, .Lskip_gcs_\@ |
| 240 | + |
| 241 | + /* Ensure GCS is not enabled when we start trying to do BLs */ |
| 242 | + msr_s SYS_GCSCR_EL1, xzr |
| 243 | + msr_s SYS_GCSCRE0_EL1, xzr |
| 244 | +.Lskip_gcs_\@: |
| 245 | +.endm |
| 246 | + |
218 | 247 | .macro __init_el2_nvhe_prepare_eret
|
219 | 248 | mov x0, #INIT_PSTATE_EL1
|
220 | 249 | msr spsr_el2, x0
|
|
240 | 269 | __init_el2_nvhe_idregs
|
241 | 270 | __init_el2_cptr
|
242 | 271 | __init_el2_fgt
|
| 272 | + __init_el2_gcs |
243 | 273 | .endm
|
244 | 274 |
|
245 | 275 | #ifndef __KVM_NVHE_HYPERVISOR__
|
|
0 commit comments