| .. | .. |
|---|
| 750 | 750 | * involves poking the GIC, which must be done in a |
|---|
| 751 | 751 | * non-preemptible context. |
|---|
| 752 | 752 | */ |
|---|
| 753 | | - migrate_disable(); |
|---|
| 753 | + preempt_disable(); |
|---|
| 754 | 754 | |
|---|
| 755 | 755 | kvm_pmu_flush_hwstate(vcpu); |
|---|
| 756 | 756 | |
|---|
| .. | .. |
|---|
| 799 | 799 | kvm_timer_sync_user(vcpu); |
|---|
| 800 | 800 | kvm_vgic_sync_hwstate(vcpu); |
|---|
| 801 | 801 | local_irq_enable(); |
|---|
| 802 | | - migrate_enable(); |
|---|
| 802 | + preempt_enable(); |
|---|
| 803 | 803 | continue; |
|---|
| 804 | 804 | } |
|---|
| 805 | 805 | |
|---|
| .. | .. |
|---|
| 871 | 871 | /* Exit types that need handling before we can be preempted */ |
|---|
| 872 | 872 | handle_exit_early(vcpu, ret); |
|---|
| 873 | 873 | |
|---|
| 874 | | - migrate_enable(); |
|---|
| 874 | + preempt_enable(); |
|---|
| 875 | 875 | |
|---|
| 876 | 876 | /* |
|---|
| 877 | 877 | * The ARMv8 architecture doesn't give the hypervisor |
|---|
| .. | .. |
|---|
| 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 | } |
|---|