All of lore.kernel.org
 help / color / mirror / Atom feed
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Andrew Jones <drjones@redhat.com>
Cc: maz@kernel.org, kvmarm@lists.cs.columbia.edu,
	linux-arm-kernel@lists.infradead.org
Subject: Re: [PATCH 2/2] KVM: arm64: Use get_raz_reg() for userspace reads of PMSWINC_EL0
Date: Wed, 6 Oct 2021 16:35:55 +0100	[thread overview]
Message-ID: <YV3CR0RABZY15kvN@monolith.localdoman> (raw)
In-Reply-To: <20211006152302.2tmih2vx5x7xipml@gator.home>

Hi Drew,

On Wed, Oct 06, 2021 at 05:23:02PM +0200, Andrew Jones wrote:
> On Wed, Oct 06, 2021 at 03:49:19PM +0100, Alexandru Elisei wrote:
> > Hi Drew,
> > 
> > Thank you for the review!
> > 
> > On Thu, Sep 30, 2021 at 03:29:15PM +0200, Andrew Jones wrote:
> > > On Mon, Sep 27, 2021 at 01:49:11PM +0100, Alexandru Elisei wrote:
> > > > PMSWINC_EL0 is a write-only register and was initially part of the VCPU
> > > > register state, but was later removed in commit 7a3ba3095a32 ("KVM:
> > > > arm64: Remove PMSWINC_EL0 shadow register"). To prevent regressions, the
> > > > register was kept accessible from userspace as Read-As-Zero (RAZ).
> > > > 
> > > > The read function that is used to handle userspace reads of this
> > > > register is get_raz_id_reg(), which, while technically correct, as it
> > > > returns 0, it is not semantically correct, as PMSWINC_EL0 is not an ID
> > > > register as the function name suggests.
> > > > 
> > > > Add a new function, get_raz_reg(), to use it as the accessor for
> > > > PMSWINC_EL0, as to not conflate get_raz_id_reg() to handle other types
> > > > of registers.
> > > > 
> > > > No functional change intended.
> > > > 
> > > > Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
> > > > ---
> > > >  arch/arm64/kvm/sys_regs.c | 11 ++++++++++-
> > > >  1 file changed, 10 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > > > index 4adda8bf3168..1be827740f87 100644
> > > > --- a/arch/arm64/kvm/sys_regs.c
> > > > +++ b/arch/arm64/kvm/sys_regs.c
> > > > @@ -1285,6 +1285,15 @@ static int set_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
> > > >  	return __set_id_reg(vcpu, rd, uaddr, true);
> > > >  }
> > > >  
> > > > +static int get_raz_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
> > > > +		       const struct kvm_one_reg *reg, void __user *uaddr)
> > > > +{
> > > > +	const u64 id = sys_reg_to_index(rd);
> > > > +	const u64 val = 0;
> > > > +
> > > > +	return reg_to_user(uaddr, &val, id);
> > > > +}
> > > > +
> > > >  static int set_wi_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
> > > >  		      const struct kvm_one_reg *reg, void __user *uaddr)
> > > >  {
> > > > @@ -1647,7 +1656,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
> > > >  	 * previously (and pointlessly) advertised in the past...
> > > >  	 */
> > > >  	{ PMU_SYS_REG(SYS_PMSWINC_EL0),
> > > > -	  .get_user = get_raz_id_reg, .set_user = set_wi_reg,
> > > > +	  .get_user = get_raz_reg, .set_user = set_wi_reg,
> > > >  	  .access = access_pmswinc, .reset = NULL },
> > > >  	{ PMU_SYS_REG(SYS_PMSELR_EL0),
> > > >  	  .access = access_pmselr, .reset = reset_pmselr, .reg = PMSELR_EL0 },
> > > > -- 
> > > > 2.33.0
> > > >
> > > 
> > > What about replacing get_raz_id_reg() with this new function? Do really need
> > > both?
> > 
> > I thought about that when writing this patch. I ultimately decided against it
> > because changing the get_user accessor to be get_raz_reg() instead of
> > get_raz_id_reg() would break the symmetry with set_user, which needs to stay
> > set_raz_id_reg(), and cannot be substituted with set_wi_reg() because that would
> > be a change in behaviour (set_raz_id_reg() checks that val == 0, set_wi_reg()
> > doesn't).
> > 
> > I do agree that get_raz_id_reg() does the exact same thing as get_raz_reg(), but
> > in a more roundabout manner. So if you still feel that I should use
> > get_raz_reg() instead, I'll do that for the next iteration of the series. What
> > do you think?
> 
> I'd prefer we avoid maintaining two implementations of the same
> functionality. If we want to keep the symmetry with set_raz_id_reg,
> then we could implement get_raz_id_reg as 'return get_raz_reg()'.

Agreed, I'll replace get_raz_id_reg() with get_raz_reg().

Thanks,
Alex

> 
> Thanks,
> drew
> 
_______________________________________________
kvmarm mailing list
kvmarm@lists.cs.columbia.edu
https://lists.cs.columbia.edu/mailman/listinfo/kvmarm

WARNING: multiple messages have this Message-ID (diff)
From: Alexandru Elisei <alexandru.elisei@arm.com>
To: Andrew Jones <drjones@redhat.com>
Cc: maz@kernel.org, linux-arm-kernel@lists.infradead.org,
	kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH 2/2] KVM: arm64: Use get_raz_reg() for userspace reads of PMSWINC_EL0
Date: Wed, 6 Oct 2021 16:35:55 +0100	[thread overview]
Message-ID: <YV3CR0RABZY15kvN@monolith.localdoman> (raw)
In-Reply-To: <20211006152302.2tmih2vx5x7xipml@gator.home>

Hi Drew,

On Wed, Oct 06, 2021 at 05:23:02PM +0200, Andrew Jones wrote:
> On Wed, Oct 06, 2021 at 03:49:19PM +0100, Alexandru Elisei wrote:
> > Hi Drew,
> > 
> > Thank you for the review!
> > 
> > On Thu, Sep 30, 2021 at 03:29:15PM +0200, Andrew Jones wrote:
> > > On Mon, Sep 27, 2021 at 01:49:11PM +0100, Alexandru Elisei wrote:
> > > > PMSWINC_EL0 is a write-only register and was initially part of the VCPU
> > > > register state, but was later removed in commit 7a3ba3095a32 ("KVM:
> > > > arm64: Remove PMSWINC_EL0 shadow register"). To prevent regressions, the
> > > > register was kept accessible from userspace as Read-As-Zero (RAZ).
> > > > 
> > > > The read function that is used to handle userspace reads of this
> > > > register is get_raz_id_reg(), which, while technically correct, as it
> > > > returns 0, it is not semantically correct, as PMSWINC_EL0 is not an ID
> > > > register as the function name suggests.
> > > > 
> > > > Add a new function, get_raz_reg(), to use it as the accessor for
> > > > PMSWINC_EL0, as to not conflate get_raz_id_reg() to handle other types
> > > > of registers.
> > > > 
> > > > No functional change intended.
> > > > 
> > > > Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com>
> > > > ---
> > > >  arch/arm64/kvm/sys_regs.c | 11 ++++++++++-
> > > >  1 file changed, 10 insertions(+), 1 deletion(-)
> > > > 
> > > > diff --git a/arch/arm64/kvm/sys_regs.c b/arch/arm64/kvm/sys_regs.c
> > > > index 4adda8bf3168..1be827740f87 100644
> > > > --- a/arch/arm64/kvm/sys_regs.c
> > > > +++ b/arch/arm64/kvm/sys_regs.c
> > > > @@ -1285,6 +1285,15 @@ static int set_raz_id_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
> > > >  	return __set_id_reg(vcpu, rd, uaddr, true);
> > > >  }
> > > >  
> > > > +static int get_raz_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
> > > > +		       const struct kvm_one_reg *reg, void __user *uaddr)
> > > > +{
> > > > +	const u64 id = sys_reg_to_index(rd);
> > > > +	const u64 val = 0;
> > > > +
> > > > +	return reg_to_user(uaddr, &val, id);
> > > > +}
> > > > +
> > > >  static int set_wi_reg(struct kvm_vcpu *vcpu, const struct sys_reg_desc *rd,
> > > >  		      const struct kvm_one_reg *reg, void __user *uaddr)
> > > >  {
> > > > @@ -1647,7 +1656,7 @@ static const struct sys_reg_desc sys_reg_descs[] = {
> > > >  	 * previously (and pointlessly) advertised in the past...
> > > >  	 */
> > > >  	{ PMU_SYS_REG(SYS_PMSWINC_EL0),
> > > > -	  .get_user = get_raz_id_reg, .set_user = set_wi_reg,
> > > > +	  .get_user = get_raz_reg, .set_user = set_wi_reg,
> > > >  	  .access = access_pmswinc, .reset = NULL },
> > > >  	{ PMU_SYS_REG(SYS_PMSELR_EL0),
> > > >  	  .access = access_pmselr, .reset = reset_pmselr, .reg = PMSELR_EL0 },
> > > > -- 
> > > > 2.33.0
> > > >
> > > 
> > > What about replacing get_raz_id_reg() with this new function? Do really need
> > > both?
> > 
> > I thought about that when writing this patch. I ultimately decided against it
> > because changing the get_user accessor to be get_raz_reg() instead of
> > get_raz_id_reg() would break the symmetry with set_user, which needs to stay
> > set_raz_id_reg(), and cannot be substituted with set_wi_reg() because that would
> > be a change in behaviour (set_raz_id_reg() checks that val == 0, set_wi_reg()
> > doesn't).
> > 
> > I do agree that get_raz_id_reg() does the exact same thing as get_raz_reg(), but
> > in a more roundabout manner. So if you still feel that I should use
> > get_raz_reg() instead, I'll do that for the next iteration of the series. What
> > do you think?
> 
> I'd prefer we avoid maintaining two implementations of the same
> functionality. If we want to keep the symmetry with set_raz_id_reg,
> then we could implement get_raz_id_reg as 'return get_raz_reg()'.

Agreed, I'll replace get_raz_id_reg() with get_raz_reg().

Thanks,
Alex

> 
> Thanks,
> drew
> 

_______________________________________________
linux-arm-kernel mailing list
linux-arm-kernel@lists.infradead.org
http://lists.infradead.org/mailman/listinfo/linux-arm-kernel

  reply	other threads:[~2021-10-06 15:34 UTC|newest]

Thread overview: 18+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-09-27 12:49 [PATCH 0/2] KVM: arm64: Minor improvements to RAZ register handling Alexandru Elisei
2021-09-27 12:49 ` Alexandru Elisei
2021-09-27 12:49 ` [PATCH 1/2] KVM: arm64: Return early from read_id_reg() if register is RAZ Alexandru Elisei
2021-09-27 12:49   ` Alexandru Elisei
2021-09-30 13:22   ` Andrew Jones
2021-09-30 13:22     ` Andrew Jones
2021-09-27 12:49 ` [PATCH 2/2] KVM: arm64: Use get_raz_reg() for userspace reads of PMSWINC_EL0 Alexandru Elisei
2021-09-27 12:49   ` Alexandru Elisei
2021-09-30 13:29   ` Andrew Jones
2021-09-30 13:29     ` Andrew Jones
2021-10-06 14:49     ` Alexandru Elisei
2021-10-06 14:49       ` Alexandru Elisei
2021-10-06 15:23       ` Andrew Jones
2021-10-06 15:23         ` Andrew Jones
2021-10-06 15:35         ` Alexandru Elisei [this message]
2021-10-06 15:35           ` Alexandru Elisei
2021-10-11  9:47 ` [PATCH 0/2] KVM: arm64: Minor improvements to RAZ register handling Marc Zyngier
2021-10-11  9:47   ` 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=YV3CR0RABZY15kvN@monolith.localdoman \
    --to=alexandru.elisei@arm.com \
    --cc=drjones@redhat.com \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=maz@kernel.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 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.