All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS
@ 2024-10-22 14:40 Will Deacon
  2024-10-22 14:40 ` [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1 Will Deacon
                   ` (2 more replies)
  0 siblings, 3 replies; 8+ messages in thread
From: Will Deacon @ 2024-10-22 14:40 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Will Deacon, Marc Zyngier, Oliver Upton, Joey Gouly, Fuad Tabba,
	kvmarm

Hi folks,

While looking at reducing the host memory mapped into pKVM at EL2, I
noticed that the GICv3 CPU interface emulation for hardware with broken
SEIS implementations can be simplified and the corresponding mapping of
'kvm_vgic_global_state' can be dropped.

Please have a look!

Cheers,

Will

Cc: Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Cc: Joey Gouly <joey.gouly@arm.com>
Cc: Fuad Tabba <tabba@google.com>
Cc: kvmarm@lists.linux.dev

--->8

Will Deacon (2):
  KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1
  KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM

 arch/arm64/kvm/hyp/nvhe/setup.c | 17 -----------------
 arch/arm64/kvm/hyp/vgic-v3-sr.c |  3 ---
 2 files changed, 20 deletions(-)

-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply	[flat|nested] 8+ messages in thread

* [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1
  2024-10-22 14:40 [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Will Deacon
@ 2024-10-22 14:40 ` Will Deacon
  2024-10-22 16:27   ` Marc Zyngier
  2024-10-22 14:40 ` [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM Will Deacon
  2024-10-25 22:16 ` [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Oliver Upton
  2 siblings, 1 reply; 8+ messages in thread
From: Will Deacon @ 2024-10-22 14:40 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Will Deacon, Marc Zyngier, Oliver Upton, Joey Gouly, Fuad Tabba,
	kvmarm

ICC_CTLR_EL1 accesses from a guest are trapped and emulated on systems
with broken SEIS support and without FEAT_GICv3_TDIR. On such systems,
we mask SEIS support in 'kvm_vgic_global_state.ich_vtr_el2' and so the
value of ICC_CTLR_EL1.SEIS visible to the guest is always zero.

Simplify the ICC_CTLR_EL1 read emulation to return 0 for the SEIS field,
rather than reading an always-zero value from the global state.

Cc: Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/kvm/hyp/vgic-v3-sr.c | 3 ---
 1 file changed, 3 deletions(-)

diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c
index 18d4677002b1..3f9741e51d41 100644
--- a/arch/arm64/kvm/hyp/vgic-v3-sr.c
+++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c
@@ -1012,9 +1012,6 @@ static void __vgic_v3_read_ctlr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
 	val = ((vtr >> 29) & 7) << ICC_CTLR_EL1_PRI_BITS_SHIFT;
 	/* IDbits */
 	val |= ((vtr >> 23) & 7) << ICC_CTLR_EL1_ID_BITS_SHIFT;
-	/* SEIS */
-	if (kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK)
-		val |= BIT(ICC_CTLR_EL1_SEIS_SHIFT);
 	/* A3V */
 	val |= ((vtr >> 21) & 1) << ICC_CTLR_EL1_A3V_SHIFT;
 	/* EOImode */
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM
  2024-10-22 14:40 [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Will Deacon
  2024-10-22 14:40 ` [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1 Will Deacon
@ 2024-10-22 14:40 ` Will Deacon
  2024-10-22 17:01   ` Marc Zyngier
  2024-10-25 22:16 ` [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Oliver Upton
  2 siblings, 1 reply; 8+ messages in thread
From: Will Deacon @ 2024-10-22 14:40 UTC (permalink / raw)
  To: linux-arm-kernel
  Cc: Will Deacon, Marc Zyngier, Oliver Upton, Joey Gouly, Fuad Tabba,
	kvmarm

Now that 'kvm_vgic_global_state' is no longer needed for ICC_CTLR_EL1
emulation on machines with a broken SEIS implementation, drop the
pKVM hypervisor mapping of the page.

Cc: Marc Zyngier <maz@kernel.org>
Cc: Oliver Upton <oliver.upton@linux.dev>
Signed-off-by: Will Deacon <will@kernel.org>
---
 arch/arm64/kvm/hyp/nvhe/setup.c | 17 -----------------
 1 file changed, 17 deletions(-)

diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
index 174007f3fadd..8fec099c2775 100644
--- a/arch/arm64/kvm/hyp/nvhe/setup.c
+++ b/arch/arm64/kvm/hyp/nvhe/setup.c
@@ -95,7 +95,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
 {
 	void *start, *end, *virt = hyp_phys_to_virt(phys);
 	unsigned long pgt_size = hyp_s1_pgtable_pages() << PAGE_SHIFT;
-	enum kvm_pgtable_prot prot;
 	int ret, i;
 
 	/* Recreate the hyp page-table using the early page allocator */
@@ -148,22 +147,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
 	}
 
 	pkvm_create_host_sve_mappings();
-
-	/*
-	 * Map the host sections RO in the hypervisor, but transfer the
-	 * ownership from the host to the hypervisor itself to make sure they
-	 * can't be donated or shared with another entity.
-	 *
-	 * The ownership transition requires matching changes in the host
-	 * stage-2. This will be done later (see finalize_host_mappings()) once
-	 * the hyp_vmemmap is addressable.
-	 */
-	prot = pkvm_mkstate(PAGE_HYP_RO, PKVM_PAGE_SHARED_OWNED);
-	ret = pkvm_create_mappings(&kvm_vgic_global_state,
-				   &kvm_vgic_global_state + 1, prot);
-	if (ret)
-		return ret;
-
 	return 0;
 }
 
-- 
2.47.0.105.g07ac214952-goog


^ permalink raw reply related	[flat|nested] 8+ messages in thread

* Re: [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1
  2024-10-22 14:40 ` [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1 Will Deacon
@ 2024-10-22 16:27   ` Marc Zyngier
  0 siblings, 0 replies; 8+ messages in thread
From: Marc Zyngier @ 2024-10-22 16:27 UTC (permalink / raw)
  To: Will Deacon
  Cc: linux-arm-kernel, Oliver Upton, Joey Gouly, Fuad Tabba, kvmarm

On Tue, 22 Oct 2024 15:40:15 +0100,
Will Deacon <will@kernel.org> wrote:
> 
> ICC_CTLR_EL1 accesses from a guest are trapped and emulated on systems
> with broken SEIS support and without FEAT_GICv3_TDIR. On such systems,
> we mask SEIS support in 'kvm_vgic_global_state.ich_vtr_el2' and so the
> value of ICC_CTLR_EL1.SEIS visible to the guest is always zero.
>
> Simplify the ICC_CTLR_EL1 read emulation to return 0 for the SEIS field,
> rather than reading an always-zero value from the global state.
> 
> Cc: Marc Zyngier <maz@kernel.org>
> Cc: Oliver Upton <oliver.upton@linux.dev>
> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/kvm/hyp/vgic-v3-sr.c | 3 ---
>  1 file changed, 3 deletions(-)
> 
> diff --git a/arch/arm64/kvm/hyp/vgic-v3-sr.c b/arch/arm64/kvm/hyp/vgic-v3-sr.c
> index 18d4677002b1..3f9741e51d41 100644
> --- a/arch/arm64/kvm/hyp/vgic-v3-sr.c
> +++ b/arch/arm64/kvm/hyp/vgic-v3-sr.c
> @@ -1012,9 +1012,6 @@ static void __vgic_v3_read_ctlr(struct kvm_vcpu *vcpu, u32 vmcr, int rt)
>  	val = ((vtr >> 29) & 7) << ICC_CTLR_EL1_PRI_BITS_SHIFT;
>  	/* IDbits */
>  	val |= ((vtr >> 23) & 7) << ICC_CTLR_EL1_ID_BITS_SHIFT;
> -	/* SEIS */
> -	if (kvm_vgic_global_state.ich_vtr_el2 & ICH_VTR_SEIS_MASK)
> -		val |= BIT(ICC_CTLR_EL1_SEIS_SHIFT);
>  	/* A3V */
>  	val |= ((vtr >> 21) & 1) << ICC_CTLR_EL1_A3V_SHIFT;
>  	/* EOImode */

Reviewed-by: Marc Zyngier <maz@kernel.org>

	M.

-- 
Without deviation from the norm, progress is not possible.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM
  2024-10-22 14:40 ` [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM Will Deacon
@ 2024-10-22 17:01   ` Marc Zyngier
  2024-10-23 16:39     ` Will Deacon
  0 siblings, 1 reply; 8+ messages in thread
From: Marc Zyngier @ 2024-10-22 17:01 UTC (permalink / raw)
  To: Will Deacon
  Cc: linux-arm-kernel, Oliver Upton, Joey Gouly, Fuad Tabba, kvmarm

On Tue, 22 Oct 2024 15:40:16 +0100,
Will Deacon <will@kernel.org> wrote:
> 
> Now that 'kvm_vgic_global_state' is no longer needed for ICC_CTLR_EL1
> emulation on machines with a broken SEIS implementation, drop the
> pKVM hypervisor mapping of the page.
> 
> Cc: Marc Zyngier <maz@kernel.org>
> Cc: Oliver Upton <oliver.upton@linux.dev>
> Signed-off-by: Will Deacon <will@kernel.org>
> ---
>  arch/arm64/kvm/hyp/nvhe/setup.c | 17 -----------------
>  1 file changed, 17 deletions(-)
> 
> diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
> index 174007f3fadd..8fec099c2775 100644
> --- a/arch/arm64/kvm/hyp/nvhe/setup.c
> +++ b/arch/arm64/kvm/hyp/nvhe/setup.c
> @@ -95,7 +95,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
>  {
>  	void *start, *end, *virt = hyp_phys_to_virt(phys);
>  	unsigned long pgt_size = hyp_s1_pgtable_pages() << PAGE_SHIFT;
> -	enum kvm_pgtable_prot prot;
>  	int ret, i;
>  
>  	/* Recreate the hyp page-table using the early page allocator */
> @@ -148,22 +147,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
>  	}
>  
>  	pkvm_create_host_sve_mappings();
> -
> -	/*
> -	 * Map the host sections RO in the hypervisor, but transfer the
> -	 * ownership from the host to the hypervisor itself to make sure they
> -	 * can't be donated or shared with another entity.
> -	 *
> -	 * The ownership transition requires matching changes in the host
> -	 * stage-2. This will be done later (see finalize_host_mappings()) once
> -	 * the hyp_vmemmap is addressable.
> -	 */
> -	prot = pkvm_mkstate(PAGE_HYP_RO, PKVM_PAGE_SHARED_OWNED);
> -	ret = pkvm_create_mappings(&kvm_vgic_global_state,
> -				   &kvm_vgic_global_state + 1, prot);
> -	if (ret)
> -		return ret;
> -
>  	return 0;
>  }

Maybe add a note indicating that nVHE/hVHE still have that particular
mapping via the rodata section?

Reviewed-by: Marc Zyngier <maz@kernel.org>

	M.

-- 
Without deviation from the norm, progress is not possible.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM
  2024-10-22 17:01   ` Marc Zyngier
@ 2024-10-23 16:39     ` Will Deacon
  2024-10-23 16:53       ` Marc Zyngier
  0 siblings, 1 reply; 8+ messages in thread
From: Will Deacon @ 2024-10-23 16:39 UTC (permalink / raw)
  To: Marc Zyngier
  Cc: linux-arm-kernel, Oliver Upton, Joey Gouly, Fuad Tabba, kvmarm

On Tue, Oct 22, 2024 at 06:01:17PM +0100, Marc Zyngier wrote:
> On Tue, 22 Oct 2024 15:40:16 +0100,
> Will Deacon <will@kernel.org> wrote:
> > 
> > Now that 'kvm_vgic_global_state' is no longer needed for ICC_CTLR_EL1
> > emulation on machines with a broken SEIS implementation, drop the
> > pKVM hypervisor mapping of the page.
> > 
> > Cc: Marc Zyngier <maz@kernel.org>
> > Cc: Oliver Upton <oliver.upton@linux.dev>
> > Signed-off-by: Will Deacon <will@kernel.org>
> > ---
> >  arch/arm64/kvm/hyp/nvhe/setup.c | 17 -----------------
> >  1 file changed, 17 deletions(-)
> > 
> > diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
> > index 174007f3fadd..8fec099c2775 100644
> > --- a/arch/arm64/kvm/hyp/nvhe/setup.c
> > +++ b/arch/arm64/kvm/hyp/nvhe/setup.c
> > @@ -95,7 +95,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
> >  {
> >  	void *start, *end, *virt = hyp_phys_to_virt(phys);
> >  	unsigned long pgt_size = hyp_s1_pgtable_pages() << PAGE_SHIFT;
> > -	enum kvm_pgtable_prot prot;
> >  	int ret, i;
> >  
> >  	/* Recreate the hyp page-table using the early page allocator */
> > @@ -148,22 +147,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
> >  	}
> >  
> >  	pkvm_create_host_sve_mappings();
> > -
> > -	/*
> > -	 * Map the host sections RO in the hypervisor, but transfer the
> > -	 * ownership from the host to the hypervisor itself to make sure they
> > -	 * can't be donated or shared with another entity.
> > -	 *
> > -	 * The ownership transition requires matching changes in the host
> > -	 * stage-2. This will be done later (see finalize_host_mappings()) once
> > -	 * the hyp_vmemmap is addressable.
> > -	 */
> > -	prot = pkvm_mkstate(PAGE_HYP_RO, PKVM_PAGE_SHARED_OWNED);
> > -	ret = pkvm_create_mappings(&kvm_vgic_global_state,
> > -				   &kvm_vgic_global_state + 1, prot);
> > -	if (ret)
> > -		return ret;
> > -
> >  	return 0;
> >  }
> 
> Maybe add a note indicating that nVHE/hVHE still have that particular
> mapping via the rodata section?

I can add something to the commit message, is that what you had in mind?

> Reviewed-by: Marc Zyngier <maz@kernel.org>

Thanks!

Will

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM
  2024-10-23 16:39     ` Will Deacon
@ 2024-10-23 16:53       ` Marc Zyngier
  0 siblings, 0 replies; 8+ messages in thread
From: Marc Zyngier @ 2024-10-23 16:53 UTC (permalink / raw)
  To: Will Deacon
  Cc: linux-arm-kernel, Oliver Upton, Joey Gouly, Fuad Tabba, kvmarm

On Wed, 23 Oct 2024 17:39:08 +0100,
Will Deacon <will@kernel.org> wrote:
> 
> On Tue, Oct 22, 2024 at 06:01:17PM +0100, Marc Zyngier wrote:
> > On Tue, 22 Oct 2024 15:40:16 +0100,
> > Will Deacon <will@kernel.org> wrote:
> > > 
> > > Now that 'kvm_vgic_global_state' is no longer needed for ICC_CTLR_EL1
> > > emulation on machines with a broken SEIS implementation, drop the
> > > pKVM hypervisor mapping of the page.
> > > 
> > > Cc: Marc Zyngier <maz@kernel.org>
> > > Cc: Oliver Upton <oliver.upton@linux.dev>
> > > Signed-off-by: Will Deacon <will@kernel.org>
> > > ---
> > >  arch/arm64/kvm/hyp/nvhe/setup.c | 17 -----------------
> > >  1 file changed, 17 deletions(-)
> > > 
> > > diff --git a/arch/arm64/kvm/hyp/nvhe/setup.c b/arch/arm64/kvm/hyp/nvhe/setup.c
> > > index 174007f3fadd..8fec099c2775 100644
> > > --- a/arch/arm64/kvm/hyp/nvhe/setup.c
> > > +++ b/arch/arm64/kvm/hyp/nvhe/setup.c
> > > @@ -95,7 +95,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
> > >  {
> > >  	void *start, *end, *virt = hyp_phys_to_virt(phys);
> > >  	unsigned long pgt_size = hyp_s1_pgtable_pages() << PAGE_SHIFT;
> > > -	enum kvm_pgtable_prot prot;
> > >  	int ret, i;
> > >  
> > >  	/* Recreate the hyp page-table using the early page allocator */
> > > @@ -148,22 +147,6 @@ static int recreate_hyp_mappings(phys_addr_t phys, unsigned long size,
> > >  	}
> > >  
> > >  	pkvm_create_host_sve_mappings();
> > > -
> > > -	/*
> > > -	 * Map the host sections RO in the hypervisor, but transfer the
> > > -	 * ownership from the host to the hypervisor itself to make sure they
> > > -	 * can't be donated or shared with another entity.
> > > -	 *
> > > -	 * The ownership transition requires matching changes in the host
> > > -	 * stage-2. This will be done later (see finalize_host_mappings()) once
> > > -	 * the hyp_vmemmap is addressable.
> > > -	 */
> > > -	prot = pkvm_mkstate(PAGE_HYP_RO, PKVM_PAGE_SHARED_OWNED);
> > > -	ret = pkvm_create_mappings(&kvm_vgic_global_state,
> > > -				   &kvm_vgic_global_state + 1, prot);
> > > -	if (ret)
> > > -		return ret;
> > > -
> > >  	return 0;
> > >  }
> > 
> > Maybe add a note indicating that nVHE/hVHE still have that particular
> > mapping via the rodata section?
> 
> I can add something to the commit message, is that what you had in mind?

Yes. But maybe Oliver can add that when applying the series?

Thanks,

	M.

-- 
Without deviation from the norm, progress is not possible.

^ permalink raw reply	[flat|nested] 8+ messages in thread

* Re: [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS
  2024-10-22 14:40 [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Will Deacon
  2024-10-22 14:40 ` [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1 Will Deacon
  2024-10-22 14:40 ` [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM Will Deacon
@ 2024-10-25 22:16 ` Oliver Upton
  2 siblings, 0 replies; 8+ messages in thread
From: Oliver Upton @ 2024-10-25 22:16 UTC (permalink / raw)
  To: Will Deacon, linux-arm-kernel
  Cc: Oliver Upton, Marc Zyngier, Joey Gouly, Fuad Tabba, kvmarm

On Tue, 22 Oct 2024 15:40:14 +0100, Will Deacon wrote:
> While looking at reducing the host memory mapped into pKVM at EL2, I
> noticed that the GICv3 CPU interface emulation for hardware with broken
> SEIS implementations can be simplified and the corresponding mapping of
> 'kvm_vgic_global_state' can be dropped.
> 
> Please have a look!
> 
> [...]

Included Marc's recommended changelog addition.

Applied to kvmarm/next, thanks!

[1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1
      https://git.kernel.org/kvmarm/kvmarm/c/ad361ed4771d
[2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM
      https://git.kernel.org/kvmarm/kvmarm/c/8aaf3f7dce74

--
Best,
Oliver

^ permalink raw reply	[flat|nested] 8+ messages in thread

end of thread, other threads:[~2024-10-25 22:16 UTC | newest]

Thread overview: 8+ messages (download: mbox.gz follow: Atom feed
-- links below jump to the message on this page --
2024-10-22 14:40 [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Will Deacon
2024-10-22 14:40 ` [PATCH 1/2] KVM: arm64: Just advertise SEIS as 0 when emulating ICC_CTLR_EL1 Will Deacon
2024-10-22 16:27   ` Marc Zyngier
2024-10-22 14:40 ` [PATCH 2/2] KVM: arm64: Don't map 'kvm_vgic_global_state' at EL2 with pKVM Will Deacon
2024-10-22 17:01   ` Marc Zyngier
2024-10-23 16:39     ` Will Deacon
2024-10-23 16:53       ` Marc Zyngier
2024-10-25 22:16 ` [PATCH 0/2] KVM: arm64: Simplify handling of GICv3 hardware with broken SEIS Oliver Upton

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.