From: christoffer.dall@linaro.org (Christoffer Dall)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v3 10/19] arm/arm64: KVM: make the value of ICC_SRE_EL1 a per-VM variable
Date: Mon, 3 Nov 2014 21:04:55 +0100 [thread overview]
Message-ID: <20141103200455.GI16132@cbox> (raw)
In-Reply-To: <1414776414-13426-11-git-send-email-andre.przywara@arm.com>
On Fri, Oct 31, 2014 at 05:26:45PM +0000, Andre Przywara wrote:
> ICC_SRE_EL1 is a system register allowing msr/mrs accesses to the
> GIC CPU interface for EL1 (guests). Currently we force it to 0, but
> for proper GICv3 support we have to allow guests to use it (depending
> on their selected virtual GIC model).
> So add ICC_SRE_EL1 to the list of saved/restored registers on a
> world switch, but actually disallow a guest to change it by only
> restoring a fixed, once-initialized value.
> This value depends on the GIC model userland has chosen for a guest.
>
> Signed-off-by: Andre Przywara <andre.przywara@arm.com>
> Reviewed-by: Christoffer Dall <christoffer.dall@linaro.org>
> ---
> arch/arm64/kernel/asm-offsets.c | 1 +
> arch/arm64/kvm/vgic-v3-switch.S | 14 +++++++++-----
> include/kvm/arm_vgic.h | 1 +
> virt/kvm/arm/vgic-v3.c | 9 +++++++--
> 4 files changed, 18 insertions(+), 7 deletions(-)
>
> diff --git a/arch/arm64/kernel/asm-offsets.c b/arch/arm64/kernel/asm-offsets.c
> index 9a9fce0..9d34486 100644
> --- a/arch/arm64/kernel/asm-offsets.c
> +++ b/arch/arm64/kernel/asm-offsets.c
> @@ -140,6 +140,7 @@ int main(void)
> DEFINE(VGIC_V2_CPU_ELRSR, offsetof(struct vgic_cpu, vgic_v2.vgic_elrsr));
> DEFINE(VGIC_V2_CPU_APR, offsetof(struct vgic_cpu, vgic_v2.vgic_apr));
> DEFINE(VGIC_V2_CPU_LR, offsetof(struct vgic_cpu, vgic_v2.vgic_lr));
> + DEFINE(VGIC_V3_CPU_SRE, offsetof(struct vgic_cpu, vgic_v3.vgic_sre));
> DEFINE(VGIC_V3_CPU_HCR, offsetof(struct vgic_cpu, vgic_v3.vgic_hcr));
> DEFINE(VGIC_V3_CPU_VMCR, offsetof(struct vgic_cpu, vgic_v3.vgic_vmcr));
> DEFINE(VGIC_V3_CPU_MISR, offsetof(struct vgic_cpu, vgic_v3.vgic_misr));
> diff --git a/arch/arm64/kvm/vgic-v3-switch.S b/arch/arm64/kvm/vgic-v3-switch.S
> index d160469..617a012 100644
> --- a/arch/arm64/kvm/vgic-v3-switch.S
> +++ b/arch/arm64/kvm/vgic-v3-switch.S
> @@ -148,17 +148,18 @@
> * x0: Register pointing to VCPU struct
> */
> .macro restore_vgic_v3_state
> - // Disable SRE_EL1 access. Necessary, otherwise
> - // ICH_VMCR_EL2.VFIQEn becomes one, and FIQ happens...
> - msr_s ICC_SRE_EL1, xzr
> - isb
> -
I know I reviewed this once, but now I'm forgetting how it works with
this comment above. First, I don't fully understand the comment.
Second, now we're restoring a value that may potentially have SRE_EL1
access enabled, but FIQ doesn't happen. Can you clarify this for me?
Thanks,
-Christoffer
> // Compute the address of struct vgic_cpu
> add x3, x0, #VCPU_VGIC_CPU
>
> // Restore all interesting registers
> ldr w4, [x3, #VGIC_V3_CPU_HCR]
> ldr w5, [x3, #VGIC_V3_CPU_VMCR]
> + ldr w25, [x3, #VGIC_V3_CPU_SRE]
> +
> + msr_s ICC_SRE_EL1, x25
> +
> + // make sure SRE is valid before writing the other registers
> + isb
>
> msr_s ICH_HCR_EL2, x4
> msr_s ICH_VMCR_EL2, x5
> @@ -244,9 +245,12 @@
> dsb sy
>
> // Prevent the guest from touching the GIC system registers
> + // if SRE isn't enabled for GICv3 emulation
> + cbnz x25, 1f
> mrs_s x5, ICC_SRE_EL2
> and x5, x5, #~ICC_SRE_EL2_ENABLE
> msr_s ICC_SRE_EL2, x5
> +1:
> .endm
>
> ENTRY(__save_vgic_v3_state)
> diff --git a/include/kvm/arm_vgic.h b/include/kvm/arm_vgic.h
> index a6d41f1..8827bc7 100644
> --- a/include/kvm/arm_vgic.h
> +++ b/include/kvm/arm_vgic.h
> @@ -243,6 +243,7 @@ struct vgic_v3_cpu_if {
> #ifdef CONFIG_ARM_GIC_V3
> u32 vgic_hcr;
> u32 vgic_vmcr;
> + u32 vgic_sre; /* Restored only, change ignored */
> u32 vgic_misr; /* Saved only */
> u32 vgic_eisr; /* Saved only */
> u32 vgic_elrsr; /* Saved only */
> diff --git a/virt/kvm/arm/vgic-v3.c b/virt/kvm/arm/vgic-v3.c
> index fc4d628..ce50918 100644
> --- a/virt/kvm/arm/vgic-v3.c
> +++ b/virt/kvm/arm/vgic-v3.c
> @@ -145,15 +145,20 @@ static void vgic_v3_set_vmcr(struct kvm_vcpu *vcpu, struct vgic_vmcr *vmcrp)
>
> static void vgic_v3_enable(struct kvm_vcpu *vcpu)
> {
> + struct vgic_v3_cpu_if *vgic_v3;
> +
> + vgic_v3 = &vcpu->arch.vgic_cpu.vgic_v3;
> /*
> * By forcing VMCR to zero, the GIC will restore the binary
> * points to their reset values. Anything else resets to zero
> * anyway.
> */
> - vcpu->arch.vgic_cpu.vgic_v3.vgic_vmcr = 0;
> + vgic_v3->vgic_vmcr = 0;
> +
> + vgic_v3->vgic_sre = 0;
>
> /* Get the show on the road... */
> - vcpu->arch.vgic_cpu.vgic_v3.vgic_hcr = ICH_HCR_EN;
> + vgic_v3->vgic_hcr = ICH_HCR_EN;
> }
>
> static const struct vgic_ops vgic_v3_ops = {
> --
> 1.7.9.5
>
next prev parent reply other threads:[~2014-11-03 20:04 UTC|newest]
Thread overview: 76+ messages / expand[flat|nested] mbox.gz Atom feed top
2014-10-31 17:26 [PATCH v3 00/19] KVM GICv3 emulation Andre Przywara
2014-10-31 17:26 ` [PATCH v3 01/19] arm/arm64: KVM: rework MPIDR assignment and add accessors Andre Przywara
2014-11-03 13:13 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 02/19] arm/arm64: KVM: pass down user space provided GIC type into vGIC code Andre Przywara
2014-11-03 13:14 ` Christoffer Dall
2014-11-03 13:25 ` Andre Przywara
2014-11-03 16:51 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 03/19] arm/arm64: KVM: refactor vgic_handle_mmio() function Andre Przywara
2014-11-03 13:23 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 04/19] arm/arm64: KVM: wrap 64 bit MMIO accesses with two 32 bit ones Andre Przywara
2014-11-03 13:25 ` Christoffer Dall
2014-11-04 12:18 ` Andre Przywara
2014-11-04 13:24 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 05/19] arm/arm64: KVM: introduce per-VM ops Andre Przywara
2014-11-03 13:59 ` Christoffer Dall
2014-11-04 15:58 ` Andre Przywara
2014-11-04 19:03 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 06/19] arm/arm64: KVM: move [sg]et_lr into " Andre Przywara
2014-11-03 14:15 ` Christoffer Dall
2014-11-04 16:30 ` Andre Przywara
2014-11-04 19:12 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 07/19] arm/arm64: KVM: move kvm_register_device_ops() into vGIC probing Andre Przywara
2014-11-03 20:05 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 08/19] arm/arm64: KVM: dont rely on a valid GICH base address Andre Przywara
2014-11-03 20:05 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 09/19] arm/arm64: KVM: make the maximum number of vCPUs a per-VM value Andre Przywara
2014-11-03 20:06 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 10/19] arm/arm64: KVM: make the value of ICC_SRE_EL1 a per-VM variable Andre Przywara
2014-11-03 20:04 ` Christoffer Dall [this message]
2014-11-03 20:17 ` Marc Zyngier
2014-11-07 19:18 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 11/19] arm/arm64: KVM: refactor MMIO accessors Andre Przywara
2014-11-04 11:55 ` Christoffer Dall
2014-11-04 12:25 ` Andre Przywara
2014-10-31 17:26 ` [PATCH v3 12/19] arm/arm64: KVM: refactor/wrap vgic_set/get_attr() Andre Przywara
2014-11-04 19:30 ` Christoffer Dall
2014-11-05 10:27 ` Andre Przywara
2014-11-05 10:37 ` Andre Przywara
2014-11-05 12:57 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 13/19] arm/arm64: KVM: add vgic.h header file Andre Przywara
2014-11-04 19:30 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 14/19] arm/arm64: KVM: split GICv2 specific emulation code from vgic.c Andre Przywara
2014-11-04 19:30 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 15/19] arm/arm64: KVM: add opaque private pointer to MMIO accessors Andre Przywara
2014-11-04 15:44 ` Christoffer Dall
2014-11-04 17:24 ` Andre Przywara
2014-11-04 18:05 ` Marc Zyngier
2014-11-04 19:18 ` Christoffer Dall
2014-11-04 20:17 ` Marc Zyngier
2014-11-05 9:49 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 16/19] arm/arm64: KVM: add virtual GICv3 distributor emulation Andre Przywara
2014-11-07 14:30 ` Christoffer Dall
2014-11-10 17:30 ` [PATCH v3 16/19] arm/arm64: KVM: add virtual GICv3 distributor emulation / PART 1 Andre Przywara
2014-11-11 13:48 ` Christoffer Dall
2014-11-12 12:39 ` [PATCH v3 16/19] arm/arm64: KVM: add virtual GICv3 distributor emulation / PART 2 Andre Przywara
2014-11-12 19:51 ` Christoffer Dall
2014-11-13 11:18 ` Christoffer Dall
2014-11-13 11:45 ` Marc Zyngier
2014-11-13 12:01 ` Andre Przywara
2014-10-31 17:26 ` [PATCH v3 17/19] arm64: KVM: add SGI system register trapping Andre Przywara
2014-11-07 15:07 ` Christoffer Dall
2014-11-10 11:31 ` Andre Przywara
2014-11-10 12:45 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 18/19] arm/arm64: KVM: enable kernel side of GICv3 emulation Andre Przywara
2014-11-07 16:07 ` Christoffer Dall
2014-11-10 12:19 ` Andre Przywara
2014-11-10 13:24 ` Christoffer Dall
2014-10-31 17:26 ` [PATCH v3 19/19] arm/arm64: KVM: allow userland to request a virtual GICv3 Andre Przywara
2014-11-07 16:15 ` Christoffer Dall
2014-11-10 12:26 ` Andre Przywara
2014-11-10 13:25 ` Christoffer Dall
2014-11-03 12:59 ` [PATCH v3 00/19] KVM GICv3 emulation Christoffer Dall
2014-11-06 10:57 ` Christoffer Dall
2014-11-06 11:21 ` Christoffer Dall
2014-11-06 15:13 ` Andre Przywara
2014-11-06 18:09 ` Christoffer Dall
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=20141103200455.GI16132@cbox \
--to=christoffer.dall@linaro.org \
--cc=linux-arm-kernel@lists.infradead.org \
/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;
as well as URLs for NNTP newsgroup(s).