@@ -1570,7 +1570,7 @@ void cpu_interrupt(CPUState *env, int mask)
old_mask = env->interrupt_request;
env->interrupt_request |= mask;
- if (kvm_enabled() && !qemu_kvm_irqchip_in_kernel())
+ if (kvm_enabled() && !kvm_irqchip_in_kernel())
kvm_update_interrupt_request(env);
#ifndef CONFIG_USER_ONLY
@@ -301,7 +301,7 @@ void cpu_set_apic_base(CPUState *env, uint64_t val)
#endif
if (!s)
return;
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel())
+ if (kvm_enabled() && kvm_irqchip_in_kernel())
s->apicbase = val;
else
s->apicbase = (val & 0xfffff000) |
@@ -509,7 +509,7 @@ void apic_init_reset(CPUState *env)
env->halted = !(s->apicbase & MSR_IA32_APICBASE_BSP);
#ifdef KVM_CAP_MP_STATE
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
env->mp_state
= env->halted ? KVM_MP_STATE_UNINITIALIZED : KVM_MP_STATE_RUNNABLE;
}
@@ -961,7 +961,7 @@ static void kvm_kernel_lapic_load_from_user(APICState *s)
void qemu_kvm_load_lapic(CPUState *env)
{
#ifdef KVM_CAP_IRQCHIP
- if (kvm_enabled() && kvm_vcpu_inited(env) && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_vcpu_inited(env) && kvm_irqchip_in_kernel()) {
kvm_kernel_lapic_load_from_user(env->apic_state);
}
#endif
@@ -972,7 +972,7 @@ static void apic_pre_save(void *opaque)
#ifdef KVM_CAP_IRQCHIP
APICState *s = (void *)opaque;
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_kernel_lapic_save_to_user(s);
}
#endif
@@ -983,7 +983,7 @@ static int apic_post_load(void *opaque, int version_id)
#ifdef KVM_CAP_IRQCHIP
APICState *s = opaque;
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_kernel_lapic_load_from_user(s);
}
#endif
@@ -244,7 +244,7 @@ static void ioapic_pre_save(void *opaque)
{
IOAPICState *s = (void *)opaque;
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_kernel_ioapic_save_to_user(s);
}
}
@@ -263,7 +263,7 @@ static int ioapic_post_load(void *opaque, int version_id)
{
IOAPICState *s = opaque;
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_kernel_ioapic_load_from_user(s);
}
return 0;
@@ -297,7 +297,7 @@ static void ioapic_reset(void *opaque)
for(i = 0; i < IOAPIC_NUM_PINS; i++)
s->ioredtbl[i] = 1 << 16; /* mask LVT */
#ifdef KVM_CAP_IRQCHIP
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_kernel_ioapic_load_from_user(s);
}
#endif
@@ -221,7 +221,7 @@ static int msix_add_config(struct PCIDevice *pdev, unsigned short nentries,
static void msix_free_irq_entries(PCIDevice *dev)
{
int vector;
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_msix_free(dev);
}
@@ -298,7 +298,7 @@ static void msix_mmio_writel(void *opaque, target_phys_addr_t addr,
int vector = offset / MSIX_ENTRY_SIZE;
int was_masked = msix_is_masked(dev, vector);
memcpy(dev->msix_table_page + offset, &val, 4);
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_msix_update(dev, vector, was_masked, msix_is_masked(dev, vector));
}
if (!msix_is_masked(dev, vector) && msix_is_pending(dev, vector)) {
@@ -354,7 +354,7 @@ int msix_init(struct PCIDevice *dev, unsigned short nentries,
return -EINVAL;
#ifdef KVM_CAP_IRQCHIP
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
dev->msix_irq_entries = qemu_malloc(nentries *
sizeof *dev->msix_irq_entries);
}
@@ -478,7 +478,7 @@ void msix_notify(PCIDevice *dev, unsigned vector)
}
#ifdef KVM_CAP_IRQCHIP
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_set_irq(dev->msix_irq_entries[vector].gsi, 1, NULL);
return;
}
@@ -516,7 +516,7 @@ int msix_vector_use(PCIDevice *dev, unsigned vector)
if (dev->msix_entry_used[vector]) {
return 0;
}
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
ret = kvm_msix_add(dev, vector);
if (ret) {
return ret;
@@ -531,7 +531,7 @@ void msix_vector_unuse(PCIDevice *dev, unsigned vector)
{
if (vector < dev->msix_entries_nr && dev->msix_entry_used[vector]) {
--dev->msix_entry_used[vector];
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
kvm_msix_del(dev, vector);
}
}
@@ -1288,7 +1288,7 @@ static void pc_init1(ram_addr_t ram_size,
cpu_irq = qemu_allocate_irqs(pic_irq_request, NULL, 1);
#ifdef KVM_CAP_IRQCHIP
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel()) {
+ if (kvm_enabled() && kvm_irqchip_in_kernel()) {
isa_irq_state = qemu_mallocz(sizeof(*isa_irq_state));
isa_irq = i8259 = kvm_i8259_init(cpu_irq[0]);
} else
@@ -679,7 +679,7 @@ void pci_default_write_config(PCIDevice *d, uint32_t addr, uint32_t val, int l)
}
#ifdef CONFIG_KVM_DEVICE_ASSIGNMENT
- if (kvm_enabled() && qemu_kvm_irqchip_in_kernel() &&
+ if (kvm_enabled() && kvm_irqchip_in_kernel() &&
addr >= PIIX_CONFIG_IRQ_ROUTE &&
addr < PIIX_CONFIG_IRQ_ROUTE + 4)
assigned_dev_update_irqs();
@@ -155,12 +155,14 @@ static void kvm_reset_vcpu(void *opaque)
abort();
}
}
+#endif
int kvm_irqchip_in_kernel(void)
{
return kvm_state->irqchip_in_kernel;
}
+#ifdef KVM_UPSTREAM
int kvm_pit_in_kernel(void)
{
return kvm_state->pit_in_kernel;
@@ -284,7 +284,7 @@ int kvm_destroy_memory_alias(kvm_context_t kvm, uint64_t phys_start)
int kvm_get_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
{
int r;
- if (!kvm_irqchip_in_kernel(vcpu->kvm))
+ if (!kvm_irqchip_in_kernel())
return 0;
r = ioctl(vcpu->fd, KVM_GET_LAPIC, s);
if (r == -1) {
@@ -297,7 +297,7 @@ int kvm_get_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
int kvm_set_lapic(kvm_vcpu_context_t vcpu, struct kvm_lapic_state *s)
{
int r;
- if (!kvm_irqchip_in_kernel(vcpu->kvm))
+ if (!kvm_irqchip_in_kernel())
return 0;
r = ioctl(vcpu->fd, KVM_SET_LAPIC, s);
if (r == -1) {
@@ -1376,7 +1376,7 @@ int kvm_arch_halt(void *opaque, kvm_vcpu_context_t vcpu)
void kvm_arch_pre_kvm_run(void *opaque, CPUState *env)
{
- if (!kvm_irqchip_in_kernel(kvm_context))
+ if (!kvm_irqchip_in_kernel())
kvm_set_cr8(env->kvm_cpu_state.vcpu_ctx, cpu_get_apic_tpr(env));
}
@@ -1440,7 +1440,7 @@ void kvm_arch_cpu_reset(CPUState *env)
{
kvm_arch_load_regs(env);
if (!cpu_is_bsp(env)) {
- if (kvm_irqchip_in_kernel(kvm_context)) {
+ if (kvm_irqchip_in_kernel()) {
#ifdef KVM_CAP_MP_STATE
kvm_reset_mpstate(env->kvm_cpu_state.vcpu_ctx);
#endif
@@ -558,6 +558,7 @@ void kvm_create_irqchip(kvm_context_t kvm)
}
}
#endif
+ kvm_state->irqchip_in_kernel = kvm->irqchip_in_kernel;
}
int kvm_create(kvm_context_t kvm, unsigned long phys_mem_bytes, void **vm_mem)
@@ -1109,11 +1110,6 @@ int kvm_set_signal_mask(kvm_vcpu_context_t vcpu, const sigset_t *sigset)
return r;
}
-int kvm_irqchip_in_kernel(kvm_context_t kvm)
-{
- return kvm->irqchip_in_kernel;
-}
-
int kvm_pit_in_kernel(kvm_context_t kvm)
{
return kvm->pit_in_kernel;
@@ -1610,7 +1606,7 @@ void kvm_arch_get_registers(CPUState *env)
kvm_arch_save_regs(env);
kvm_arch_save_mpstate(env);
#ifdef KVM_CAP_MP_STATE
- if (kvm_irqchip_in_kernel(kvm_context))
+ if (kvm_irqchip_in_kernel())
env->halted = (env->mp_state == KVM_MP_STATE_HALTED);
#endif
}
@@ -1967,7 +1963,7 @@ static int kvm_main_loop_cpu(CPUState *env)
while (1) {
int run_cpu = !is_cpu_stopped(env);
- if (run_cpu && !kvm_irqchip_in_kernel(kvm_context)) {
+ if (run_cpu && !kvm_irqchip_in_kernel()) {
process_irqchip_events(env);
run_cpu = !env->halted;
}
@@ -553,13 +553,6 @@ int kvm_dirty_pages_log_enable_all(kvm_context_t kvm);
*/
int kvm_dirty_pages_log_reset(kvm_context_t kvm);
-/*!
- * \brief Query whether in kernel irqchip is used
- *
- * \param kvm Pointer to the current kvm_context
- */
-int kvm_irqchip_in_kernel(kvm_context_t kvm);
-
#ifdef KVM_CAP_IRQCHIP
/*!
* \brief Dump in kernel IRQCHIP contents
@@ -1122,7 +1115,6 @@ int handle_tpr_access(void *opaque, kvm_vcpu_context_t vcpu, uint64_t rip,
int kvm_has_sync_mmu(void);
#define kvm_enabled() (kvm_allowed)
-#define qemu_kvm_irqchip_in_kernel() kvm_irqchip_in_kernel(kvm_context)
#define qemu_kvm_pit_in_kernel() kvm_pit_in_kernel(kvm_context)
#define qemu_kvm_has_gsi_routing() kvm_has_gsi_routing(kvm_context)
#ifdef TARGET_I386
@@ -1134,7 +1126,6 @@ void kvm_load_tsc(CPUState *env);
#define kvm_has_sync_mmu() (0)
#define kvm_enabled() (0)
#define kvm_nested 0
-#define qemu_kvm_irqchip_in_kernel() (0)
#define qemu_kvm_pit_in_kernel() (0)
#define qemu_kvm_has_gsi_routing() (0)
#ifndef QEMU_KVM_NO_CPU
@@ -1210,6 +1201,8 @@ static inline int kvm_set_migration_log(int enable)
return kvm_physical_memory_set_dirty_tracking(enable);
}
+
+int kvm_irqchip_in_kernel(void);
#ifdef CONFIG_KVM
typedef struct KVMSlot {
@@ -1232,6 +1225,8 @@ typedef struct KVMState {
#ifdef KVM_CAP_SET_GUEST_DEBUG
struct kvm_sw_breakpoint_head kvm_sw_breakpoints;
#endif
+ int irqchip_in_kernel;
+
struct kvm_context kvm_context;
} KVMState;