33 |
33 |
//#define DEBUG_KVM
|
34 |
34 |
|
35 |
35 |
#ifdef DEBUG_KVM
|
36 |
|
#define dprintf(fmt, ...) \
|
|
36 |
#define DPRINTF(fmt, ...) \
|
37 |
37 |
do { fprintf(stderr, fmt, ## __VA_ARGS__); } while (0)
|
38 |
38 |
#else
|
39 |
|
#define dprintf(fmt, ...) \
|
|
39 |
#define DPRINTF(fmt, ...) \
|
40 |
40 |
do { } while (0)
|
41 |
41 |
#endif
|
42 |
42 |
|
... | ... | |
173 |
173 |
long mmap_size;
|
174 |
174 |
int ret;
|
175 |
175 |
|
176 |
|
dprintf("kvm_init_vcpu\n");
|
|
176 |
DPRINTF("kvm_init_vcpu\n");
|
177 |
177 |
|
178 |
178 |
ret = kvm_vm_ioctl(s, KVM_CREATE_VCPU, env->cpu_index);
|
179 |
179 |
if (ret < 0) {
|
180 |
|
dprintf("kvm_create_vcpu failed\n");
|
|
180 |
DPRINTF("kvm_create_vcpu failed\n");
|
181 |
181 |
goto err;
|
182 |
182 |
}
|
183 |
183 |
|
... | ... | |
186 |
186 |
|
187 |
187 |
mmap_size = kvm_ioctl(s, KVM_GET_VCPU_MMAP_SIZE, 0);
|
188 |
188 |
if (mmap_size < 0) {
|
189 |
|
dprintf("KVM_GET_VCPU_MMAP_SIZE failed\n");
|
|
189 |
DPRINTF("KVM_GET_VCPU_MMAP_SIZE failed\n");
|
190 |
190 |
goto err;
|
191 |
191 |
}
|
192 |
192 |
|
... | ... | |
194 |
194 |
env->kvm_fd, 0);
|
195 |
195 |
if (env->kvm_run == MAP_FAILED) {
|
196 |
196 |
ret = -errno;
|
197 |
|
dprintf("mmap'ing vcpu state failed\n");
|
|
197 |
DPRINTF("mmap'ing vcpu state failed\n");
|
198 |
198 |
goto err;
|
199 |
199 |
}
|
200 |
200 |
|
... | ... | |
325 |
325 |
d.slot = mem->slot;
|
326 |
326 |
|
327 |
327 |
if (kvm_vm_ioctl(s, KVM_GET_DIRTY_LOG, &d) == -1) {
|
328 |
|
dprintf("ioctl failed %d\n", errno);
|
|
328 |
DPRINTF("ioctl failed %d\n", errno);
|
329 |
329 |
ret = -1;
|
330 |
330 |
break;
|
331 |
331 |
}
|
... | ... | |
768 |
768 |
struct kvm_run *run = env->kvm_run;
|
769 |
769 |
int ret;
|
770 |
770 |
|
771 |
|
dprintf("kvm_cpu_exec()\n");
|
|
771 |
DPRINTF("kvm_cpu_exec()\n");
|
772 |
772 |
|
773 |
773 |
do {
|
774 |
774 |
#ifndef CONFIG_IOTHREAD
|
775 |
775 |
if (env->exit_request) {
|
776 |
|
dprintf("interrupt exit requested\n");
|
|
776 |
DPRINTF("interrupt exit requested\n");
|
777 |
777 |
ret = 0;
|
778 |
778 |
break;
|
779 |
779 |
}
|
... | ... | |
792 |
792 |
|
793 |
793 |
if (ret == -EINTR || ret == -EAGAIN) {
|
794 |
794 |
cpu_exit(env);
|
795 |
|
dprintf("io window exit\n");
|
|
795 |
DPRINTF("io window exit\n");
|
796 |
796 |
ret = 0;
|
797 |
797 |
break;
|
798 |
798 |
}
|
799 |
799 |
|
800 |
800 |
if (ret < 0) {
|
801 |
|
dprintf("kvm run failed %s\n", strerror(-ret));
|
|
801 |
DPRINTF("kvm run failed %s\n", strerror(-ret));
|
802 |
802 |
abort();
|
803 |
803 |
}
|
804 |
804 |
|
... | ... | |
807 |
807 |
ret = 0; /* exit loop */
|
808 |
808 |
switch (run->exit_reason) {
|
809 |
809 |
case KVM_EXIT_IO:
|
810 |
|
dprintf("handle_io\n");
|
|
810 |
DPRINTF("handle_io\n");
|
811 |
811 |
ret = kvm_handle_io(run->io.port,
|
812 |
812 |
(uint8_t *)run + run->io.data_offset,
|
813 |
813 |
run->io.direction,
|
... | ... | |
815 |
815 |
run->io.count);
|
816 |
816 |
break;
|
817 |
817 |
case KVM_EXIT_MMIO:
|
818 |
|
dprintf("handle_mmio\n");
|
|
818 |
DPRINTF("handle_mmio\n");
|
819 |
819 |
cpu_physical_memory_rw(run->mmio.phys_addr,
|
820 |
820 |
run->mmio.data,
|
821 |
821 |
run->mmio.len,
|
... | ... | |
823 |
823 |
ret = 1;
|
824 |
824 |
break;
|
825 |
825 |
case KVM_EXIT_IRQ_WINDOW_OPEN:
|
826 |
|
dprintf("irq_window_open\n");
|
|
826 |
DPRINTF("irq_window_open\n");
|
827 |
827 |
break;
|
828 |
828 |
case KVM_EXIT_SHUTDOWN:
|
829 |
|
dprintf("shutdown\n");
|
|
829 |
DPRINTF("shutdown\n");
|
830 |
830 |
qemu_system_reset_request();
|
831 |
831 |
ret = 1;
|
832 |
832 |
break;
|
833 |
833 |
case KVM_EXIT_UNKNOWN:
|
834 |
|
dprintf("kvm_exit_unknown\n");
|
|
834 |
DPRINTF("kvm_exit_unknown\n");
|
835 |
835 |
break;
|
836 |
836 |
case KVM_EXIT_FAIL_ENTRY:
|
837 |
|
dprintf("kvm_exit_fail_entry\n");
|
|
837 |
DPRINTF("kvm_exit_fail_entry\n");
|
838 |
838 |
break;
|
839 |
839 |
case KVM_EXIT_EXCEPTION:
|
840 |
|
dprintf("kvm_exit_exception\n");
|
|
840 |
DPRINTF("kvm_exit_exception\n");
|
841 |
841 |
break;
|
842 |
842 |
case KVM_EXIT_DEBUG:
|
843 |
|
dprintf("kvm_exit_debug\n");
|
|
843 |
DPRINTF("kvm_exit_debug\n");
|
844 |
844 |
#ifdef KVM_CAP_SET_GUEST_DEBUG
|
845 |
845 |
if (kvm_arch_debug(&run->debug.arch)) {
|
846 |
846 |
gdb_set_stop_cpu(env);
|
... | ... | |
853 |
853 |
#endif /* KVM_CAP_SET_GUEST_DEBUG */
|
854 |
854 |
break;
|
855 |
855 |
default:
|
856 |
|
dprintf("kvm_arch_handle_exit\n");
|
|
856 |
DPRINTF("kvm_arch_handle_exit\n");
|
857 |
857 |
ret = kvm_arch_handle_exit(env, run);
|
858 |
858 |
break;
|
859 |
859 |
}
|