mirror of
https://github.com/Motorhead1991/qemu.git
synced 2025-08-02 23:33:54 -06:00
Merge remote-tracking branch 'qemu-kvm/uq/master' into stable-1.5
* qemu-kvm/uq/master: kvm-stub: fix compilation kvm: shorten the parameter list for get_real_device() kvm: i386: fix LAPIC TSC deadline timer save/restore kvm-all.c: max_cpus should not exceed KVM vcpu limit kvm: Simplify kvm_handle_io kvm: x86: fix setting IA32_FEATURE_CONTROL with nested VMX disabled kvm: add KVM_IRQFD_FLAG_RESAMPLE support kvm: migrate vPMU state target-i386: remove tabs from target-i386/cpu.h Initialize IA32_FEATURE_CONTROL MSR in reset and migration Conflicts: target-i386/cpu.h target-i386/kvm.c aliguori: fixup trivial conflicts due to whitespace and added cpu argument Signed-off-by: Anthony Liguori <anthony@codemonkey.ws>
This commit is contained in:
commit
b5d54bd421
9 changed files with 332 additions and 125 deletions
52
kvm-all.c
52
kvm-all.c
|
@ -1230,7 +1230,8 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)
|
|||
return kvm_update_routing_entry(s, &kroute);
|
||||
}
|
||||
|
||||
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign)
|
||||
static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int rfd, int virq,
|
||||
bool assign)
|
||||
{
|
||||
struct kvm_irqfd irqfd = {
|
||||
.fd = fd,
|
||||
|
@ -1238,6 +1239,11 @@ static int kvm_irqchip_assign_irqfd(KVMState *s, int fd, int virq, bool assign)
|
|||
.flags = assign ? 0 : KVM_IRQFD_FLAG_DEASSIGN,
|
||||
};
|
||||
|
||||
if (rfd != -1) {
|
||||
irqfd.flags |= KVM_IRQFD_FLAG_RESAMPLE;
|
||||
irqfd.resamplefd = rfd;
|
||||
}
|
||||
|
||||
if (!kvm_irqfds_enabled()) {
|
||||
return -ENOSYS;
|
||||
}
|
||||
|
@ -1276,14 +1282,17 @@ int kvm_irqchip_update_msi_route(KVMState *s, int virq, MSIMessage msg)
|
|||
}
|
||||
#endif /* !KVM_CAP_IRQ_ROUTING */
|
||||
|
||||
int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n, int virq)
|
||||
int kvm_irqchip_add_irqfd_notifier(KVMState *s, EventNotifier *n,
|
||||
EventNotifier *rn, int virq)
|
||||
{
|
||||
return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n), virq, true);
|
||||
return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n),
|
||||
rn ? event_notifier_get_fd(rn) : -1, virq, true);
|
||||
}
|
||||
|
||||
int kvm_irqchip_remove_irqfd_notifier(KVMState *s, EventNotifier *n, int virq)
|
||||
{
|
||||
return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n), virq, false);
|
||||
return kvm_irqchip_assign_irqfd(s, event_notifier_get_fd(n), -1, virq,
|
||||
false);
|
||||
}
|
||||
|
||||
static int kvm_irqchip_create(KVMState *s)
|
||||
|
@ -1391,6 +1400,13 @@ int kvm_init(void)
|
|||
goto err;
|
||||
}
|
||||
|
||||
if (max_cpus > max_vcpus) {
|
||||
ret = -EINVAL;
|
||||
fprintf(stderr, "Number of hotpluggable cpus requested (%d) exceeds max cpus "
|
||||
"supported by KVM (%d)\n", max_cpus, max_vcpus);
|
||||
goto err;
|
||||
}
|
||||
|
||||
s->vmfd = kvm_ioctl(s, KVM_CREATE_VM, 0);
|
||||
if (s->vmfd < 0) {
|
||||
#ifdef TARGET_S390X
|
||||
|
@ -1499,32 +1515,8 @@ static void kvm_handle_io(uint16_t port, void *data, int direction, int size,
|
|||
uint8_t *ptr = data;
|
||||
|
||||
for (i = 0; i < count; i++) {
|
||||
if (direction == KVM_EXIT_IO_IN) {
|
||||
switch (size) {
|
||||
case 1:
|
||||
stb_p(ptr, cpu_inb(port));
|
||||
break;
|
||||
case 2:
|
||||
stw_p(ptr, cpu_inw(port));
|
||||
break;
|
||||
case 4:
|
||||
stl_p(ptr, cpu_inl(port));
|
||||
break;
|
||||
}
|
||||
} else {
|
||||
switch (size) {
|
||||
case 1:
|
||||
cpu_outb(port, ldub_p(ptr));
|
||||
break;
|
||||
case 2:
|
||||
cpu_outw(port, lduw_p(ptr));
|
||||
break;
|
||||
case 4:
|
||||
cpu_outl(port, ldl_p(ptr));
|
||||
break;
|
||||
}
|
||||
}
|
||||
|
||||
address_space_rw(&address_space_io, port, ptr, size,
|
||||
direction == KVM_EXIT_IO_OUT);
|
||||
ptr += size;
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue