public inbox for kvmarm@lists.cs.columbia.edu
 help / color / mirror / Atom feed
From: Marc Zyngier <marc.zyngier@arm.com>
To: Steve Capper <steve.capper@arm.com>
Cc: kvm@vger.kernel.org, Catalin Marinas <catalin.marinas@arm.com>,
	Will Deacon <will.deacon@arm.com>,
	linux-arm-kernel@lists.infradead.org, nd@arm.com,
	kvmarm@lists.cs.columbia.edu
Subject: Re: [PATCH v3 14/19] KVM: arm/arm64: Move HYP IO VAs to the "idmap" range
Date: Tue, 26 Dec 2017 11:03:14 +0000	[thread overview]
Message-ID: <86h8sdrbt9.wl-marc.zyngier@arm.com> (raw)
In-Reply-To: <20171220131624.xvewngmlrv5niwzb@capper-debian.cambridge.arm.com>

Hi Steve,

On Wed, 20 Dec 2017 13:16:24 +0000,
Steve Capper wrote:
> 
> Hi Marc,
> 
> On Mon, Dec 18, 2017 at 05:39:21PM +0000, Marc Zyngier wrote:
> > We so far mapped our HYP IO (which is essencially the GICv2 control
> > registers) using the same method as for memory. It recently appeared
> > that is a bit unsafe:
> > 
> > we compute the HYP VA using the kern_hyp_va helper, but that helper
> > is only designed to deal with kernel VAs coming from the linear map,
> > and not from the vmalloc region... This could in turn cause some bad
> > aliasing between the two, amplified by the new VA randomisation.
> > 
> > A solution is to come up with our very own basic VA allocator for
> > MMIO. Since half of the HYP address space only contains a single
> > page (the idmap), we have plenty to borrow from. Let's use the idmap
> > as a base, and allocate downwards from it. GICv2 now lives on the
> > other side of the great VA barrier.
> > 
> > Signed-off-by: Marc Zyngier <marc.zyngier@arm.com>
> > ---
> >  virt/kvm/arm/mmu.c | 40 ++++++++++++++++++++++++++++------------
> >  1 file changed, 28 insertions(+), 12 deletions(-)
> > 
> > diff --git a/virt/kvm/arm/mmu.c b/virt/kvm/arm/mmu.c
> > index 6192d45d1e1a..0597c9846f1a 100644
> > --- a/virt/kvm/arm/mmu.c
> > +++ b/virt/kvm/arm/mmu.c
> 
> [...]
> 
> > @@ -721,7 +728,8 @@ int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size,
> >  			   void __iomem **kaddr,
> >  			   void __iomem **haddr)
> >  {
> > -	unsigned long start, end;
> > +	pgd_t *pgd = hyp_pgd;
> > +	unsigned long base;
> >  	int ret;
> >  
> >  	*kaddr = ioremap(phys_addr, size);
> > @@ -733,19 +741,26 @@ int create_hyp_io_mappings(phys_addr_t phys_addr, size_t size,
> >  		return 0;
> >  	}
> >  
> > +	mutex_lock(&io_map_lock);
> > +
> > +	base = io_map_base - size;
> > +	base &= ~(size - 1);
> > +
> 
> Is it worth checking to see if we have "escaped" from our half of the
> HYP region?
> 
> So something like?
> 
> if (base ^ io_map_base & BIT(VA_BITS - 1))
>     allocationFailed...

Ah, cool trick. It took me a minute to grasp it (I blame the
turkey...), but that's definitely neat and a nice sanity check.

I'll add that to v4.

Thanks,

	M.

  reply	other threads:[~2017-12-26 10:59 UTC|newest]

Thread overview: 24+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2017-12-18 17:39 [PATCH v3 00/19] KVM/arm64: Randomise EL2 mappings Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 01/19] arm64: asm-offsets: Avoid clashing DMA definitions Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 02/19] arm64: asm-offsets: Remove unused definitions Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 03/19] arm64: asm-offsets: Remove potential circular dependency Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 04/19] arm64: alternatives: Enforce alignment of struct alt_instr Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 05/19] arm64: alternatives: Add dynamic patching feature Marc Zyngier
2017-12-19 13:04   ` Steve Capper
2017-12-19 13:32     ` Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 06/19] arm64: insn: Add N immediate encoding Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 07/19] arm64: insn: Add encoder for bitwise operations using literals Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 08/19] arm64: KVM: Dynamically patch the kernel/hyp VA mask Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 09/19] arm64: cpufeatures: Drop the ARM64_HYP_OFFSET_LOW feature flag Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 10/19] KVM: arm/arm64: Do not use kern_hyp_va() with kvm_vgic_global_state Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 11/19] KVM: arm/arm64: Demote HYP VA range display to being a debug feature Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 12/19] KVM: arm/arm64: Move ioremap calls to create_hyp_io_mappings Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 13/19] KVM: arm/arm64: Keep GICv2 HYP VAs in kvm_vgic_global_state Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 14/19] KVM: arm/arm64: Move HYP IO VAs to the "idmap" range Marc Zyngier
2017-12-20 13:16   ` Steve Capper
2017-12-26 11:03     ` Marc Zyngier [this message]
2017-12-18 17:39 ` [PATCH v3 15/19] arm64; insn: Add encoder for the EXTR instruction Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 16/19] arm64: insn: Allow ADD/SUB (immediate) with LSL #12 Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 17/19] arm64: KVM: Dynamically compute the HYP VA mask Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 18/19] arm64: KVM: Introduce EL2 VA randomisation Marc Zyngier
2017-12-18 17:39 ` [PATCH v3 19/19] arm64: Update the KVM memory map documentation 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=86h8sdrbt9.wl-marc.zyngier@arm.com \
    --to=marc.zyngier@arm.com \
    --cc=catalin.marinas@arm.com \
    --cc=kvm@vger.kernel.org \
    --cc=kvmarm@lists.cs.columbia.edu \
    --cc=linux-arm-kernel@lists.infradead.org \
    --cc=nd@arm.com \
    --cc=steve.capper@arm.com \
    --cc=will.deacon@arm.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