From: Christoffer Dall <cdall@linaro.org>
To: Peter Maydell <peter.maydell@linaro.org>
Cc: Marc Zyngier <marc.zyngier@arm.com>,
kvm-devel <kvm@vger.kernel.org>,
David Daney <david.daney@cavium.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Robert Richter <rrichter@cavium.com>,
arm-mail-list <linux-arm-kernel@lists.infradead.org>,
"kvmarm@lists.cs.columbia.edu" <kvmarm@lists.cs.columbia.edu>
Subject: Re: [PATCH v2 13/25] KVM: arm64: vgic-v3: Add ICV_BPR0_EL1 handler
Date: Tue, 6 Jun 2017 19:23:48 +0200 [thread overview]
Message-ID: <20170606172348.GJ9464@cbox> (raw)
In-Reply-To: <CAFEAcA9ZHZTJodXstB2YJRnM8QjZtehUwGwAnKKKceMfpB7=gQ@mail.gmail.com>
On Tue, Jun 06, 2017 at 04:56:27PM +0100, Peter Maydell wrote:
> On 6 June 2017 at 16:46, Christoffer Dall <cdall@linaro.org> wrote:
> > On Tue, Jun 06, 2017 at 04:15:05PM +0100, Marc Zyngier wrote:
> >> >> +static void __hyp_text __vgic_v3_write_bpr0(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
> >> >> +{
> >> >> + u64 val = vcpu_get_reg(vcpu, rt);
> >> >> + u8 bpr_min = 7 - vtr_to_nr_pre_bits(read_gicreg(ICH_VTR_EL2));
> >> >> +
> >> >> + /* Enforce BPR limiting */
> >> >> + if (val < bpr_min)
> >> >> + val = bpr_min;
> >> >> +
> >> >> + val <<= ICH_VMCR_BPR0_SHIFT;
> >> >> + val &= ICH_VMCR_BPR0_MASK;
> >> >> + vmcr &= ~ICH_VMCR_BPR0_MASK;
> >> >> + vmcr |= val;
> >> >> +
> >> >> + if (vmcr & ICH_VMCR_CBPR_MASK) {
> >> >> + val = __vgic_v3_get_bpr1(vmcr);
> >> >> + val <<= ICH_VMCR_BPR1_SHIFT;
> >> >> + val &= ICH_VMCR_BPR1_MASK;
> >> >> + vmcr &= ~ICH_VMCR_BPR1_MASK;
> >> >> + vmcr |= val;
> >> >> + }
> >> >
> >> > I don't understand why this block is needed?
> >>
> >> If you have CBPR already set, and then update BPR0, you need to make
> >> sure that BPR1 gets updated as well. You could hope that the HW would do
> >> it for you, but since we're erratum workaround land...
> >>
> >
> > I just didn't read the spec that way, I gathered that the hardware would
> > maintain read-as-written for for bpr1 but use bpr0 to set the binary
> > point when cbpr is set, and just ignore writes to bpr1 for as long as
> > cbpr is set.
>
> This depends whether you're talking about the ICC/ICV BPR0/BPR1 registers,
> or the fields in the ICH_VMCR*. For the former, if CBPR is set then
> BPR1 reads and writes affect BPR0.
>From the spec on ICV_BPR1_EL1: "Non-secure EL1 writes are ignored".
Doesn't that mean that reads of BPR1 reflect BPR0 but writes are
ignored?
> For the latter, the two fields
> are both independent and read-as-written regardless of the value
> of CBPR, it's just that the value in the BPR1 field has no effect.
> (The reason for this is for VM state migration: if a guest does:
> - write X to BPR0
> - write Y to BPR1
> - set CBPR
> - write Z to BPR0
> - unset CBPR
> - read BPR1
> it should get back Y still; so EL2 needs to have a way to see
> both the underlying BPR0 and BPR1 values even if CPBR is in effect.)
>
> So the code above is not correct, I think, because it's making
> writes to BPR0 affect the BPR1 value. Instead what should happen
> is that when we emulate reads and writes to ICC_BPR1 we should pay
> attention to CBPR and work with either the VMCR BPR0 or BPR1 field
> appropriately.
I agree that we should drop the block above, but also think we should do
what we do in patch #5 and ignore writes to BPR1 if CBPR is set.
Thanks,
-Christoffer
WARNING: multiple messages have this Message-ID (diff)
From: cdall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v2 13/25] KVM: arm64: vgic-v3: Add ICV_BPR0_EL1 handler
Date: Tue, 6 Jun 2017 19:23:48 +0200 [thread overview]
Message-ID: <20170606172348.GJ9464@cbox> (raw)
In-Reply-To: <CAFEAcA9ZHZTJodXstB2YJRnM8QjZtehUwGwAnKKKceMfpB7=gQ@mail.gmail.com>
On Tue, Jun 06, 2017 at 04:56:27PM +0100, Peter Maydell wrote:
> On 6 June 2017 at 16:46, Christoffer Dall <cdall@linaro.org> wrote:
> > On Tue, Jun 06, 2017 at 04:15:05PM +0100, Marc Zyngier wrote:
> >> >> +static void __hyp_text __vgic_v3_write_bpr0(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
> >> >> +{
> >> >> + u64 val = vcpu_get_reg(vcpu, rt);
> >> >> + u8 bpr_min = 7 - vtr_to_nr_pre_bits(read_gicreg(ICH_VTR_EL2));
> >> >> +
> >> >> + /* Enforce BPR limiting */
> >> >> + if (val < bpr_min)
> >> >> + val = bpr_min;
> >> >> +
> >> >> + val <<= ICH_VMCR_BPR0_SHIFT;
> >> >> + val &= ICH_VMCR_BPR0_MASK;
> >> >> + vmcr &= ~ICH_VMCR_BPR0_MASK;
> >> >> + vmcr |= val;
> >> >> +
> >> >> + if (vmcr & ICH_VMCR_CBPR_MASK) {
> >> >> + val = __vgic_v3_get_bpr1(vmcr);
> >> >> + val <<= ICH_VMCR_BPR1_SHIFT;
> >> >> + val &= ICH_VMCR_BPR1_MASK;
> >> >> + vmcr &= ~ICH_VMCR_BPR1_MASK;
> >> >> + vmcr |= val;
> >> >> + }
> >> >
> >> > I don't understand why this block is needed?
> >>
> >> If you have CBPR already set, and then update BPR0, you need to make
> >> sure that BPR1 gets updated as well. You could hope that the HW would do
> >> it for you, but since we're erratum workaround land...
> >>
> >
> > I just didn't read the spec that way, I gathered that the hardware would
> > maintain read-as-written for for bpr1 but use bpr0 to set the binary
> > point when cbpr is set, and just ignore writes to bpr1 for as long as
> > cbpr is set.
>
> This depends whether you're talking about the ICC/ICV BPR0/BPR1 registers,
> or the fields in the ICH_VMCR*. For the former, if CBPR is set then
> BPR1 reads and writes affect BPR0.
>From the spec on ICV_BPR1_EL1: "Non-secure EL1 writes are ignored".
Doesn't that mean that reads of BPR1 reflect BPR0 but writes are
ignored?
> For the latter, the two fields
> are both independent and read-as-written regardless of the value
> of CBPR, it's just that the value in the BPR1 field has no effect.
> (The reason for this is for VM state migration: if a guest does:
> - write X to BPR0
> - write Y to BPR1
> - set CBPR
> - write Z to BPR0
> - unset CBPR
> - read BPR1
> it should get back Y still; so EL2 needs to have a way to see
> both the underlying BPR0 and BPR1 values even if CPBR is in effect.)
>
> So the code above is not correct, I think, because it's making
> writes to BPR0 affect the BPR1 value. Instead what should happen
> is that when we emulate reads and writes to ICC_BPR1 we should pay
> attention to CBPR and work with either the VMCR BPR0 or BPR1 field
> appropriately.
I agree that we should drop the block above, but also think we should do
what we do in patch #5 and ignore writes to BPR1 if CBPR is set.
Thanks,
-Christoffer
next prev parent reply other threads:[~2017-06-06 17:23 UTC|newest]
Thread overview: 152+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-01 10:20 [PATCH v2 00/25] arm64: KVM: Mediate access to GICv3 sysregs at EL2 Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-01 10:20 ` [PATCH v2 01/25] arm64: Add a facility to turn an ESR syndrome into a sysreg encoding Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-01 10:20 ` [PATCH v2 02/25] KVM: arm/arm64: vgic-v3: Add accessors for the ICH_APxRn_EL2 registers Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-01 10:20 ` [PATCH v2 03/25] KVM: arm64: Make kvm_condition_valid32() accessible from EL2 Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-04 12:11 ` Christoffer Dall
2017-06-04 12:11 ` Christoffer Dall
2017-06-05 8:13 ` Marc Zyngier
2017-06-05 8:13 ` Marc Zyngier
2017-06-05 8:23 ` Christoffer Dall
2017-06-05 8:23 ` Christoffer Dall
2017-06-05 9:10 ` Marc Zyngier
2017-06-05 9:10 ` Marc Zyngier
2017-06-01 10:20 ` [PATCH v2 04/25] KVM: arm64: vgic-v3: Add hook to handle guest GICv3 sysreg accesses at EL2 Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-04 14:59 ` Christoffer Dall
2017-06-04 14:59 ` Christoffer Dall
2017-06-01 10:20 ` [PATCH v2 05/25] KVM: arm64: vgic-v3: Add ICV_BPR1_EL1 handler Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-04 20:25 ` Christoffer Dall
2017-06-04 20:25 ` Christoffer Dall
2017-06-05 9:58 ` Marc Zyngier
2017-06-05 9:58 ` Marc Zyngier
2017-06-05 10:16 ` Christoffer Dall
2017-06-05 10:16 ` Christoffer Dall
2017-06-05 10:27 ` Peter Maydell
2017-06-05 10:27 ` Peter Maydell
2017-06-06 9:41 ` Christoffer Dall
2017-06-06 9:41 ` Christoffer Dall
2017-06-01 10:20 ` [PATCH v2 06/25] KVM: arm64: vgic-v3: Add ICV_IGRPEN1_EL1 handler Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-06 13:22 ` Christoffer Dall
2017-06-06 13:22 ` Christoffer Dall
2017-06-01 10:20 ` [PATCH v2 07/25] KVM: arm64: vgic-v3: Add ICV_IAR1_EL1 handler Marc Zyngier
2017-06-01 10:20 ` Marc Zyngier
2017-06-05 9:21 ` Christoffer Dall
2017-06-05 9:21 ` Christoffer Dall
2017-06-05 10:33 ` Marc Zyngier
2017-06-05 10:33 ` Marc Zyngier
2017-06-06 11:09 ` Christoffer Dall
2017-06-06 11:09 ` Christoffer Dall
2017-06-06 13:35 ` Marc Zyngier
2017-06-06 13:35 ` Marc Zyngier
2017-06-06 13:50 ` Christoffer Dall
2017-06-06 13:50 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 08/25] KVM: arm64: vgic-v3: Add ICV_EOIR1_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-05 10:32 ` Christoffer Dall
2017-06-05 10:32 ` Christoffer Dall
2017-06-05 11:00 ` Marc Zyngier
2017-06-05 11:00 ` Marc Zyngier
2017-06-06 13:19 ` Christoffer Dall
2017-06-06 13:19 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 09/25] KVM: arm64: vgic-v3: Add ICV_AP1Rn_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:22 ` Christoffer Dall
2017-06-06 13:22 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 10/25] KVM: arm64: vgic-v3: Add ICV_HPPIR1_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 11:51 ` Christoffer Dall
2017-06-06 11:51 ` Christoffer Dall
2017-06-06 13:57 ` Marc Zyngier
2017-06-06 13:57 ` Marc Zyngier
2017-06-06 14:41 ` Christoffer Dall
2017-06-06 14:41 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 11/25] KVM: arm64: vgic-v3: Enable trapping of Group-1 system registers Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:22 ` Christoffer Dall
2017-06-06 13:22 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 12/25] KVM: arm64: Enable GICv3 Group-1 sysreg trapping via command-line Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 12:06 ` Christoffer Dall
2017-06-06 12:06 ` Christoffer Dall
2017-06-06 13:59 ` Marc Zyngier
2017-06-06 13:59 ` Marc Zyngier
2017-06-06 14:42 ` Christoffer Dall
2017-06-06 14:42 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 13/25] KVM: arm64: vgic-v3: Add ICV_BPR0_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 12:11 ` Christoffer Dall
2017-06-06 12:11 ` Christoffer Dall
2017-06-06 15:15 ` Marc Zyngier
2017-06-06 15:15 ` Marc Zyngier
2017-06-06 15:46 ` Christoffer Dall
2017-06-06 15:46 ` Christoffer Dall
2017-06-06 15:56 ` Peter Maydell
2017-06-06 15:56 ` Peter Maydell
2017-06-06 16:56 ` Marc Zyngier
2017-06-06 16:56 ` Marc Zyngier
2017-06-06 17:23 ` Christoffer Dall [this message]
2017-06-06 17:23 ` Christoffer Dall
2017-06-06 17:36 ` Peter Maydell
2017-06-06 17:36 ` Peter Maydell
2017-06-01 10:21 ` [PATCH v2 14/25] KVM: arm64: vgic-v3: Add ICV_IGNREN0_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:22 ` Christoffer Dall
2017-06-06 13:22 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 15/25] KVM: arm64: vgic-v3: Add misc Group-0 handlers Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:22 ` Christoffer Dall
2017-06-06 13:22 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 16/25] KVM: arm64: vgic-v3: Enable trapping of Group-0 system registers Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:22 ` Christoffer Dall
2017-06-06 13:22 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 17/25] KVM: arm64: Enable GICv3 Group-0 sysreg trapping via command-line Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 12:44 ` Christoffer Dall
2017-06-06 12:44 ` Christoffer Dall
2017-06-06 15:15 ` Marc Zyngier
2017-06-06 15:15 ` Marc Zyngier
2017-06-01 10:21 ` [PATCH v2 18/25] arm64: Add MIDR values for Cavium cn83XX SoCs Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-01 10:21 ` [PATCH v2 19/25] arm64: Add workaround for Cavium Thunder erratum 30115 Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 12:48 ` Christoffer Dall
2017-06-06 12:48 ` Christoffer Dall
2017-06-06 15:18 ` Marc Zyngier
2017-06-06 15:18 ` Marc Zyngier
2017-06-01 10:21 ` [PATCH v2 20/25] KVM: arm64: vgic-v3: Add ICV_DIR_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 12:59 ` Christoffer Dall
2017-06-06 12:59 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 21/25] KVM: arm64: vgic-v3: Add ICV_RPR_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:23 ` Christoffer Dall
2017-06-06 13:23 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 22/25] KVM: arm64: vgic-v3: Add ICV_CTLR_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:23 ` Christoffer Dall
2017-06-06 13:23 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 23/25] KVM: arm64: vgic-v3: Add ICV_PMR_EL1 handler Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:23 ` Christoffer Dall
2017-06-06 13:23 ` Christoffer Dall
2017-06-01 10:21 ` [PATCH v2 24/25] KVM: arm64: Enable GICv3 common sysreg trapping via command-line Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-01 10:21 ` [PATCH v2 25/25] KVM: arm64: vgic-v3: Log which GICv3 system registers are trapped Marc Zyngier
2017-06-01 10:21 ` Marc Zyngier
2017-06-06 13:23 ` Christoffer Dall
2017-06-06 13:23 ` Christoffer Dall
2017-06-01 21:00 ` [PATCH v2 00/25] arm64: KVM: Mediate access to GICv3 sysregs at EL2 David Daney
2017-06-01 21:00 ` David Daney
2017-06-02 9:11 ` Marc Zyngier
2017-06-02 9:11 ` Marc Zyngier
2017-06-02 16:24 ` David Daney
2017-06-02 16:24 ` David Daney
2017-06-08 14:35 ` Alexander Graf
2017-06-08 14:35 ` Alexander Graf
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=20170606172348.GJ9464@cbox \
--to=cdall@linaro.org \
--cc=catalin.marinas@arm.com \
--cc=david.daney@cavium.com \
--cc=kvm@vger.kernel.org \
--cc=kvmarm@lists.cs.columbia.edu \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=marc.zyngier@arm.com \
--cc=peter.maydell@linaro.org \
--cc=rrichter@cavium.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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.