From: "Radim Krčmář" <rkrcmar@redhat.com>
To: Wanpeng Li <kernellwp@gmail.com>
Cc: linux-kernel@vger.kernel.org, kvm@vger.kernel.org,
Paolo Bonzini <pbonzini@redhat.com>,
Wanpeng Li <wanpeng.li@hotmail.com>
Subject: Re: [PATCH v2 4/4] KVM: LAPIC: Don't silently accept bad vectors
Date: Tue, 3 Oct 2017 19:53:41 +0200 [thread overview]
Message-ID: <20171003175341.GD21107@flask> (raw)
In-Reply-To: <1506647099-2688-5-git-send-email-wanpeng.li@hotmail.com>
2017-09-28 18:04-0700, Wanpeng Li:
> From: Wanpeng Li <wanpeng.li@hotmail.com>
>
> Vectors 0-15 are reserved, and a physical LAPIC - upon sending or
> receiving one - would generate an APIC error instead of doing the
> requested action. Make our emulation behave similarly.
>
> Cc: Paolo Bonzini <pbonzini@redhat.com>
> Cc: Radim Krčmář <rkrcmar@redhat.com>
> Signed-off-by: Wanpeng Li <wanpeng.li@hotmail.com>
> ---
> arch/x86/kvm/lapic.c | 30 ++++++++++++++++++++++++++++--
> 1 file changed, 28 insertions(+), 2 deletions(-)
>
> diff --git a/arch/x86/kvm/lapic.c b/arch/x86/kvm/lapic.c
> index 6bafd06..a779ba9 100644
> --- a/arch/x86/kvm/lapic.c
> +++ b/arch/x86/kvm/lapic.c
> @@ -935,6 +935,25 @@ bool kvm_intr_is_single_vcpu_fast(struct kvm *kvm, struct kvm_lapic_irq *irq,
> return ret;
> }
>
> +static void apic_error(struct kvm_lapic *apic, unsigned long errmask)
> +{
> + uint32_t esr;
> +
> + esr = kvm_lapic_get_reg(apic, APIC_ESR);
> +
> + if ((esr & errmask) != errmask) {
The spec makes me think that there is going to be only 1 interrupt
(regardless of the number errors) until the software writes 0 to
APIC_ESR. Is there a better description than the following 10.5.3?
The ESR is a write/read register. Before attempt to read from the ESR,
software should first write to it. (The value written does not affect
the values read subsequently; only zero may be written in x2APIC
mode.) This write clears any previously logged errors and updates the
ESR with any errors detected since the last write to the ESR. This
write also rearms the APIC error interrupt triggering mechanism.
This also describes a different handling of APIC_ESR -- APIC_ESR is
updated only on software writes to APIC_ESR. All errors in between seem
to be logged internally (not sure where to migrate it).
> + uint32_t lvterr = kvm_lapic_get_reg(apic, APIC_LVTERR);
> +
> + kvm_lapic_set_reg(apic, APIC_ESR, esr | errmask);
> + if (!(lvterr & APIC_LVT_MASKED)) {
> + struct kvm_lapic_irq irq;
> +
> + irq.vector = lvterr & 0xff;
> + kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq, NULL);
> + }
> + }
> +}
> +
> /*
> * Add a pending IRQ into lapic.
> * Return 1 if successfully added and 0 if discarded.
> @@ -946,6 +965,11 @@ static int __apic_accept_irq(struct kvm_lapic *apic, int delivery_mode,
> int result = 0;
> struct kvm_vcpu *vcpu = apic->vcpu;
>
> + if (unlikely(vector < 16) && delivery_mode == APIC_DM_FIXED) {
> + apic_error(apic, APIC_ESR_RECVILL);
The error is also triggered if lowest priority is supported and tries to
deliver an invalid vector.
> + return 0;
> + }
> +
> trace_kvm_apic_accept_irq(vcpu->vcpu_id, delivery_mode,
> trig_mode, vector);
> switch (delivery_mode) {
> @@ -1146,7 +1170,10 @@ static void apic_send_ipi(struct kvm_lapic *apic)
> irq.trig_mode, irq.level, irq.dest_mode, irq.delivery_mode,
> irq.vector, irq.msi_redir_hint);
>
> - kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq, NULL);
> + if (unlikely(irq.vector < 16 && irq.delivery_mode == APIC_DM_FIXED))
Please check how APICv self-IPI acceleration behaves, so we're
consistent.
Thanks.
> + apic_error(apic, APIC_ESR_SENDILL);
> + else
> + kvm_irq_delivery_to_apic(apic->vcpu->kvm, apic, &irq, NULL);
> }
>
> static u32 apic_get_tmcct(struct kvm_lapic *apic)
> @@ -1734,7 +1761,6 @@ int kvm_lapic_reg_write(struct kvm_lapic *apic, u32 reg, u32 val)
> case APIC_LVTPC:
> case APIC_LVT1:
> case APIC_LVTERR:
> - /* TODO: Check vector */
> if (!kvm_apic_sw_enabled(apic))
> val |= APIC_LVT_MASKED;
>
> --
> 2.7.4
>
next prev parent reply other threads:[~2017-10-03 17:53 UTC|newest]
Thread overview: 27+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-09-29 1:04 [PATCH v2 0/4] KVM: LAPIC: Rework lapic timer to behave more like real-hardware Wanpeng Li
2017-09-29 1:04 ` [PATCH v2 1/4] KVM: LAPIC: Fix lapic timer mode transition Wanpeng Li
2017-10-03 17:05 ` Radim Krčmář
2017-10-04 1:45 ` Wanpeng Li
2017-10-04 13:21 ` Radim Krčmář
2017-10-04 13:50 ` Wanpeng Li
2017-10-04 14:02 ` Wanpeng Li
2017-09-29 1:04 ` [PATCH v2 2/4] KVM: LAPIC: Keep timer running when switching between one-shot and periodic mode Wanpeng Li
2017-10-03 17:06 ` Radim Krčmář
2017-10-04 1:46 ` Wanpeng Li
2017-10-04 13:33 ` Radim Krčmář
2017-10-04 13:57 ` Wanpeng Li
2017-09-29 1:04 ` [PATCH v2 3/4] KVM: LAPIC: Apply change to TDCR right away to the timer Wanpeng Li
2017-10-03 17:28 ` Radim Krčmář
2017-10-04 1:59 ` Wanpeng Li
2017-10-04 12:43 ` Radim Krčmář
2017-09-29 1:04 ` [PATCH v2 4/4] KVM: LAPIC: Don't silently accept bad vectors Wanpeng Li
2017-10-03 17:53 ` Radim Krčmář [this message]
2017-10-04 7:56 ` Wanpeng Li
2017-10-04 12:01 ` Radim Krčmář
2017-10-04 14:16 ` Wanpeng Li
2017-10-04 14:44 ` Radim Krčmář
2017-10-13 1:17 ` Wanpeng Li
2017-10-13 17:36 ` Radim Krčmář
2017-10-13 20:31 ` Radim Krčmář
2017-10-15 2:41 ` Wanpeng Li
2017-10-05 10:57 ` [PATCH v2 0/4] KVM: LAPIC: Rework lapic timer to behave more like real-hardware Wanpeng Li
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=20171003175341.GD21107@flask \
--to=rkrcmar@redhat.com \
--cc=kernellwp@gmail.com \
--cc=kvm@vger.kernel.org \
--cc=linux-kernel@vger.kernel.org \
--cc=pbonzini@redhat.com \
--cc=wanpeng.li@hotmail.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox