#include <errno.h>
#include <stdio.h>
+extern __thread struct kvm_cpu *current_kvm_cpu;
+
static inline bool is_in_protected_mode(struct kvm_cpu *vcpu)
{
return vcpu->sregs.cr0 & 0x01;
if (vcpu->kvm_run == MAP_FAILED)
die("unable to mmap vcpu fd");
+ vcpu->is_running = true;
+
return vcpu;
}
static void kvm_cpu_exit_handler(int signum)
{
- /* Don't do anything here */
+ if (current_kvm_cpu->is_running) {
+ current_kvm_cpu->is_running = false;
+ pthread_kill(pthread_self(), SIGKVMEXIT);
+ }
}
int kvm_cpu__start(struct kvm_cpu *cpu)
break;
}
case KVM_EXIT_INTR:
- /*
- * Currently we only handle exit signal, which means
- * we just exit if KVM_RUN exited due to a signal.
- */
+ if (cpu->is_running)
+ break;
goto exit_kvm;
case KVM_EXIT_SHUTDOWN:
goto exit_kvm;
static struct kvm *kvm;
static struct kvm_cpu *kvm_cpus[KVM_NR_CPUS];
-static __thread struct kvm_cpu *current_kvm_cpu;
+__thread struct kvm_cpu *current_kvm_cpu;
static u64 ram_size;
static u8 image_count;