Skip to content

Commit 1fea164

Browse files
Fuad TabbaMarc Zyngier
authored andcommitted
KVM: arm64: Move checking protected vcpu features to a separate function
At the moment, checks for supported vcpu features for protected VMs are build-time bugs. In the following patch, they will become runtime checks based on the vcpu's features registers. Therefore, consolidate them into one function that would return an error if it encounters an unsupported feature. Signed-off-by: Fuad Tabba <[email protected]> Link: https://lore.kernel.org/r/[email protected] Signed-off-by: Marc Zyngier <[email protected]>
1 parent f507582 commit 1fea164

File tree

1 file changed

+32
-13
lines changed

1 file changed

+32
-13
lines changed

arch/arm64/kvm/hyp/nvhe/pkvm.c

Lines changed: 32 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -178,20 +178,11 @@ static void pvm_init_traps_mdcr(struct kvm_vcpu *vcpu)
178178
}
179179

180180
/*
181-
* Initialize trap register values in protected mode.
181+
* Check that cpu features that are neither trapped nor supported are not
182+
* enabled for protected VMs.
182183
*/
183-
static void pkvm_vcpu_init_traps(struct pkvm_hyp_vcpu *hyp_vcpu)
184+
static int pkvm_check_pvm_cpu_features(struct kvm_vcpu *vcpu)
184185
{
185-
struct kvm_vcpu *vcpu = &hyp_vcpu->vcpu;
186-
187-
vcpu->arch.cptr_el2 = kvm_get_reset_cptr_el2(vcpu);
188-
vcpu->arch.mdcr_el2 = 0;
189-
190-
pkvm_vcpu_reset_hcr(vcpu);
191-
192-
if ((!pkvm_hyp_vcpu_is_protected(hyp_vcpu)))
193-
return;
194-
195186
/*
196187
* PAuth is allowed if supported by the system and the vcpu.
197188
* Properly checking for PAuth requires checking various fields in
@@ -218,9 +209,34 @@ static void pkvm_vcpu_init_traps(struct pkvm_hyp_vcpu *hyp_vcpu)
218209
BUILD_BUG_ON(!FIELD_GET(ARM64_FEATURE_MASK(ID_AA64PFR0_EL1_AdvSIMD),
219210
PVM_ID_AA64PFR0_ALLOW));
220211

212+
return 0;
213+
}
214+
215+
/*
216+
* Initialize trap register values in protected mode.
217+
*/
218+
static int pkvm_vcpu_init_traps(struct pkvm_hyp_vcpu *hyp_vcpu)
219+
{
220+
struct kvm_vcpu *vcpu = &hyp_vcpu->vcpu;
221+
int ret;
222+
223+
vcpu->arch.cptr_el2 = kvm_get_reset_cptr_el2(vcpu);
224+
vcpu->arch.mdcr_el2 = 0;
225+
226+
pkvm_vcpu_reset_hcr(vcpu);
227+
228+
if ((!pkvm_hyp_vcpu_is_protected(hyp_vcpu)))
229+
return 0;
230+
231+
ret = pkvm_check_pvm_cpu_features(vcpu);
232+
if (ret)
233+
return ret;
234+
221235
pvm_init_traps_hcr(vcpu);
222236
pvm_init_traps_cptr(vcpu);
223237
pvm_init_traps_mdcr(vcpu);
238+
239+
return 0;
224240
}
225241

226242
/*
@@ -417,9 +433,12 @@ static int init_pkvm_hyp_vcpu(struct pkvm_hyp_vcpu *hyp_vcpu,
417433
hyp_vcpu->vcpu.arch.cflags = READ_ONCE(host_vcpu->arch.cflags);
418434
hyp_vcpu->vcpu.arch.mp_state.mp_state = KVM_MP_STATE_STOPPED;
419435

436+
ret = pkvm_vcpu_init_traps(hyp_vcpu);
437+
if (ret)
438+
goto done;
439+
420440
pkvm_vcpu_init_sve(hyp_vcpu, host_vcpu);
421441
pkvm_vcpu_init_ptrauth(hyp_vcpu);
422-
pkvm_vcpu_init_traps(hyp_vcpu);
423442
done:
424443
if (ret)
425444
unpin_host_vcpu(host_vcpu);

0 commit comments

Comments
 (0)