linux-fsdevel.vger.kernel.org archive mirror
 help / color / mirror / Atom feed
From: Marc Zyngier <maz@kernel.org>
To: Joey Gouly <joey.gouly@arm.com>
Cc: linux-arm-kernel@lists.infradead.org, akpm@linux-foundation.org,
	aneesh.kumar@linux.ibm.com, broonie@kernel.org,
	catalin.marinas@arm.com, dave.hansen@linux.intel.com,
	oliver.upton@linux.dev, shuah@kernel.org, will@kernel.org,
	kvmarm@lists.linux.dev, linux-fsdevel@vger.kernel.org,
	linux-mm@kvack.org, linux-kselftest@vger.kernel.org,
	James Morse <james.morse@arm.com>,
	Suzuki K Poulose <suzuki.poulose@arm.com>,
	Zenghui Yu <yuzenghui@huawei.com>
Subject: Re: [PATCH v3 06/25] KVM: arm64: Save/restore POE registers
Date: Wed, 29 Nov 2023 19:47:50 +0000	[thread overview]
Message-ID: <87h6l48hp5.wl-maz@kernel.org> (raw)
In-Reply-To: <20231129151123.GA2423241@e124191.cambridge.arm.com>

On Wed, 29 Nov 2023 15:11:23 +0000,
Joey Gouly <joey.gouly@arm.com> wrote:
> 
> Hi Marc,
> 
> Thanks for taking a look.
> 
> On Mon, Nov 27, 2023 at 06:01:18PM +0000, Marc Zyngier wrote:
> > On Fri, 24 Nov 2023 16:34:51 +0000,
> > Joey Gouly <joey.gouly@arm.com> wrote:
> > > 
> > > Define the new system registers that POE introduces and context switch them.
> > 
> > I would really like to see a discussion on the respective lifetimes of
> > these two registers (see below).
> > 
> > >
> > > Signed-off-by: Joey Gouly <joey.gouly@arm.com>
> > > Cc: Marc Zyngier <maz@kernel.org>
> > > Cc: Oliver Upton <oliver.upton@linux.dev>
> > > Cc: Catalin Marinas <catalin.marinas@arm.com>
> > > Cc: Will Deacon <will@kernel.org>
> > > ---
> > >  arch/arm64/include/asm/kvm_arm.h           |  4 ++--
> > >  arch/arm64/include/asm/kvm_host.h          |  4 ++++
> > >  arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h | 10 ++++++++++
> > >  arch/arm64/kvm/sys_regs.c                  |  2 ++
> > >  4 files changed, 18 insertions(+), 2 deletions(-)
> > > 
> > > diff --git a/arch/arm64/include/asm/kvm_arm.h b/arch/arm64/include/asm/kvm_arm.h
> > > index b85f46a73e21..597470e0b87b 100644
> > > --- a/arch/arm64/include/asm/kvm_arm.h
> > > +++ b/arch/arm64/include/asm/kvm_arm.h
> > > @@ -346,14 +346,14 @@
> > >   */
> > >  #define __HFGRTR_EL2_RES0	(GENMASK(63, 56) | GENMASK(53, 51))
> > >  #define __HFGRTR_EL2_MASK	GENMASK(49, 0)
> > > -#define __HFGRTR_EL2_nMASK	(GENMASK(58, 57) | GENMASK(55, 54) | BIT(50))
> > > +#define __HFGRTR_EL2_nMASK	(GENMASK(60, 57) | GENMASK(55, 54) | BIT(50))
> > >  
> > >  #define __HFGWTR_EL2_RES0	(GENMASK(63, 56) | GENMASK(53, 51) |	\
> > >  				 BIT(46) | BIT(42) | BIT(40) | BIT(28) | \
> > >  				 GENMASK(26, 25) | BIT(21) | BIT(18) |	\
> > >  				 GENMASK(15, 14) | GENMASK(10, 9) | BIT(2))
> > >  #define __HFGWTR_EL2_MASK	GENMASK(49, 0)
> > > -#define __HFGWTR_EL2_nMASK	(GENMASK(58, 57) | GENMASK(55, 54) | BIT(50))
> > > +#define __HFGWTR_EL2_nMASK	(GENMASK(60, 57) | GENMASK(55, 54) | BIT(50))
> > >  
> > >  #define __HFGITR_EL2_RES0	GENMASK(63, 57)
> > >  #define __HFGITR_EL2_MASK	GENMASK(54, 0)
> > > diff --git a/arch/arm64/include/asm/kvm_host.h b/arch/arm64/include/asm/kvm_host.h
> > > index 824f29f04916..fa9ebd8fce40 100644
> > > --- a/arch/arm64/include/asm/kvm_host.h
> > > +++ b/arch/arm64/include/asm/kvm_host.h
> > > @@ -401,6 +401,10 @@ enum vcpu_sysreg {
> > >  	PIR_EL1,       /* Permission Indirection Register 1 (EL1) */
> > >  	PIRE0_EL1,     /*  Permission Indirection Register 0 (EL1) */
> > >  
> > > +	/* Permission Overlay Extension registers */
> > > +	POR_EL1,	/* Permission Overlay Register 1 (EL1) */
> > > +	POR_EL0,	/* Permission Overlay Register 0 (EL0) */
> > > +
> > >  	/* 32bit specific registers. */
> > >  	DACR32_EL2,	/* Domain Access Control Register */
> > >  	IFSR32_EL2,	/* Instruction Fault Status Register */
> > > diff --git a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h
> > > index bb6b571ec627..22f07ee43e7e 100644
> > > --- a/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h
> > > +++ b/arch/arm64/kvm/hyp/include/hyp/sysreg-sr.h
> > > @@ -19,6 +19,9 @@
> > >  static inline void __sysreg_save_common_state(struct kvm_cpu_context *ctxt)
> > >  {
> > >  	ctxt_sys_reg(ctxt, MDSCR_EL1)	= read_sysreg(mdscr_el1);
> > > +
> > > +	if (system_supports_poe())
> > > +		ctxt_sys_reg(ctxt, POR_EL0)	= read_sysreg_s(SYS_POR_EL0);
> > 
> > So this is saved as eagerly as it gets. Why? If it only affects EL0,
> > it can be saved/restored in a much lazier way.
> 
> Just to confirm I understand what you mean, the current code looks like:
> 
> 	vcpu_load()                // Lazy save
> 
> 	while (ret > 0)
> 		check_vcpu_requests()
> 		kvm_arm_vcpu_enter_exit()  // Eager save/restore
> 		ret = handle_exit()
> 
> 	vcpu_put()                // Lazy restore

Yes, with the additional caveat that VHE and nVHE/hVHE have different
views of what can be lazy or not.

>
> POR_EL0 does affect EL2, if it does some form of {get,put}_user.
> This happens in vgic_its_process_commands (as part of handle_exit), also the
> stolen time code (in check_vcpu_requests) and could possibly happen if perf
> tries to walk the user stack.
>
> So I think that it does need to happen eagerly, such that the host-userspace's
> POR_EL0 is used to access the VM's memory, not the guest-userspace's POR_EL0.

OK, I didn't quite see that initially, thanks for the explanation.
I find it rather ugly that userspace can directly affect these
functionalities, but hey, why not.

> Does that make sense? It will need a comment, I agree.

Yes, that'd be good indeed.

> 
> > 
> > >  }
> > >  
> > >  static inline void __sysreg_save_user_state(struct kvm_cpu_context *ctxt)
> > > @@ -59,6 +62,8 @@ static inline void __sysreg_save_el1_state(struct kvm_cpu_context *ctxt)
> > >  		ctxt_sys_reg(ctxt, PIR_EL1)	= read_sysreg_el1(SYS_PIR);
> > >  		ctxt_sys_reg(ctxt, PIRE0_EL1)	= read_sysreg_el1(SYS_PIRE0);
> > 
> > And the fact that you only touch PIRE0_EL1 here seems to be a good
> > indication that the above can be relaxed.
> 
> PIREO_EL1 is not directly accessible from EL0. I'll have a think
> about this a bit more, and if there is a potential similar issue
> here.

Ah, re-reading the spec, I see that there is a PIRE0_EL2 that is in
use for VHE, meaning that in that case restoring POR_EL0 is enough to
get the correct permissions. For nVHE/hVHE, this function is part of
the 'eager' lot, so it doesn't matter.

So this code is correct in the end, and all that's missing is some
comments and the NV stuff.

Thanks,

	M.

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

  reply	other threads:[~2023-11-29 19:47 UTC|newest]

Thread overview: 61+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2023-11-24 16:34 [PATCH v3 00/25] Permission Overlay Extension Joey Gouly
2023-11-24 16:34 ` [PATCH v3 01/25] arm64/sysreg: add system register POR_EL{0,1} Joey Gouly
2023-12-04 18:40   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 02/25] arm64/sysreg: update CPACR_EL1 register Joey Gouly
2023-12-04 18:41   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 03/25] arm64: cpufeature: add Permission Overlay Extension cpucap Joey Gouly
2023-11-25 12:11   ` Mark Brown
2023-12-04 18:46   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 04/25] arm64: disable trapping of POR_EL0 to EL2 Joey Gouly
2023-12-07 13:37   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 05/25] arm64: context switch POR_EL0 register Joey Gouly
2023-11-25 12:02   ` Mark Brown
2023-12-07 13:55     ` Catalin Marinas
2023-12-07 14:12       ` Mark Brown
2023-12-07 13:51   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 06/25] KVM: arm64: Save/restore POE registers Joey Gouly
2023-11-27 18:01   ` Marc Zyngier
2023-11-29 15:11     ` Joey Gouly
2023-11-29 19:47       ` Marc Zyngier [this message]
2023-11-30 15:51   ` Marc Zyngier
2023-11-24 16:34 ` [PATCH v3 07/25] arm64: enable the Permission Overlay Extension for EL0 Joey Gouly
2023-12-07 14:08   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 08/25] arm64: add POIndex defines Joey Gouly
2023-11-24 16:34 ` [PATCH v3 09/25] arm64: define VM_PKEY_BIT* for arm64 Joey Gouly
2023-12-07 15:10   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 10/25] arm64: mask out POIndex when modifying a PTE Joey Gouly
2023-12-07 15:11   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 11/25] arm64: enable ARCH_HAS_PKEYS on arm64 Joey Gouly
2023-12-07 15:25   ` Catalin Marinas
2023-12-07 15:44     ` Joey Gouly
2023-11-24 16:34 ` [PATCH v3 12/25] arm64: handle PKEY/POE faults Joey Gouly
2023-12-11 18:18   ` Catalin Marinas
2023-12-13 15:02     ` Joey Gouly
2023-11-24 16:34 ` [PATCH v3 13/25] arm64: stop using generic mm_hooks.h Joey Gouly
2023-12-11 18:22   ` Catalin Marinas
2023-11-24 16:34 ` [PATCH v3 14/25] arm64: implement PKEYS support Joey Gouly
2023-12-11 18:49   ` Catalin Marinas
2023-12-14 13:47     ` Joey Gouly
2023-11-24 16:35 ` [PATCH v3 15/25] arm64: add POE signal support Joey Gouly
2023-12-11 18:53   ` Catalin Marinas
2023-12-12 12:03     ` Szabolcs Nagy
2023-11-24 16:35 ` [PATCH v3 16/25] arm64: enable PKEY support for CPUs with S1POE Joey Gouly
2023-12-11 18:53   ` Catalin Marinas
2023-11-24 16:35 ` [PATCH v3 17/25] arm64: enable POE and PIE to coexist Joey Gouly
2023-12-11 18:57   ` Catalin Marinas
2023-11-24 16:35 ` [PATCH v3 18/25] arm64/ptrace: add support for FEAT_POE Joey Gouly
2023-11-24 17:18   ` Mark Brown
2023-12-11 18:58   ` Catalin Marinas
2023-11-24 16:35 ` [PATCH v3 19/25] kselftest/arm64: move get_header() Joey Gouly
2023-11-24 17:16   ` Mark Brown
2023-11-24 16:35 ` [PATCH v3 20/25] selftests: mm: move fpregs printing Joey Gouly
2023-11-24 16:35 ` [PATCH v3 21/25] selftests: mm: make protection_keys test work on arm64 Joey Gouly
2023-11-24 16:35 ` [PATCH v3 22/25] kselftest/arm64: add HWCAP test for FEAT_S1POE Joey Gouly
2023-11-24 17:02   ` Mark Brown
2023-11-24 16:35 ` [PATCH v3 23/25] kselftest/arm64: parse POE_MAGIC in a signal frame Joey Gouly
2023-11-24 16:35 ` [PATCH v3 24/25] kselftest/arm64: Add test case for POR_EL0 signal frame records Joey Gouly
2023-11-24 17:04   ` Mark Brown
2023-11-24 16:35 ` [PATCH v3 25/25] KVM: selftests: get-reg-list: add Permission Overlay registers Joey Gouly
2023-11-24 17:07   ` Mark Brown
2023-12-04 11:03 ` [PATCH v3 00/25] Permission Overlay Extension Marc Zyngier
2023-12-05 15:41   ` Joey Gouly

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=87h6l48hp5.wl-maz@kernel.org \
    --to=maz@kernel.org \
    --cc=akpm@linux-foundation.org \
    --cc=aneesh.kumar@linux.ibm.com \
    --cc=broonie@kernel.org \
    --cc=catalin.marinas@arm.com \
    --cc=dave.hansen@linux.intel.com \
    --cc=james.morse@arm.com \
    --cc=joey.gouly@arm.com \
    --cc=kvmarm@lists.linux.dev \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=linux-fsdevel@vger.kernel.org \
    --cc=linux-kselftest@vger.kernel.org \
    --cc=linux-mm@kvack.org \
    --cc=oliver.upton@linux.dev \
    --cc=shuah@kernel.org \
    --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 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).