All of lore.kernel.org
 help / color / mirror / Atom feed
From: joel.schopp@amd.com (Joel Schopp)
To: linux-arm-kernel@lists.infradead.org
Subject: [PATCH v4] arm64: fix VTTBR_BADDR_MASK
Date: Mon, 18 Aug 2014 15:30:58 -0500	[thread overview]
Message-ID: <53F26282.5010103@amd.com> (raw)
In-Reply-To: <20140812160521.GO10550@cbox>


 #endif /* __ARM_KVM_MMU_H__ */
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 16e7994..70f0f02 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -521,6 +521,7 @@ int create_hyp_io_mappings(void *from, void *to, phys_addr_t phys_addr)
  */
 int kvm_alloc_stage2_pgd(struct kvm *kvm)
 {
+	unsigned int s2_pgds, s2_pgd_order;
 	pgd_t *pgd;
 
 	if (kvm->arch.pgd != NULL) {
@@ -528,10 +529,18 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm)
 		return -EINVAL;
 	}
 
-	pgd = (pgd_t *)__get_free_pages(GFP_KERNEL, S2_PGD_ORDER);
+	s2_pgds = (1 << (kvm_get_phys_addr_shift() - PGDIR_SHIFT));
+	s2_pgd_order = get_order(s2_pgds * sizeof(pgd_t));
+
+	pgd = (pgd_t *)__get_free_pages(GFP_KERNEL, s2_pgd_order);
 	if (!pgd)
 		return -ENOMEM;
 
+	if ((unsigned long)pgd & ~vttbr_baddr_mask) {
+		kvm_err("Stage-2 pgd not correctly aligned: %p\n", pgd);
+		return -EFAULT;
+	}


There are two problems that I've found here.  The first problem is that
vttbr_baddr_mask isn't allocated yet@this point in the code.  The
second problem is that pgd is a virtual address, ie pgd ==
0xfffffe03bbb40000 while the vttbr masks off the high bits for a
physical address, ie vttbr_baddr_mask=0x00007ffffffe0000 .  Even
correcting for those issues I haven't been able to make this check work
properly.  I'll resend v5 the patch with all the other suggested changes.

WARNING: multiple messages have this Message-ID (diff)
From: Joel Schopp <joel.schopp@amd.com>
To: Christoffer Dall <christoffer.dall@linaro.org>
Cc: <kvmarm@lists.cs.columbia.edu>,
	<linux-arm-kernel@lists.infradead.org>, <kvm@vger.kernel.org>,
	<jungseoklee85@gmail.com>,
	Sungjinn Chung <sungjinn.chung@samsung.com>,
	Jungseok Lee <jays.lee@samsung.com>
Subject: Re: [PATCH v4] arm64: fix VTTBR_BADDR_MASK
Date: Mon, 18 Aug 2014 15:30:58 -0500	[thread overview]
Message-ID: <53F26282.5010103@amd.com> (raw)
In-Reply-To: <20140812160521.GO10550@cbox>


 #endif /* __ARM_KVM_MMU_H__ */
diff --git a/arch/arm/kvm/mmu.c b/arch/arm/kvm/mmu.c
index 16e7994..70f0f02 100644
--- a/arch/arm/kvm/mmu.c
+++ b/arch/arm/kvm/mmu.c
@@ -521,6 +521,7 @@ int create_hyp_io_mappings(void *from, void *to, phys_addr_t phys_addr)
  */
 int kvm_alloc_stage2_pgd(struct kvm *kvm)
 {
+	unsigned int s2_pgds, s2_pgd_order;
 	pgd_t *pgd;
 
 	if (kvm->arch.pgd != NULL) {
@@ -528,10 +529,18 @@ int kvm_alloc_stage2_pgd(struct kvm *kvm)
 		return -EINVAL;
 	}
 
-	pgd = (pgd_t *)__get_free_pages(GFP_KERNEL, S2_PGD_ORDER);
+	s2_pgds = (1 << (kvm_get_phys_addr_shift() - PGDIR_SHIFT));
+	s2_pgd_order = get_order(s2_pgds * sizeof(pgd_t));
+
+	pgd = (pgd_t *)__get_free_pages(GFP_KERNEL, s2_pgd_order);
 	if (!pgd)
 		return -ENOMEM;
 
+	if ((unsigned long)pgd & ~vttbr_baddr_mask) {
+		kvm_err("Stage-2 pgd not correctly aligned: %p\n", pgd);
+		return -EFAULT;
+	}


There are two problems that I've found here.  The first problem is that
vttbr_baddr_mask isn't allocated yet at this point in the code.  The
second problem is that pgd is a virtual address, ie pgd ==
0xfffffe03bbb40000 while the vttbr masks off the high bits for a
physical address, ie vttbr_baddr_mask=0x00007ffffffe0000 .  Even
correcting for those issues I haven't been able to make this check work
properly.  I'll resend v5 the patch with all the other suggested changes.


  parent reply	other threads:[~2014-08-18 20:30 UTC|newest]

Thread overview: 20+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2014-08-11 20:38 [PATCH v4] arm64: fix VTTBR_BADDR_MASK Joel Schopp
2014-08-11 20:38 ` Joel Schopp
2014-08-12 16:05 ` Christoffer Dall
2014-08-12 16:05   ` Christoffer Dall
2014-08-13 11:33   ` Christoffer Dall
2014-08-13 11:33     ` Christoffer Dall
2014-08-13 14:06     ` Jungseok Lee
2014-08-13 14:06       ` Jungseok Lee
2014-08-18 20:30   ` Joel Schopp [this message]
2014-08-18 20:30     ` Joel Schopp
2014-08-19 12:22     ` Christoffer Dall
2014-08-19 12:22       ` Christoffer Dall
2014-08-19 14:05       ` Joel Schopp
2014-08-19 14:05         ` Joel Schopp
2014-08-19 14:37         ` Christoffer Dall
2014-08-19 14:37           ` Christoffer Dall
2014-08-19 14:53           ` Joel Schopp
2014-08-19 14:53             ` Joel Schopp
2014-08-19 15:14             ` Christoffer Dall
2014-08-19 15:14               ` Christoffer Dall

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=53F26282.5010103@amd.com \
    --to=joel.schopp@amd.com \
    --cc=linux-arm-kernel@lists.infradead.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.