@@ -2905,6 +2905,11 @@ static int __init early_kvm_mode_cfg(char *arg)
return 0;
}
+ if (strcmp(arg, "nested") == 0 && !WARN_ON(!is_kernel_in_hyp_mode())) {
+ kvm_mode = KVM_MODE_NV;
+ return 0;
+ }
+
if (strcmp(arg, "protected") == 0) {
if (!is_kernel_in_hyp_mode())
kvm_mode = KVM_MODE_PROTECTED;
@@ -2914,13 +2919,16 @@ static int __init early_kvm_mode_cfg(char *arg)
return 0;
}
- if (strcmp(arg, "nvhe") == 0 && !WARN_ON(is_kernel_in_hyp_mode())) {
+ /* If system doesn't support FEAT_E2H0, nVHE host is not available */
+ if (cpu_has_e2h_res1()) {
+ WARN_ON(!is_kernel_in_hyp_mode());
kvm_mode = KVM_MODE_DEFAULT;
+ pr_warn_once("FEAT_E2H0 not supported. Ignoring kvm-arm.mode\n");
return 0;
}
- if (strcmp(arg, "nested") == 0 && !WARN_ON(!is_kernel_in_hyp_mode())) {
- kvm_mode = KVM_MODE_NV;
+ if (strcmp(arg, "nvhe") == 0 && !WARN_ON(is_kernel_in_hyp_mode())) {
+ kvm_mode = KVM_MODE_DEFAULT;
return 0;
}