Re: [PATCH v19 03/14] KVM: arm64: Manage GCS access and registers for guests
Wei-Lin Chang <[email protected]>
| Newsgroups | org.kernel.vger.linux-kselftest,dev.linux.lists.kvmarm,org.infradead.lists.linux-arm-kernel,org.kernel.vger.linux-doc,org.kernel.vger.linux-kernel |
|---|---|
| Message-ID | <up3nfebqc42ykeboaqng22ib3ndgkecuwtuz4bdstjzebsuesq@2fy6i736x4gj> |
On Wed, Aug 12, 2026 at 08:12:02PM +0100, Mark Brown wrote: > GCS introduces a number of system registers, on systems with GCS we need > to context switch them and expose them to VMMs to allow guests to use > GCS. > > In order to allow guests to use GCS we also need to configure > HCRX_EL2.GCSEn, if this is not set GCS instructions will be noops and > CHKFEAT will report GCS as disabled. > > Signed-off-by: Mark Brown <[email protected]> > --- > arch/arm64/include/asm/kvm_emulate.h | 3 +++ > arch/arm64/include/asm/kvm_host.h | 14 ++++++++++ > arch/arm64/include/asm/vncr_mapping.h | 2 ++ > arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 31 ++++++++++++++++++++++ > arch/arm64/kvm/hyp/vhe/sysreg-sr.c | 10 +++++++ > arch/arm64/kvm/sys_regs.c | 42 ++++++++++++++++++++++++++++++ > 6 files changed, 102 insertions(+) > [...] > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h > index bae2c4f92ef5..1f0da8988961 100644 > --- a/arch/arm64/include/asm/kvm_host.h > +++ b/arch/arm64/include/asm/kvm_host.h [...] > @@ -1648,6 +1658,10 @@ void kvm_set_vm_id_reg(struct kvm *kvm, u32 reg, u64 val); > #define kvm_has_sctlr2(k) \ > (kvm_has_feat((k), ID_AA64MMFR3_EL1, SCTLRX, IMP)) > > +#define kvm_has_gcs(k) \ > + (system_supports_gcs() && \ > + kvm_has_feat((k), ID_AA64PFR1_EL1, GCS, IMP)) > + > static inline bool kvm_arch_has_irq_bypass(void) > { > return true; [...] > diff --git a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h > index a17cbe7582de..053d7b3c5104 100644 > --- a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h > +++ b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h [...] > @@ -131,6 +137,17 @@ static inline bool ctxt_has_sctlr2(struct kvm_cpu_context *ctxt) > return kvm_has_sctlr2(kern_hyp_va(vcpu->kvm)); > } > > +static inline bool ctxt_has_gcs(struct kvm_cpu_context *ctxt) > +{ > + struct kvm_vcpu *vcpu; > + > + if (!cpus_have_final_cap(ARM64_HAS_GCS)) > + return false; > + > + vcpu = ctxt_to_vcpu(ctxt); > + return kvm_has_feat(kern_hyp_va(vcpu->kvm), ID_AA64PFR1_EL1, GCS, IMP); > +} This seems to duplicate some work done in kvm_has_gcs(), can we use kvm_has_gcs() in this function? static inline bool ctxt_has_gcs(struct kvm_cpu_context *ctxt) { struct kvm_vcpu *vcpu = ctxt_to_vcpu(ctxt); return kvm_has_gcs(kern_hyp_va(vcpu->kvm)); } Thanks, Wei-Lin Chang [...]