提交 99bf1b35 编写于 作者: X xianglai li

loongarch/kvm: Fixed extioi hardware emulation bugs

LoongArch inclusion
category: bugfix
bugzilla: https://gitee.com/openeuler/kernel/issues/I7QOYY

------------------------------------------

When the extioi controller is enabled,
the data in the extioi controller should
not be emptied.Otherwise, the interrupt triggered
when kdump re-enters the kernel will cause the register state
in the extioi controller to be inconsistent with the ESTAT register
state after extioi is enabled, and finally cause the extended interrupt
to be triggered all the time.
Signed-off-by: Nxianglai li <lixianglai@loongson.cn>
上级 87684ac5
......@@ -347,8 +347,6 @@ static int kvm_iocsr_common_set(struct kvm_run *run, struct kvm_vcpu *vcpu,
static int kvm_misc_set(struct kvm_run *run, struct kvm_vcpu *vcpu, u32 addr,
u64 val)
{
if ((val & KVM_IOCSRF_MISC_FUNC_EXT_IOI_EN) && vcpu->vcpu_id == 0)
kvm_setup_ls3a_extirq(vcpu->kvm);
return kvm_iocsr_common_set(run, vcpu, addr, val);
}
......@@ -653,9 +651,6 @@ int _kvm_set_iocsr(struct kvm *kvm, struct kvm_iocsr_entry *__user argp)
}
spin_unlock(&kvm->arch.iocsr_lock);
if (tmp.addr == KVM_IOCSR_MISC_FUNC)
kvm_enable_ls3a_extirq(kvm, tmp.data & KVM_IOCSRF_MISC_FUNC_EXT_IOI_EN);
out:
return r;
}
......
......@@ -110,9 +110,6 @@ void msi_irq_handler(struct kvm *kvm, int irq, int level)
struct ls3a_kvm_extirq *s = ls3a_ext_irqchip(kvm);
struct kvm_ls3a_extirq_state *state = &(s->ls3a_ext_irq);
if (!atomic64_read(&s->enabled))
return;
kvm_debug("ext_irq_handler:irq = %d,level = %d\n", irq, level);
ls3a_ext_irq_lock(s, flags);
......@@ -731,7 +728,6 @@ int kvm_create_ls3a_ext_irq(struct kvm *kvm)
memset((void *)&s->ls3a_ext_irq, 0x0, sizeof(struct kvm_ls3a_extirq_state));
spin_lock_init(&s->lock);
atomic64_set(&s->enabled, 0);
s->kvm = kvm;
/*
......@@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm)
memset(extirq_state, 0, sizeof(struct kvm_ls3a_extirq_state));
ls3a_ext_irq_unlock(v_extirq, flags);
atomic64_set(&v_extirq->enabled, 1);
return 0;
}
int kvm_enable_ls3a_extirq(struct kvm *kvm, bool enable)
{
struct ls3a_kvm_extirq *v_extirq = ls3a_ext_irqchip(kvm);
if (v_extirq)
atomic64_set(&v_extirq->enabled, enable);
return 0;
}
......@@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
struct ls3a_kvm_extirq *irqchip)
{
struct kvm_ls3a_extirq_state *extirq;
int i = 0, j = 0;
int i, j = 0;
unsigned long flags;
seq_puts(s, "LS3A ext irqchip state:\n");
......@@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
extirq = &(irqchip->ls3a_ext_irq);
ls3a_ext_irq_lock(irqchip, flags);
i = (int)atomic64_read(&irqchip->enabled);
seq_printf(s, "ext irq enabled:%d", i);
seq_puts(s, "ext irq enabled");
seq_puts(s, "\nenabled:(Not Enabled)");
for (i = 0; i < EXTIOI_IRQS; i++) {
if (!test_bit(i, (void *)&extirq->ext_en))
......
......@@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state {
struct ls3a_kvm_extirq {
spinlock_t lock;
struct kvm *kvm;
atomic64_t enabled;
struct kvm_io_device device;
struct kvm_ls3a_extirq_state ls3a_ext_irq;
};
......@@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm,
void kvm_destroy_ls3a_ext_irq(struct kvm *kvm);
void msi_irq_handler(struct kvm *kvm, int irq, int level);
int kvm_setup_ls3a_extirq(struct kvm *kvm);
int kvm_enable_ls3a_extirq(struct kvm *kvm, bool enable);
void kvm_dump_ls3a_extirq_state(struct seq_file *m, struct ls3a_kvm_extirq *irqchip);
#endif
......@@ -973,7 +973,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu,
case KVM_REG_LOONGARCH_VCPU_RESET:
kvm_reset_timer(vcpu);
if (vcpu->vcpu_id == 0)
kvm_enable_ls3a_extirq(vcpu->kvm, false);
kvm_setup_ls3a_extirq(vcpu->kvm);
memset(&vcpu->arch.irq_pending, 0, sizeof(vcpu->arch.irq_pending));
memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear));
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册