From: Mark Rutland <mark.rutland@arm.com> To: Alexandru Elisei <alexandru.elisei@arm.com> Cc: maz@kernel.org, pbonzini@redhat.com, kvmarm@lists.cs.columbia.edu, kvm@vger.kernel.org, andre.przywara@arm.com Subject: Re: [kvm-unit-tests RFC PATCH 14/16] lib: arm64: Add support for disabling and re-enabling VHE Date: Wed, 28 Aug 2019 15:19:28 +0100 Message-ID: <20190828141927.GD41023@lakrids.cambridge.arm.com> (raw) In-Reply-To: <1566999511-24916-15-git-send-email-alexandru.elisei@arm.com> On Wed, Aug 28, 2019 at 02:38:29PM +0100, Alexandru Elisei wrote: > Add a function to disable VHE and another one to re-enable VHE. Both > functions work under the assumption that the CPU had VHE mode enabled at > boot. > > Minimal support to run with VHE has been added to the TLB invalidate > functions and to the exception handling code. > > Since we're touch the assembly enable/disable MMU code, let's take this > opportunity to replace a magic number with the proper define. > > Signed-off-by: Alexandru Elisei <alexandru.elisei@arm.com> > --- > lib/arm/asm/processor.h | 8 ++ > lib/arm64/asm/mmu.h | 11 ++- > lib/arm64/asm/pgtable-hwdef.h | 53 +++++++++--- > lib/arm64/asm/processor.h | 44 +++++++++- > lib/arm/processor.c | 11 +++ > lib/arm/setup.c | 2 + > lib/arm64/processor.c | 67 ++++++++++++++- > arm/cstart64.S | 186 +++++++++++++++++++++++++++++++++++++++++- > 8 files changed, 364 insertions(+), 18 deletions(-) > +extern void asm_disable_vhe(void); > +void disable_vhe(void) > +{ > + u64 sp, sp_phys, sp_base, sp_base_phys; > + > + assert(current_level() == CurrentEL_EL2 && vhe_enabled()); > + > + sp = current_stack_pointer; > + sp_phys = __virt_to_phys(sp); > + sp_base = sp & THREAD_MASK; > + sp_base_phys = sp_phys & THREAD_MASK; > + > + /* > + * We will disable, then enable the MMU, make sure the exception > + * handling code works during the small window of time when the MMU is > + * off. > + */ > + dcache_clean_inval_range(sp_base, sp_base + THREAD_SIZE); > + dcache_inval_range(sp_base_phys, sp_base_phys + THREAD_SIZE); > + asm volatile( "mov sp, %0\n" : :"r" (sp_phys)); > + > + asm_disable_vhe(); > + > + dcache_clean_inval_range(sp_base_phys, sp_base_phys + THREAD_SIZE); > + dcache_inval_range(sp_base, sp_base + THREAD_SIZE); > + asm volatile( "mov sp, %0\n" : :"r" (sp)); > +} This sequence is not safe. The compiler can spill/reload at any point, and the CPU can allocate (clean) lines into the cache while the MMU is enabled. I think you need to move the entire sequence to assembly, and should perform any cache maintenance while the MMU is off. > +extern void asm_enable_vhe(void); > +void enable_vhe(void) > +{ > + u64 sp, sp_phys, sp_base, sp_base_phys; > + > + assert(current_level() == CurrentEL_EL2 && !vhe_enabled()); > + > + sp = current_stack_pointer; > + sp_phys = __virt_to_phys(sp); > + sp_base = sp & THREAD_MASK; > + sp_base_phys = sp_phys & THREAD_MASK; > + > + dcache_clean_inval_range(sp_base, sp_base + THREAD_SIZE); > + dcache_inval_range(sp_base_phys, sp_base_phys + THREAD_SIZE); > + asm volatile( "mov sp, %0\n" : :"r" (sp_phys)); > + > + asm_enable_vhe(); > + > + dcache_clean_inval_range(sp_base_phys, sp_base_phys + THREAD_SIZE); > + dcache_inval_range(sp_base, sp_base + THREAD_SIZE); > + asm volatile( "mov sp, %0\n" : :"r" (sp)); > +} Likewise. > diff --git a/arm/cstart64.S b/arm/cstart64.S > index d4b20267a7a6..dc9e634e2307 100644 > --- a/arm/cstart64.S > +++ b/arm/cstart64.S > @@ -104,6 +104,13 @@ exceptions_init: > > .text > > +exceptions_init_nvhe: > + adrp x0, vector_table_nvhe > + add x0, x0, :lo12:vector_table_nvhe > + msr vbar_el2, x0 > + isb > + ret > + > .globl get_mmu_off > get_mmu_off: > adrp x0, auxinfo > @@ -204,7 +211,7 @@ asm_mmu_enable: > TCR_IRGN_WBWA | TCR_ORGN_WBWA | \ > TCR_SHARED > mrs x2, id_aa64mmfr0_el1 > - bfi x1, x2, #32, #3 > + bfi x1, x2, #TCR_EL1_IPS_SHIFT, #3 > msr tcr_el1, x1 > > /* MAIR */ > @@ -229,6 +236,33 @@ asm_mmu_enable: > > ret > > +asm_mmu_enable_nvhe: > + ic iallu > + tlbi alle2is > + dsb ish why is the IC local, but the TLBI broadcast? If this only needs ot be local, a DSB NSH will be sufficient. Thanks, Mark. _______________________________________________ kvmarm mailing list kvmarm@lists.cs.columbia.edu https://lists.cs.columbia.edu/mailman/listinfo/kvmarm
next prev parent reply index Thread overview: 34+ messages / expand[flat|nested] mbox.gz Atom feed top 2019-08-28 13:38 [kvm-unit-tests RFC PATCH 00/16] arm64: Run at EL2 Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 01/16] arm: selftest.c: Remove redundant check for Exception Level Alexandru Elisei 2019-08-28 14:32 ` Andrew Jones 2019-08-28 15:39 ` Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 02/16] arm/arm64: psci: Don't run C code without stack or vectors Alexandru Elisei 2019-08-28 14:45 ` Andrew Jones 2019-08-28 15:14 ` Alexandru Elisei 2019-09-02 14:55 ` Alexandru Elisei 2019-09-03 6:37 ` Andrew Jones 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 03/16] lib: arm/arm64: Add missing include for alloc_page.h in pgtable.h Alexandru Elisei 2019-08-28 14:47 ` Andrew Jones 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 04/16] arm/arm64: selftest: Add prefetch abort test Alexandru Elisei 2019-08-28 14:09 ` Mark Rutland 2019-08-29 8:18 ` Alexandru Elisei 2019-08-29 10:19 ` Mark Rutland 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 05/16] arm64: timer: Write to ICENABLER to disable timer IRQ Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 06/16] arm64: timer: EOIR the interrupt after masking the timer Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 07/16] arm64: timer: Test behavior when timer disabled or masked Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 08/16] lib: arm/arm64: Refuse to disable the MMU with non-identity stack pointer Alexandru Elisei 2019-08-28 14:55 ` Andrew Jones 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 09/16] lib: arm/arm64: Invalidate TLB before enabling MMU Alexandru Elisei 2019-08-28 14:59 ` Andrew Jones 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 10/16] lib: Add UL and ULL definitions to linux/const.h Alexandru Elisei 2019-08-28 15:10 ` Andrew Jones 2019-08-28 15:46 ` Alexandru Elisei 2019-08-28 16:19 ` Andrew Jones 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 11/16] lib: arm64: Run existing tests at EL2 Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 12/16] arm64: timer: Add test for EL2 timers Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 13/16] arm64: selftest: Add basic test for EL2 Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 14/16] lib: arm64: Add support for disabling and re-enabling VHE Alexandru Elisei 2019-08-28 14:19 ` Mark Rutland [this message] 2019-08-29 8:36 ` Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 15/16] arm64: selftest: Expand EL2 test to disable and re-enable VHE Alexandru Elisei 2019-08-28 13:38 ` [kvm-unit-tests RFC PATCH 16/16] arm64: timer: Run tests with VHE disabled Alexandru Elisei
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=20190828141927.GD41023@lakrids.cambridge.arm.com \ --to=mark.rutland@arm.com \ --cc=alexandru.elisei@arm.com \ --cc=andre.przywara@arm.com \ --cc=kvm@vger.kernel.org \ --cc=kvmarm@lists.cs.columbia.edu \ --cc=maz@kernel.org \ --cc=pbonzini@redhat.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
KVM ARM Archive on lore.kernel.org Archives are clonable: git clone --mirror https://lore.kernel.org/kvmarm/0 kvmarm/git/0.git # If you have public-inbox 1.1+ installed, you may # initialize and index your mirror using the following commands: public-inbox-init -V2 kvmarm kvmarm/ https://lore.kernel.org/kvmarm \ kvmarm@lists.cs.columbia.edu public-inbox-index kvmarm Example config snippet for mirrors Newsgroup available over NNTP: nntp://nntp.lore.kernel.org/edu.columbia.cs.lists.kvmarm AGPL code for this site: git clone https://public-inbox.org/public-inbox.git