Skip to content

Commit 659803a

Browse files
Marc Zyngieroupton
authored andcommitted
arm64: Use CPACR_EL1 format to set CPTR_EL2 when E2H is set
When HCR_EL2.E2H is set, the CPTR_EL2 register takes the CPACR_EL1 format. Yes, this is good fun. Hack the bits of startup code that assume E2H=0 while setting up CPTR_EL2 to make them grok the CPTR_EL1 format. Signed-off-by: Marc Zyngier <maz@kernel.org> Reviewed-by: Catalin Marinas <catalin.marinas@arm.com> Link: https://lore.kernel.org/r/20230609162200.2024064-8-maz@kernel.org Signed-off-by: Oliver Upton <oliver.upton@linux.dev>
1 parent 9e7462b commit 659803a

1 file changed

Lines changed: 19 additions & 2 deletions

File tree

arch/arm64/include/asm/el2_setup.h

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -129,8 +129,15 @@
129129
.endm
130130

131131
/* Coprocessor traps */
132-
.macro __init_el2_nvhe_cptr
132+
.macro __init_el2_cptr
133+
mrs x1, hcr_el2
134+
and x1, x1, #HCR_E2H
135+
cbz x1, .LnVHE_\@
136+
mov x0, #(CPACR_EL1_FPEN_EL1EN | CPACR_EL1_FPEN_EL0EN)
137+
b .Lset_cptr_\@
138+
.LnVHE_\@:
133139
mov x0, #0x33ff
140+
.Lset_cptr_\@:
134141
msr cptr_el2, x0 // Disable copro. traps to EL2
135142
.endm
136143

@@ -196,7 +203,7 @@
196203
__init_el2_gicv3
197204
__init_el2_hstr
198205
__init_el2_nvhe_idregs
199-
__init_el2_nvhe_cptr
206+
__init_el2_cptr
200207
__init_el2_fgt
201208
__init_el2_nvhe_prepare_eret
202209
.endm
@@ -244,7 +251,17 @@
244251

245252
.Linit_sve_\@: /* SVE register access */
246253
mrs x0, cptr_el2 // Disable SVE traps
254+
mrs x1, hcr_el2
255+
and x1, x1, #HCR_E2H
256+
cbz x1, .Lcptr_nvhe_\@
257+
258+
// VHE case
259+
orr x0, x0, #(CPACR_EL1_ZEN_EL1EN | CPACR_EL1_ZEN_EL0EN)
260+
b .Lset_cptr_\@
261+
262+
.Lcptr_nvhe_\@: // nVHE case
247263
bic x0, x0, #CPTR_EL2_TZ
264+
.Lset_cptr_\@:
248265
msr cptr_el2, x0
249266
isb
250267
mov x1, #ZCR_ELx_LEN_MASK // SVE: Enable full vector

0 commit comments

Comments
 (0)