On 05/04/17 16:03, Wei Liu wrote:
On Wed, Apr 05, 2017 at 03:58:05PM +0100, Julien Grall wrote:
Hi Razvan,
On 05/04/17 15:53, Razvan Cojocaru wrote:
Currently xc_translate_foreign_address() only checks for the PSE bit on
level 2 entries (that's 2 MB pages on x64 and 32-bit with PAE, and 4 MB
pages on 32-bit). But the Linux kernel sometimes uses 1 GB pages. This
patch fixes that, by checking the PSE bit on level 3 entries if the guest
has 4 translation levels (that means 64-bit guests only).
Signed-off-by: Cristian-Bogdan Sirb <cs...@bitdefender.com>
He is the author of the patch, correct? If so, he should be the author as
well (e.g From: ...).
Also, you may want to add your signed-off-by here.
Julien, if you agree to let this patch go in 4.9. I can fix those up.
Release-acked-by: Julien Grall <julien.gr...@arm.com>
Cheers,
Razvan, please tell me what you want me to do.
Code-wise:
Acked-by: Wei Liu <wei.l...@citrix.com>
Cheers,
---
Changes since V1:
- Added header comment.
---
tools/libxc/include/xenctrl.h | 3 +++
tools/libxc/xc_pagetab.c | 2 +-
2 files changed, 4 insertions(+), 1 deletion(-)
diff --git a/tools/libxc/include/xenctrl.h b/tools/libxc/include/xenctrl.h
index 2d97d36..ca4bb6c 100644
--- a/tools/libxc/include/xenctrl.h
+++ b/tools/libxc/include/xenctrl.h
@@ -1460,6 +1460,9 @@ int xc_lockprof_query(xc_interface *xch,
void *xc_memalign(xc_interface *xch, size_t alignment, size_t size);
/**
+ * Avoid using this function, as it does not work for all cases (such
+ * as 4M superpages, or guests using PSE36). Only used for debugging.
+ *
* Translates a virtual address in the context of a given domain and
* vcpu returning the GFN containing the address (that is, an MFN for
* PV guests, a PFN for HVM guests). Returns 0 for failure.
diff --git a/tools/libxc/xc_pagetab.c b/tools/libxc/xc_pagetab.c
index 92eebd6..db25c20 100644
--- a/tools/libxc/xc_pagetab.c
+++ b/tools/libxc/xc_pagetab.c
@@ -93,7 +93,7 @@ unsigned long xc_translate_foreign_address(xc_interface *xch,
uint32_t dom,
return 0;
}
paddr = pte & 0x000ffffffffff000ull;
- if (level == 2 && (pte & PTE_PSE)) {
+ if ((level == 2 || (level == 3 && pt_levels == 4)) && (pte & PTE_PSE))
{
mask = ((mask ^ ~-mask) >> 1); /* All bits below first set bit */
return ((paddr & ~mask) | (virt & mask)) >> PAGE_SHIFT;
}
--
Julien Grall
--
Julien Grall
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel