From: Sergej Proskurin <proskurin@sec.in.tum.de>
To: xen-devel@lists.xenproject.org
Cc: Sergej Proskurin <proskurin@sec.in.tum.de>,
Julien Grall <julien.grall@arm.com>,
Stefano Stabellini <sstabellini@kernel.org>
Subject: [PATCH v5 03/12] arm/mem_access: Add defines supporting PTs with varying page sizes
Date: Tue, 27 Jun 2017 13:52:11 +0200 [thread overview]
Message-ID: <20170627115220.21066-4-proskurin@sec.in.tum.de> (raw)
In-Reply-To: <20170627115220.21066-1-proskurin@sec.in.tum.de>
The ARMv8 architecture supports pages with different (4K, 16K, and 64K) sizes.
To enable guest page table walks for various configurations, this commit
extends the defines and helpers of the current implementation.
Signed-off-by: Sergej Proskurin <proskurin@sec.in.tum.de>
---
Cc: Stefano Stabellini <sstabellini@kernel.org>
Cc: Julien Grall <julien.grall@arm.com>
---
v3: Eliminate redundant macro definitions by introducing generic macros.
v4: Replace existing macros with ones that generate static inline
helpers as to ease the readability of the code.
Move the introduced code into lpae.h
v5: Remove PAGE_SHIFT_* defines from lpae.h as we import them now from
the header xen/lib.h.
Remove *_guest_table_offset macros as to reduce the number of
exported macros which are only used once. Instead, use the
associated functionality directly within the
GUEST_TABLE_OFFSET_HELPERS.
Add comment in GUEST_TABLE_OFFSET_HELPERS stating that a page table
with 64K page size granularity does not have a zeroeth lookup level.
Add #undefs for GUEST_TABLE_OFFSET and GUEST_TABLE_OFFSET_HELPERS.
Remove CONFIG_ARM_64 #defines.
---
xen/include/asm-arm/lpae.h | 62 ++++++++++++++++++++++++++++++++++++++++++++++
1 file changed, 62 insertions(+)
diff --git a/xen/include/asm-arm/lpae.h b/xen/include/asm-arm/lpae.h
index 6fbf7c606c..2f7891ed0b 100644
--- a/xen/include/asm-arm/lpae.h
+++ b/xen/include/asm-arm/lpae.h
@@ -3,6 +3,8 @@
#ifndef __ASSEMBLY__
+#include <xen/lib.h>
+
/*
* WARNING! Unlike the x86 pagetable code, where l1 is the lowest level and
* l4 is the root of the trie, the ARM pagetables follow ARM's documentation:
@@ -151,6 +153,66 @@ static inline bool lpae_is_superpage(lpae_t pte, unsigned int level)
return (level < 3) && lpae_mapping(pte);
}
+/*
+ * The ARMv8 architecture supports pages with different sizes (4K, 16K, and
+ * 64K). To enable guest page table walks for various configurations, the
+ * following helpers enable walking the guest's translation table with varying
+ * page size granularities.
+ */
+
+#define LPAE_SHIFT_4K (9)
+#define LPAE_SHIFT_16K (11)
+#define LPAE_SHIFT_64K (13)
+
+#define lpae_entries(gran) (_AC(1,U) << LPAE_SHIFT_##gran)
+#define lpae_entry_mask(gran) (lpae_entries(gran) - 1)
+
+#define third_shift(gran) (PAGE_SHIFT_##gran)
+#define third_size(gran) ((paddr_t)1 << third_shift(gran))
+
+#define second_shift(gran) (third_shift(gran) + LPAE_SHIFT_##gran)
+#define second_size(gran) ((paddr_t)1 << second_shift(gran))
+
+#define first_shift(gran) (second_shift(gran) + LPAE_SHIFT_##gran)
+#define first_size(gran) ((paddr_t)1 << first_shift(gran))
+
+/* Note that there is no zeroeth lookup level with a 64K granule size. */
+#define zeroeth_shift(gran) (first_shift(gran) + LPAE_SHIFT_##gran)
+#define zeroeth_size(gran) ((paddr_t)1 << zeroeth_shift(gran))
+
+#define GUEST_TABLE_OFFSET(offs, gran) ((paddr_t)(offs) & lpae_entry_mask(gran))
+#define GUEST_TABLE_OFFSET_HELPERS(gran) \
+static inline vaddr_t third_guest_table_offset_##gran##K(vaddr_t gva) \
+{ \
+ return GUEST_TABLE_OFFSET((gva >> third_shift(gran##K)), gran##K); \
+} \
+ \
+static inline vaddr_t second_guest_table_offset_##gran##K(vaddr_t gva) \
+{ \
+ return GUEST_TABLE_OFFSET((gva >> second_shift(gran##K)), gran##K); \
+} \
+ \
+static inline vaddr_t first_guest_table_offset_##gran##K(vaddr_t gva) \
+{ \
+ return GUEST_TABLE_OFFSET(((paddr_t)gva >> first_shift(gran##K)), gran##K); \
+} \
+ \
+static inline vaddr_t zeroeth_guest_table_offset_##gran##K(vaddr_t gva) \
+{ \
+ /* Note that there is no zeroeth lookup level with a 64K granule size. */ \
+ if ( gran == 64 ) \
+ return 0; \
+ else \
+ return GUEST_TABLE_OFFSET(((paddr_t)gva >> zeroeth_shift(gran##K)), gran##K); \
+} \
+
+GUEST_TABLE_OFFSET_HELPERS(4);
+GUEST_TABLE_OFFSET_HELPERS(16);
+GUEST_TABLE_OFFSET_HELPERS(64);
+
+#undef GUEST_TABLE_OFFSET
+#undef GUEST_TABLE_OFFSET_HELPERS
+
#endif /* __ASSEMBLY__ */
/*
--
2.13.1
_______________________________________________
Xen-devel mailing list
Xen-devel@lists.xen.org
https://lists.xen.org/xen-devel
next prev parent reply other threads:[~2017-06-27 11:52 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-06-27 11:52 [PATCH v5 00/12] arm/mem_access: Walk guest page tables in SW if mem_access is active Sergej Proskurin
2017-06-27 11:52 ` [PATCH v5 01/12] arm/mem_access: Add and cleanup (TCR_|TTBCR_)* defines Sergej Proskurin
2017-07-04 16:04 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 02/12] arm/mem_access: Move PAGE_SHIFT_* macros to lib.h Sergej Proskurin
2017-06-27 12:04 ` Jan Beulich
2017-07-03 8:40 ` Sergej Proskurin
2017-07-03 9:03 ` Sergej Proskurin
2017-07-03 9:16 ` Jan Beulich
2017-07-03 13:07 ` Sergej Proskurin
2017-07-03 13:25 ` Jan Beulich
2017-07-03 9:13 ` Jan Beulich
2017-07-03 13:17 ` Sergej Proskurin
2017-07-03 13:27 ` Jan Beulich
2017-06-27 11:52 ` Sergej Proskurin [this message]
2017-07-04 16:15 ` [PATCH v5 03/12] arm/mem_access: Add defines supporting PTs with varying page sizes Julien Grall
2017-07-04 21:33 ` Sergej Proskurin
2017-07-05 11:41 ` Julien Grall
2017-07-05 11:48 ` Sergej Proskurin
2017-06-27 11:52 ` [PATCH v5 04/12] arm/lpae: Introduce lpae_page helper Sergej Proskurin
2017-07-04 16:23 ` Julien Grall
2017-07-05 13:11 ` Sergej Proskurin
2017-07-05 13:12 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 05/12] arm/mem_access: Add short-descriptor pte typedefs and macros Sergej Proskurin
2017-07-04 16:25 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 06/12] arm/mem_access: Introduce GV2M_EXEC permission Sergej Proskurin
2017-06-27 11:52 ` [PATCH v5 07/12] arm/mem_access: Introduce BIT_ULL bit operation Sergej Proskurin
2017-07-04 16:26 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 08/12] arm/mem_access: Introduce GENMASK_ULL " Sergej Proskurin
2017-07-04 16:28 ` Julien Grall
2017-07-04 20:46 ` Sergej Proskurin
2017-07-04 21:44 ` Sergej Proskurin
2017-07-05 12:39 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 09/12] arm/mem_access: Add software guest-page-table walk Sergej Proskurin
2017-07-04 16:58 ` Julien Grall
2017-07-04 20:25 ` Sergej Proskurin
2017-07-05 12:36 ` Julien Grall
2017-07-05 12:46 ` Sergej Proskurin
2017-06-27 11:52 ` [PATCH v5 10/12] arm/mem_access: Add long-descriptor based gpt Sergej Proskurin
2017-07-04 17:06 ` Julien Grall
2017-07-05 14:37 ` Sergej Proskurin
2017-07-05 14:47 ` Julien Grall
2017-07-06 11:18 ` Sergej Proskurin
2017-07-06 11:21 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 11/12] arm/mem_access: Add short-descriptor " Sergej Proskurin
2017-07-05 13:35 ` Julien Grall
2017-06-27 11:52 ` [PATCH v5 12/12] arm/mem_access: Walk the guest's pt in software Sergej Proskurin
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=20170627115220.21066-4-proskurin@sec.in.tum.de \
--to=proskurin@sec.in.tum.de \
--cc=julien.grall@arm.com \
--cc=sstabellini@kernel.org \
--cc=xen-devel@lists.xenproject.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 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).