hw/mips: Implement the kvm_type() hook in MachineClass

MIPS has two types of KVM: TE & VZ, and TE is the default type. Now we
can't create a VZ guest in QEMU because it lacks the kvm_type() hook in
MachineClass. This patch add the the kvm_type() hook to support both of
the two types.

[AM: Added "if defined" guards.]

Reviewed-by: Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>
Signed-off-by: Aleksandar Markovic <aleksandar.qemu.devel@gmail.com>
Signed-off-by: Huacai Chen <chenhc@lemote.com>
Co-developed-by: Jiaxun Yang <jiaxun.yang@flygoat.com>
Message-Id: <1592995531-32600-2-git-send-email-chenhc@lemote.com>
This commit is contained in:
Huacai Chen 2020-06-24 18:45:28 +08:00 committed by Aleksandar Markovic
parent 553cf5d7c4
commit 719d109b7f
2 changed files with 37 additions and 0 deletions

View File

@ -21,10 +21,12 @@
#include "qemu/main-loop.h"
#include "qemu/timer.h"
#include "sysemu/kvm.h"
#include "sysemu/kvm_int.h"
#include "sysemu/runstate.h"
#include "sysemu/cpus.h"
#include "kvm_mips.h"
#include "exec/memattrs.h"
#include "hw/boards.h"
#define DEBUG_KVM 0
@ -1270,3 +1272,27 @@ int kvm_arch_msi_data_to_gsi(uint32_t data)
{
abort();
}
int mips_kvm_type(MachineState *machine, const char *vm_type)
{
#if defined(KVM_CAP_MIPS_VZ) || defined(KVM_CAP_MIPS_TE)
int r;
KVMState *s = KVM_STATE(machine->accelerator);
#endif
#if defined(KVM_CAP_MIPS_VZ)
r = kvm_check_extension(s, KVM_CAP_MIPS_VZ);
if (r > 0) {
return KVM_VM_MIPS_VZ;
}
#endif
#if defined(KVM_CAP_MIPS_TE)
r = kvm_check_extension(s, KVM_CAP_MIPS_TE);
if (r > 0) {
return KVM_VM_MIPS_TE;
}
#endif
return -1;
}

View File

@ -12,6 +12,8 @@
#ifndef KVM_MIPS_H
#define KVM_MIPS_H
#include "cpu.h"
/**
* kvm_mips_reset_vcpu:
* @cpu: MIPSCPU
@ -23,4 +25,13 @@ void kvm_mips_reset_vcpu(MIPSCPU *cpu);
int kvm_mips_set_interrupt(MIPSCPU *cpu, int irq, int level);
int kvm_mips_set_ipi_interrupt(MIPSCPU *cpu, int irq, int level);
#ifdef CONFIG_KVM
int mips_kvm_type(MachineState *machine, const char *vm_type);
#else
static inline int mips_kvm_type(MachineState *machine, const char *vm_type)
{
return 0;
}
#endif
#endif /* KVM_MIPS_H */