From: Marc Zyngier <maz@kernel.org>
To: Joey Gouly <joey.gouly@arm.com>
Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
James Morse <james.morse@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Oliver Upton <oliver.upton@linux.dev>,
Zenghui Yu <yuzenghui@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>
Subject: Re: [PATCH 14/25] KVM: arm64: Register AArch64 system register entries with the sysreg xarray
Date: Wed, 24 Jan 2024 16:37:23 +0000 [thread overview]
Message-ID: <86a5ou8z7g.wl-maz@kernel.org> (raw)
In-Reply-To: <20240124163425.GJ1283334@e124191.cambridge.arm.com>
On Wed, 24 Jan 2024 16:34:25 +0000,
Joey Gouly <joey.gouly@arm.com> wrote:
>
> On Mon, Jan 22, 2024 at 08:18:41PM +0000, Marc Zyngier wrote:
> > In order to reduce the number of lookups that we have to perform
> > when handling a sysreg, register each AArch64 sysreg descriptor
> > with the global xarray. The index of the descriptor is stored
> > as a 10 bit field in the data word.
> >
> > Subsequent patches will retrieve and use the stored index.
> >
> > Signed-off-by: Marc Zyngier <maz@kernel.org>
> > ---
> > arch/arm64/include/asm/kvm_host.h | 3 +++
> > arch/arm64/kvm/emulate-nested.c | 39 +++++++++++++++++++++++++++++--
> > arch/arm64/kvm/sys_regs.c | 11 ++++++++-
> > 3 files changed, 50 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> > index fe35c59214ad..e7a6219f2929 100644
> > --- a/arch/arm64/include/asm/kvm_host.h
> > +++ b/arch/arm64/include/asm/kvm_host.h
> > @@ -1083,6 +1083,9 @@ int kvm_handle_cp10_id(struct kvm_vcpu *vcpu);
> > void kvm_reset_sys_regs(struct kvm_vcpu *vcpu);
> >
> > int __init kvm_sys_reg_table_init(void);
> > +struct sys_reg_desc;
> > +int __init populate_sysreg_config(const struct sys_reg_desc *sr,
> > + unsigned int idx);
> > int __init populate_nv_trap_config(void);
> >
> > bool lock_all_vcpus(struct kvm *kvm);
> > diff --git a/arch/arm64/kvm/emulate-nested.c b/arch/arm64/kvm/emulate-nested.c
> > index 59622636b723..342d43b66fda 100644
> > --- a/arch/arm64/kvm/emulate-nested.c
> > +++ b/arch/arm64/kvm/emulate-nested.c
> > @@ -427,12 +427,14 @@ static const complex_condition_check ccc[] = {
> > * [19:14] bit number in the FGT register (6 bits)
> > * [20] trap polarity (1 bit)
> > * [25:21] FG filter (5 bits)
> > - * [62:26] Unused (37 bits)
> > + * [35:26] Main SysReg table index (10 bits)
> > + * [62:36] Unused (27 bits)
> > * [63] RES0 - Must be zero, as lost on insertion in the xarray
> > */
> > #define TC_CGT_BITS 10
> > #define TC_FGT_BITS 4
> > #define TC_FGF_BITS 5
> > +#define TC_MSR_BITS 10
> >
> > union trap_config {
> > u64 val;
> > @@ -442,7 +444,8 @@ union trap_config {
> > unsigned long bit:6; /* Bit number */
> > unsigned long pol:1; /* Polarity */
> > unsigned long fgf:TC_FGF_BITS; /* Fine Grained Filter */
> > - unsigned long unused:37; /* Unused, should be zero */
> > + unsigned long msr:TC_MSR_BITS; /* Main SysReg index */
> > + unsigned long unused:27; /* Unused, should be zero */
> > unsigned long mbz:1; /* Must Be Zero */
> > };
> > };
> > @@ -1862,6 +1865,38 @@ int __init populate_nv_trap_config(void)
> > return ret;
> > }
> >
> > +int __init populate_sysreg_config(const struct sys_reg_desc *sr,
> > + unsigned int idx)
> > +{
> > + union trap_config tc;
> > + u32 encoding;
> > + void *ret;
> > +
> > + /*
> > + * 0 is a valid value for the index, but not for the storage.
> > + * We'll store (idx+1), so check against an offset'd limit.
> > + */
> > + if (idx >= (BIT(TC_MSR_BITS) - 1)) {
> > + kvm_err("sysreg %s (%d) out of range\n", sr->name, idx);
> > + return -EINVAL;
> > + }
> > +
> > + encoding = sys_reg(sr->Op0, sr->Op1, sr->CRn, sr->CRm, sr->Op2);
> > + tc = get_trap_config(encoding);
> > +
> > + if (tc.msr) {
> > + kvm_err("sysreg %s (%d) duplicate entry (%d)\n",
> > + sr->name, idx - 1, tc.msr);
> > + return -EINVAL;
> > + }
> > +
> > + tc.msr = idx + 1;
> > + ret = xa_store(&sr_forward_xa, encoding,
> > + xa_mk_value(tc.val), GFP_KERNEL);
> > +
> > + return xa_err(ret);
> > +}
> > +
> > static enum trap_behaviour get_behaviour(struct kvm_vcpu *vcpu,
> > const struct trap_bits *tb)
> > {
> > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > index 77cd818c23b0..65319193e443 100644
> > --- a/arch/arm64/kvm/sys_regs.c
> > +++ b/arch/arm64/kvm/sys_regs.c
> > @@ -3974,6 +3974,7 @@ int __init kvm_sys_reg_table_init(void)
> > struct sys_reg_params params;
> > bool valid = true;
> > unsigned int i;
> > + int ret = 0;
> >
> > /* Make sure tables are unique and in order. */
> > valid &= check_sysreg_table(sys_reg_descs, ARRAY_SIZE(sys_reg_descs), false);
> > @@ -3997,5 +3998,13 @@ int __init kvm_sys_reg_table_init(void)
> > if (!first_idreg)
> > return -EINVAL;
> >
> > - return populate_nv_trap_config();
> > + ret = populate_nv_trap_config();
> > +
> > + for (i = 0; !ret && i < ARRAY_SIZE(sys_reg_descs); i++)
> > + ret = populate_sysreg_config(sys_reg_descs + i, i);
> > +
> > + for (i = 0; !ret && i < ARRAY_SIZE(sys_insn_descs); i++)
> > + ret = populate_sysreg_config(sys_insn_descs + i, i);
> > +
> > + return ret;
> > }
>
> The choice of `msr` was a tiny bit confusing due to the conflict with the asm
> instruction `msr`, but not enough to warrant renaming.
No, that's actually a very good point. How about SRI (Sys Reg Index)?
> Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Thanks!
M.
--
Without deviation from the norm, progress is not possible.
WARNING: multiple messages have this Message-ID (diff)
From: Marc Zyngier <maz@kernel.org>
To: Joey Gouly <joey.gouly@arm.com>
Cc: kvmarm@lists.linux.dev, linux-arm-kernel@lists.infradead.org,
James Morse <james.morse@arm.com>,
Suzuki K Poulose <suzuki.poulose@arm.com>,
Oliver Upton <oliver.upton@linux.dev>,
Zenghui Yu <yuzenghui@huawei.com>,
Catalin Marinas <catalin.marinas@arm.com>,
Will Deacon <will@kernel.org>, Mark Brown <broonie@kernel.org>
Subject: Re: [PATCH 14/25] KVM: arm64: Register AArch64 system register entries with the sysreg xarray
Date: Wed, 24 Jan 2024 16:37:23 +0000 [thread overview]
Message-ID: <86a5ou8z7g.wl-maz@kernel.org> (raw)
In-Reply-To: <20240124163425.GJ1283334@e124191.cambridge.arm.com>
On Wed, 24 Jan 2024 16:34:25 +0000,
Joey Gouly <joey.gouly@arm.com> wrote:
>
> On Mon, Jan 22, 2024 at 08:18:41PM +0000, Marc Zyngier wrote:
> > In order to reduce the number of lookups that we have to perform
> > when handling a sysreg, register each AArch64 sysreg descriptor
> > with the global xarray. The index of the descriptor is stored
> > as a 10 bit field in the data word.
> >
> > Subsequent patches will retrieve and use the stored index.
> >
> > Signed-off-by: Marc Zyngier <maz@kernel.org>
> > ---
> > arch/arm64/include/asm/kvm_host.h | 3 +++
> > arch/arm64/kvm/emulate-nested.c | 39 +++++++++++++++++++++++++++++--
> > arch/arm64/kvm/sys_regs.c | 11 ++++++++-
> > 3 files changed, 50 insertions(+), 3 deletions(-)
> >
> > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> > index fe35c59214ad..e7a6219f2929 100644
> > --- a/arch/arm64/include/asm/kvm_host.h
> > +++ b/arch/arm64/include/asm/kvm_host.h
> > @@ -1083,6 +1083,9 @@ int kvm_handle_cp10_id(struct kvm_vcpu *vcpu);
> > void kvm_reset_sys_regs(struct kvm_vcpu *vcpu);
> >
> > int __init kvm_sys_reg_table_init(void);
> > +struct sys_reg_desc;
> > +int __init populate_sysreg_config(const struct sys_reg_desc *sr,
> > + unsigned int idx);
> > int __init populate_nv_trap_config(void);
> >
> > bool lock_all_vcpus(struct kvm *kvm);
> > diff --git a/arch/arm64/kvm/emulate-nested.c b/arch/arm64/kvm/emulate-nested.c
> > index 59622636b723..342d43b66fda 100644
> > --- a/arch/arm64/kvm/emulate-nested.c
> > +++ b/arch/arm64/kvm/emulate-nested.c
> > @@ -427,12 +427,14 @@ static const complex_condition_check ccc[] = {
> > * [19:14] bit number in the FGT register (6 bits)
> > * [20] trap polarity (1 bit)
> > * [25:21] FG filter (5 bits)
> > - * [62:26] Unused (37 bits)
> > + * [35:26] Main SysReg table index (10 bits)
> > + * [62:36] Unused (27 bits)
> > * [63] RES0 - Must be zero, as lost on insertion in the xarray
> > */
> > #define TC_CGT_BITS 10
> > #define TC_FGT_BITS 4
> > #define TC_FGF_BITS 5
> > +#define TC_MSR_BITS 10
> >
> > union trap_config {
> > u64 val;
> > @@ -442,7 +444,8 @@ union trap_config {
> > unsigned long bit:6; /* Bit number */
> > unsigned long pol:1; /* Polarity */
> > unsigned long fgf:TC_FGF_BITS; /* Fine Grained Filter */
> > - unsigned long unused:37; /* Unused, should be zero */
> > + unsigned long msr:TC_MSR_BITS; /* Main SysReg index */
> > + unsigned long unused:27; /* Unused, should be zero */
> > unsigned long mbz:1; /* Must Be Zero */
> > };
> > };
> > @@ -1862,6 +1865,38 @@ int __init populate_nv_trap_config(void)
> > return ret;
> > }
> >
> > +int __init populate_sysreg_config(const struct sys_reg_desc *sr,
> > + unsigned int idx)
> > +{
> > + union trap_config tc;
> > + u32 encoding;
> > + void *ret;
> > +
> > + /*
> > + * 0 is a valid value for the index, but not for the storage.
> > + * We'll store (idx+1), so check against an offset'd limit.
> > + */
> > + if (idx >= (BIT(TC_MSR_BITS) - 1)) {
> > + kvm_err("sysreg %s (%d) out of range\n", sr->name, idx);
> > + return -EINVAL;
> > + }
> > +
> > + encoding = sys_reg(sr->Op0, sr->Op1, sr->CRn, sr->CRm, sr->Op2);
> > + tc = get_trap_config(encoding);
> > +
> > + if (tc.msr) {
> > + kvm_err("sysreg %s (%d) duplicate entry (%d)\n",
> > + sr->name, idx - 1, tc.msr);
> > + return -EINVAL;
> > + }
> > +
> > + tc.msr = idx + 1;
> > + ret = xa_store(&sr_forward_xa, encoding,
> > + xa_mk_value(tc.val), GFP_KERNEL);
> > +
> > + return xa_err(ret);
> > +}
> > +
> > static enum trap_behaviour get_behaviour(struct kvm_vcpu *vcpu,
> > const struct trap_bits *tb)
> > {
> > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > index 77cd818c23b0..65319193e443 100644
> > --- a/arch/arm64/kvm/sys_regs.c
> > +++ b/arch/arm64/kvm/sys_regs.c
> > @@ -3974,6 +3974,7 @@ int __init kvm_sys_reg_table_init(void)
> > struct sys_reg_params params;
> > bool valid = true;
> > unsigned int i;
> > + int ret = 0;
> >
> > /* Make sure tables are unique and in order. */
> > valid &= check_sysreg_table(sys_reg_descs, ARRAY_SIZE(sys_reg_descs), false);
> > @@ -3997,5 +3998,13 @@ int __init kvm_sys_reg_table_init(void)
> > if (!first_idreg)
> > return -EINVAL;
> >
> > - return populate_nv_trap_config();
> > + ret = populate_nv_trap_config();
> > +
> > + for (i = 0; !ret && i < ARRAY_SIZE(sys_reg_descs); i++)
> > + ret = populate_sysreg_config(sys_reg_descs + i, i);
> > +
> > + for (i = 0; !ret && i < ARRAY_SIZE(sys_insn_descs); i++)
> > + ret = populate_sysreg_config(sys_insn_descs + i, i);
> > +
> > + return ret;
> > }
>
> The choice of `msr` was a tiny bit confusing due to the conflict with the asm
> instruction `msr`, but not enough to warrant renaming.
No, that's actually a very good point. How about SRI (Sys Reg Index)?
> Reviewed-by: Joey Gouly <joey.gouly@arm.com>
Thanks!
M.
--
Without deviation from the norm, progress is not possible.
_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel
next prev parent reply other threads:[~2024-01-24 16:37 UTC|newest]
Thread overview: 114+ messages / expand[flat|nested] mbox.gz Atom feed top
2024-01-22 20:18 [PATCH 00/25] KVM/arm64: VM configuration enforcement Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 01/25] arm64: sysreg: Add missing ID_AA64ISAR[13]_EL1 fields and variants Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 21:29 ` Mark Brown
2024-01-22 21:29 ` Mark Brown
2024-01-22 20:18 ` [PATCH 02/25] KVM: arm64: Add feature checking helpers Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-26 19:05 ` Oliver Upton
2024-01-26 19:05 ` Oliver Upton
2024-01-30 12:12 ` Marc Zyngier
2024-01-30 12:12 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 03/25] KVM: arm64: nv: Add sanitising to VNCR-backed sysregs Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-23 13:48 ` Joey Gouly
2024-01-23 13:48 ` Joey Gouly
2024-01-23 17:33 ` Marc Zyngier
2024-01-23 17:33 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 04/25] KVM: arm64: nv: Add sanitising to EL2 configuration registers Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 05/25] KVM: arm64: nv: Add sanitising to VNCR-backed FGT sysregs Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 06/25] KVM: arm64: nv: Add sanitising to VNCR-backed HCRX_EL2 Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 07/25] KVM: arm64: nv: Drop sanitised_sys_reg() helper Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-23 14:01 ` Joey Gouly
2024-01-23 14:01 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 08/25] KVM: arm64: Unify HDFG[WR]TR_GROUP FGT identifiers Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-23 14:14 ` Joey Gouly
2024-01-23 14:14 ` Joey Gouly
2024-01-23 15:03 ` Marc Zyngier
2024-01-23 15:03 ` Marc Zyngier
2024-01-23 17:42 ` Mark Brown
2024-01-23 17:42 ` Mark Brown
2024-01-22 20:18 ` [PATCH 09/25] KVM: arm64: nv: Correctly handle negative polarity FGTs Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 10/25] KVM: arm64: nv: Turn encoding ranges into discrete XArray stores Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-23 16:37 ` Joey Gouly
2024-01-23 16:37 ` Joey Gouly
2024-01-23 17:45 ` Marc Zyngier
2024-01-23 17:45 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 11/25] KVM: arm64: Drop the requirement for XARRAY_MULTI Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 15:57 ` Joey Gouly
2024-01-24 15:57 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 12/25] KVM: arm64: nv: Move system instructions to their own sys_reg_desc array Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 16:23 ` Joey Gouly
2024-01-24 16:23 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 13/25] KVM: arm64: Always populate the trap configuration xarray Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 16:25 ` Joey Gouly
2024-01-24 16:25 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 14/25] KVM: arm64: Register AArch64 system register entries with the sysreg xarray Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 16:34 ` Joey Gouly
2024-01-24 16:34 ` Joey Gouly
2024-01-24 16:37 ` Marc Zyngier [this message]
2024-01-24 16:37 ` Marc Zyngier
2024-01-24 17:02 ` Joey Gouly
2024-01-24 17:02 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 15/25] KVM: arm64: Use the xarray as the primary sysreg/sysinsn walker Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 16:48 ` Joey Gouly
2024-01-24 16:48 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 16/25] KVM: arm64: Rename __check_nv_sr_forward() to triage_sysreg_trap() Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 16:57 ` Joey Gouly
2024-01-24 16:57 ` Joey Gouly
2024-01-30 12:43 ` Marc Zyngier
2024-01-30 12:43 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 17/25] KVM: arm64: Add Fine-Grained UNDEF tracking information Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 18/25] KVM: arm64: Propagate and handle Fine-Grained UNDEF bits Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 15:53 ` Joey Gouly
2024-01-24 15:53 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 19/25] KVM: arm64: Move existing feature disabling over to FGU infrastructure Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-24 17:16 ` Joey Gouly
2024-01-24 17:16 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 20/25] KVM: arm64: Streamline save/restore of HFG[RW]TR_EL2 Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-25 11:30 ` Joey Gouly
2024-01-25 11:30 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 21/25] KVM: arm64: Make TLBI OS/Range UNDEF if not advertised to the guest Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-25 13:30 ` Joey Gouly
2024-01-25 13:30 ` Joey Gouly
2024-01-30 12:46 ` Marc Zyngier
2024-01-30 12:46 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 22/25] KVM: arm64: Make PIR{,E0}_EL1 UNDEF if S1PIE is " Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-23 11:48 ` Joey Gouly
2024-01-23 11:48 ` Joey Gouly
2024-01-23 17:51 ` Marc Zyngier
2024-01-23 17:51 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 23/25] KVM: arm64: Make AMU sysreg UNDEF if FEAT_AMU " Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-25 13:42 ` Joey Gouly
2024-01-25 13:42 ` Joey Gouly
2024-01-22 20:18 ` [PATCH 24/25] KVM: arm64: Make FEAT_MOPS UNDEF if " Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
2024-01-25 16:25 ` Joey Gouly
2024-01-25 16:25 ` Joey Gouly
2024-01-25 17:35 ` Joey Gouly
2024-01-25 17:35 ` Joey Gouly
2024-01-26 9:17 ` Marc Zyngier
2024-01-26 9:17 ` Marc Zyngier
2024-01-22 20:18 ` [PATCH 25/25] KVM: arm64: Add debugfs file for guest's ID registers Marc Zyngier
2024-01-22 20:18 ` Marc Zyngier
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=86a5ou8z7g.wl-maz@kernel.org \
--to=maz@kernel.org \
--cc=broonie@kernel.org \
--cc=catalin.marinas@arm.com \
--cc=james.morse@arm.com \
--cc=joey.gouly@arm.com \
--cc=kvmarm@lists.linux.dev \
--cc=linux-arm-kernel@lists.infradead.org \
--cc=oliver.upton@linux.dev \
--cc=suzuki.poulose@arm.com \
--cc=will@kernel.org \
--cc=yuzenghui@huawei.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.