mirror of
https://mirrors.bfsu.edu.cn/git/linux.git
synced 2024-11-30 07:34:12 +08:00
KVM: Bypass irq_pending get/set when using in kernel irqchip
vcpu->irq_pending is saved in get/set_sreg IOCTL, but when in-kernel local APIC is used, doing this may occasionally overwrite vcpu->apic to an invalid value, as in the vm restore path. Signed-off-by: Qing He <qing.he@intel.com>
This commit is contained in:
parent
6ceb9d791e
commit
c52fb35a8b
@ -2145,8 +2145,12 @@ static int kvm_vcpu_ioctl_get_sregs(struct kvm_vcpu *vcpu,
|
||||
sregs->efer = vcpu->shadow_efer;
|
||||
sregs->apic_base = kvm_get_apic_base(vcpu);
|
||||
|
||||
memcpy(sregs->interrupt_bitmap, vcpu->irq_pending,
|
||||
sizeof sregs->interrupt_bitmap);
|
||||
if (irqchip_in_kernel(vcpu->kvm))
|
||||
memset(sregs->interrupt_bitmap, 0,
|
||||
sizeof sregs->interrupt_bitmap);
|
||||
else
|
||||
memcpy(sregs->interrupt_bitmap, vcpu->irq_pending,
|
||||
sizeof sregs->interrupt_bitmap);
|
||||
|
||||
vcpu_put(vcpu);
|
||||
|
||||
@ -2200,12 +2204,14 @@ static int kvm_vcpu_ioctl_set_sregs(struct kvm_vcpu *vcpu,
|
||||
if (mmu_reset_needed)
|
||||
kvm_mmu_reset_context(vcpu);
|
||||
|
||||
memcpy(vcpu->irq_pending, sregs->interrupt_bitmap,
|
||||
sizeof vcpu->irq_pending);
|
||||
vcpu->irq_summary = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(vcpu->irq_pending); ++i)
|
||||
if (vcpu->irq_pending[i])
|
||||
__set_bit(i, &vcpu->irq_summary);
|
||||
if (!irqchip_in_kernel(vcpu->kvm)) {
|
||||
memcpy(vcpu->irq_pending, sregs->interrupt_bitmap,
|
||||
sizeof vcpu->irq_pending);
|
||||
vcpu->irq_summary = 0;
|
||||
for (i = 0; i < ARRAY_SIZE(vcpu->irq_pending); ++i)
|
||||
if (vcpu->irq_pending[i])
|
||||
__set_bit(i, &vcpu->irq_summary);
|
||||
}
|
||||
|
||||
set_segment(vcpu, &sregs->cs, VCPU_SREG_CS);
|
||||
set_segment(vcpu, &sregs->ds, VCPU_SREG_DS);
|
||||
|
Loading…
Reference in New Issue
Block a user