hc
2024-01-03 2f7c68cb55ecb7331f2381deb497c27155f32faf
kernel/arch/arm64/kvm/arm.c
....@@ -2061,6 +2061,11 @@
20612061 return -ENODEV;
20622062 }
20632063
2064
+ if (kvm_get_mode() == KVM_MODE_NONE) {
2065
+ kvm_info("KVM disabled from command line\n");
2066
+ return -ENODEV;
2067
+ }
2068
+
20642069 in_hyp_mode = is_kernel_in_hyp_mode();
20652070
20662071 if (cpus_have_final_cap(ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE) ||
....@@ -2093,18 +2098,18 @@
20932098 err = kvm_init_vector_slots();
20942099 if (err) {
20952100 kvm_err("Cannot initialise vector slots\n");
2096
- goto out_err;
2101
+ goto out_hyp;
20972102 }
20982103
20992104 err = init_subsystems();
21002105 if (err)
2101
- goto out_hyp;
2106
+ goto out_subs;
21022107
21032108 if (!in_hyp_mode) {
21042109 err = finalize_hyp_mode();
21052110 if (err) {
21062111 kvm_err("Failed to finalize Hyp protection\n");
2107
- goto out_hyp;
2112
+ goto out_subs;
21082113 }
21092114 }
21102115
....@@ -2118,8 +2123,9 @@
21182123
21192124 return 0;
21202125
2121
-out_hyp:
2126
+out_subs:
21222127 hyp_cpu_pm_exit();
2128
+out_hyp:
21232129 if (!in_hyp_mode)
21242130 teardown_hyp_mode();
21252131 out_err:
....@@ -2137,13 +2143,25 @@
21372143 if (!arg)
21382144 return -EINVAL;
21392145
2146
+ if (strcmp(arg, "none") == 0) {
2147
+ kvm_mode = KVM_MODE_NONE;
2148
+ return 0;
2149
+ }
2150
+
2151
+ if (!is_hyp_mode_available()) {
2152
+ pr_warn_once("KVM is not available. Ignoring kvm-arm.mode\n");
2153
+ return 0;
2154
+ }
2155
+
21402156 if (strcmp(arg, "protected") == 0) {
21412157 kvm_mode = KVM_MODE_PROTECTED;
21422158 return 0;
21432159 }
21442160
2145
- if (strcmp(arg, "nvhe") == 0 && !WARN_ON(is_kernel_in_hyp_mode()))
2161
+ if (strcmp(arg, "nvhe") == 0 && !WARN_ON(is_kernel_in_hyp_mode())) {
2162
+ kvm_mode = KVM_MODE_DEFAULT;
21462163 return 0;
2164
+ }
21472165
21482166 return -EINVAL;
21492167 }