提交 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, ...@@ -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, static int kvm_misc_set(struct kvm_run *run, struct kvm_vcpu *vcpu, u32 addr,
u64 val) 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); 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) ...@@ -653,9 +651,6 @@ int _kvm_set_iocsr(struct kvm *kvm, struct kvm_iocsr_entry *__user argp)
} }
spin_unlock(&kvm->arch.iocsr_lock); 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: out:
return r; return r;
} }
......
...@@ -110,9 +110,6 @@ void msi_irq_handler(struct kvm *kvm, int irq, int level) ...@@ -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 ls3a_kvm_extirq *s = ls3a_ext_irqchip(kvm);
struct kvm_ls3a_extirq_state *state = &(s->ls3a_ext_irq); 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); kvm_debug("ext_irq_handler:irq = %d,level = %d\n", irq, level);
ls3a_ext_irq_lock(s, flags); ls3a_ext_irq_lock(s, flags);
...@@ -731,7 +728,6 @@ int kvm_create_ls3a_ext_irq(struct kvm *kvm) ...@@ -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)); memset((void *)&s->ls3a_ext_irq, 0x0, sizeof(struct kvm_ls3a_extirq_state));
spin_lock_init(&s->lock); spin_lock_init(&s->lock);
atomic64_set(&s->enabled, 0);
s->kvm = kvm; s->kvm = kvm;
/* /*
...@@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm) ...@@ -872,18 +868,6 @@ int kvm_setup_ls3a_extirq(struct kvm *kvm)
memset(extirq_state, 0, sizeof(struct kvm_ls3a_extirq_state)); memset(extirq_state, 0, sizeof(struct kvm_ls3a_extirq_state));
ls3a_ext_irq_unlock(v_extirq, flags); 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; return 0;
} }
...@@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s, ...@@ -891,7 +875,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
struct ls3a_kvm_extirq *irqchip) struct ls3a_kvm_extirq *irqchip)
{ {
struct kvm_ls3a_extirq_state *extirq; struct kvm_ls3a_extirq_state *extirq;
int i = 0, j = 0; int i, j = 0;
unsigned long flags; unsigned long flags;
seq_puts(s, "LS3A ext irqchip state:\n"); seq_puts(s, "LS3A ext irqchip state:\n");
...@@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s, ...@@ -901,8 +885,7 @@ void kvm_dump_ls3a_extirq_state(struct seq_file *s,
extirq = &(irqchip->ls3a_ext_irq); extirq = &(irqchip->ls3a_ext_irq);
ls3a_ext_irq_lock(irqchip, flags); ls3a_ext_irq_lock(irqchip, flags);
i = (int)atomic64_read(&irqchip->enabled); seq_puts(s, "ext irq enabled");
seq_printf(s, "ext irq enabled:%d", i);
seq_puts(s, "\nenabled:(Not Enabled)"); seq_puts(s, "\nenabled:(Not Enabled)");
for (i = 0; i < EXTIOI_IRQS; i++) { for (i = 0; i < EXTIOI_IRQS; i++) {
if (!test_bit(i, (void *)&extirq->ext_en)) if (!test_bit(i, (void *)&extirq->ext_en))
......
...@@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state { ...@@ -98,7 +98,6 @@ typedef struct kvm_ls3a_extirq_state {
struct ls3a_kvm_extirq { struct ls3a_kvm_extirq {
spinlock_t lock; spinlock_t lock;
struct kvm *kvm; struct kvm *kvm;
atomic64_t enabled;
struct kvm_io_device device; struct kvm_io_device device;
struct kvm_ls3a_extirq_state ls3a_ext_irq; struct kvm_ls3a_extirq_state ls3a_ext_irq;
}; };
...@@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm, ...@@ -126,6 +125,5 @@ int kvm_set_ls3a_extirq(struct kvm *kvm,
void kvm_destroy_ls3a_ext_irq(struct kvm *kvm); void kvm_destroy_ls3a_ext_irq(struct kvm *kvm);
void msi_irq_handler(struct kvm *kvm, int irq, int level); void msi_irq_handler(struct kvm *kvm, int irq, int level);
int kvm_setup_ls3a_extirq(struct kvm *kvm); 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); void kvm_dump_ls3a_extirq_state(struct seq_file *m, struct ls3a_kvm_extirq *irqchip);
#endif #endif
...@@ -973,7 +973,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu, ...@@ -973,7 +973,7 @@ static int _kvm_set_one_reg(struct kvm_vcpu *vcpu,
case KVM_REG_LOONGARCH_VCPU_RESET: case KVM_REG_LOONGARCH_VCPU_RESET:
kvm_reset_timer(vcpu); kvm_reset_timer(vcpu);
if (vcpu->vcpu_id == 0) 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_pending, 0, sizeof(vcpu->arch.irq_pending));
memset(&vcpu->arch.irq_clear, 0, sizeof(vcpu->arch.irq_clear)); 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.
先完成此消息的编辑!
想要评论请 注册