| .. | .. |
|---|
| 2061 | 2061 | return -ENODEV; |
|---|
| 2062 | 2062 | } |
|---|
| 2063 | 2063 | |
|---|
| 2064 | + if (kvm_get_mode() == KVM_MODE_NONE) { |
|---|
| 2065 | + kvm_info("KVM disabled from command line\n"); |
|---|
| 2066 | + return -ENODEV; |
|---|
| 2067 | + } |
|---|
| 2068 | + |
|---|
| 2064 | 2069 | in_hyp_mode = is_kernel_in_hyp_mode(); |
|---|
| 2065 | 2070 | |
|---|
| 2066 | 2071 | if (cpus_have_final_cap(ARM64_WORKAROUND_DEVICE_LOAD_ACQUIRE) || |
|---|
| .. | .. |
|---|
| 2093 | 2098 | err = kvm_init_vector_slots(); |
|---|
| 2094 | 2099 | if (err) { |
|---|
| 2095 | 2100 | kvm_err("Cannot initialise vector slots\n"); |
|---|
| 2096 | | - goto out_err; |
|---|
| 2101 | + goto out_hyp; |
|---|
| 2097 | 2102 | } |
|---|
| 2098 | 2103 | |
|---|
| 2099 | 2104 | err = init_subsystems(); |
|---|
| 2100 | 2105 | if (err) |
|---|
| 2101 | | - goto out_hyp; |
|---|
| 2106 | + goto out_subs; |
|---|
| 2102 | 2107 | |
|---|
| 2103 | 2108 | if (!in_hyp_mode) { |
|---|
| 2104 | 2109 | err = finalize_hyp_mode(); |
|---|
| 2105 | 2110 | if (err) { |
|---|
| 2106 | 2111 | kvm_err("Failed to finalize Hyp protection\n"); |
|---|
| 2107 | | - goto out_hyp; |
|---|
| 2112 | + goto out_subs; |
|---|
| 2108 | 2113 | } |
|---|
| 2109 | 2114 | } |
|---|
| 2110 | 2115 | |
|---|
| .. | .. |
|---|
| 2118 | 2123 | |
|---|
| 2119 | 2124 | return 0; |
|---|
| 2120 | 2125 | |
|---|
| 2121 | | -out_hyp: |
|---|
| 2126 | +out_subs: |
|---|
| 2122 | 2127 | hyp_cpu_pm_exit(); |
|---|
| 2128 | +out_hyp: |
|---|
| 2123 | 2129 | if (!in_hyp_mode) |
|---|
| 2124 | 2130 | teardown_hyp_mode(); |
|---|
| 2125 | 2131 | out_err: |
|---|
| .. | .. |
|---|
| 2137 | 2143 | if (!arg) |
|---|
| 2138 | 2144 | return -EINVAL; |
|---|
| 2139 | 2145 | |
|---|
| 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 | + |
|---|
| 2140 | 2156 | if (strcmp(arg, "protected") == 0) { |
|---|
| 2141 | 2157 | kvm_mode = KVM_MODE_PROTECTED; |
|---|
| 2142 | 2158 | return 0; |
|---|
| 2143 | 2159 | } |
|---|
| 2144 | 2160 | |
|---|
| 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; |
|---|
| 2146 | 2163 | return 0; |
|---|
| 2164 | + } |
|---|
| 2147 | 2165 | |
|---|
| 2148 | 2166 | return -EINVAL; |
|---|
| 2149 | 2167 | } |
|---|