@@ -53,7 +53,6 @@ void vcpu_thread(struct vcpu *vcpu)
53
53
uint64_t vmexit_begin = 0 , vmexit_end = 0 ;
54
54
uint16_t basic_exit_reason = 0 ;
55
55
uint64_t tsc_aux_hyp_cpu = vcpu -> pcpu_id ;
56
- struct vm_exit_dispatch * vmexit_hdlr ;
57
56
int ret = 0 ;
58
57
59
58
/* If vcpu is not launched, we need to do init_vmcs first */
@@ -97,7 +96,11 @@ void vcpu_thread(struct vcpu *vcpu)
97
96
}
98
97
99
98
ret = start_vcpu (vcpu );
100
- ASSERT (ret == 0 , "vcpu resume failed" );
99
+ if (ret != 0 ) {
100
+ pr_fatal ("vcpu resume failed" );
101
+ pause_vcpu (vcpu , VCPU_ZOMBIE );
102
+ continue ;
103
+ }
101
104
102
105
vmexit_begin = rdtsc ();
103
106
@@ -106,28 +109,21 @@ void vcpu_thread(struct vcpu *vcpu)
106
109
CPU_MSR_READ (MSR_IA32_TSC_AUX , & vcpu -> msr_tsc_aux_guest );
107
110
/* Restore native TSC_AUX */
108
111
CPU_MSR_WRITE (MSR_IA32_TSC_AUX , tsc_aux_hyp_cpu );
109
- ASSERT ((int )get_cpu_id () == vcpu -> pcpu_id , "" );
110
112
111
113
/* Dispatch handler */
112
- vmexit_hdlr = vmexit_handler (vcpu );
113
- ASSERT (vmexit_hdlr != 0 ,
114
- "Unable to dispatch VM exit handler!" );
114
+ ret = vmexit_handler (vcpu );
115
+ if (ret < 0 ) {
116
+ pr_fatal ("dispatch VM exit handler failed for reason"
117
+ " %d, ret = %d!" ,
118
+ vcpu -> arch_vcpu .exit_reason & 0xFFFF , ret );
119
+ vcpu_inject_gp (vcpu );
120
+ continue ;
121
+ }
115
122
116
123
basic_exit_reason = vcpu -> arch_vcpu .exit_reason & 0xFFFF ;
117
124
per_cpu (vmexit_cnt , vcpu -> pcpu_id )[basic_exit_reason ]++ ;
118
125
TRACE_2L (TRACE_VM_EXIT , basic_exit_reason ,
119
126
vcpu -> arch_vcpu .contexts [vcpu -> arch_vcpu .cur_context ].rip );
120
-
121
- if (basic_exit_reason == VMX_EXIT_REASON_EXTERNAL_INTERRUPT ) {
122
- /* Handling external_interrupt
123
- * should disable intr
124
- */
125
- vmexit_hdlr -> handler (vcpu );
126
- } else {
127
- CPU_IRQ_ENABLE ();
128
- vmexit_hdlr -> handler (vcpu );
129
- CPU_IRQ_DISABLE ();
130
- }
131
127
} while (1 );
132
128
}
133
129
0 commit comments