From: Jan Beulich <jbeulich@suse.com>
To: "xen-devel@lists.xenproject.org" <xen-devel@lists.xenproject.org>
Cc: "Andrew Cooper" <andrew.cooper3@citrix.com>,
"Wei Liu" <wl@xen.org>, "Roger Pau Monné" <roger.pau@citrix.com>,
"Tim Deegan" <tim@xen.org>,
"George Dunlap" <george.dunlap@citrix.com>
Subject: [PATCH 16/17] x86/shadow: only 4-level guest code needs building when !HVM
Date: Thu, 14 Jan 2021 16:10:58 +0100 [thread overview]
Message-ID: <29ca8b9d-2f87-7c9c-4144-07bd8fd457da@suse.com> (raw)
In-Reply-To: <4f1975a9-bdd9-f556-9db5-eb6c428f258f@suse.com>
In order to limit #ifdef-ary, provide "stub" #define-s for
SH_type_{l1,fl1,l2}_{32,pae}_shadow and SHF_{L1,FL1,L2}_{32,PAE}.
The change in shadow_vcpu_init() is necessary to cover for "x86: correct
is_pv_domain() when !CONFIG_PV" (or any other change along those lines)
- we should only rely on is_hvm_*() to become a build time constant.
Signed-off-by: Jan Beulich <jbeulich@suse.com>
--- a/xen/arch/x86/mm/Makefile
+++ b/xen/arch/x86/mm/Makefile
@@ -3,7 +3,7 @@ obj-$(CONFIG_HVM) += hap/
obj-$(CONFIG_HVM) += altp2m.o
obj-$(CONFIG_HVM) += guest_walk_2.o guest_walk_3.o guest_walk_4.o
-obj-$(CONFIG_SHADOW_PAGING) += guest_walk_2.o guest_walk_3.o guest_walk_4.o
+obj-$(CONFIG_SHADOW_PAGING) += guest_walk_4.o
obj-$(CONFIG_MEM_ACCESS) += mem_access.o
obj-y += mem_paging.o
obj-$(CONFIG_MEM_SHARING) += mem_sharing.o
--- a/xen/arch/x86/mm/shadow/Makefile
+++ b/xen/arch/x86/mm/shadow/Makefile
@@ -1,7 +1,7 @@
ifeq ($(CONFIG_SHADOW_PAGING),y)
-obj-y += common.o guest_2.o guest_3.o guest_4.o set.o
-obj-$(CONFIG_HVM) += hvm.o
-obj-$(CONFIG_PV) += pv.o
+obj-y += common.o set.o
+obj-$(CONFIG_HVM) += hvm.o guest_2.o guest_3.o guest_4.o
+obj-$(CONFIG_PV) += pv.o guest_4.o
else
obj-y += none.o
endif
--- a/xen/arch/x86/mm/shadow/common.c
+++ b/xen/arch/x86/mm/shadow/common.c
@@ -90,9 +90,9 @@ void shadow_vcpu_init(struct vcpu *v)
}
#endif
- v->arch.paging.mode = is_pv_vcpu(v) ?
- &SHADOW_INTERNAL_NAME(sh_paging_mode, 4) :
- &SHADOW_INTERNAL_NAME(sh_paging_mode, 3);
+ v->arch.paging.mode = is_hvm_vcpu(v) ?
+ &SHADOW_INTERNAL_NAME(sh_paging_mode, 3) :
+ &SHADOW_INTERNAL_NAME(sh_paging_mode, 4);
}
#if SHADOW_AUDIT
@@ -257,6 +257,7 @@ static int sh_remove_write_access_from_s
switch ( mfn_to_page(smfn)->u.sh.type )
{
+#ifdef CONFIG_HVM
case SH_type_l1_32_shadow:
case SH_type_fl1_32_shadow:
return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 2)
@@ -266,6 +267,7 @@ static int sh_remove_write_access_from_s
case SH_type_fl1_pae_shadow:
return SHADOW_INTERNAL_NAME(sh_rm_write_access_from_sl1p, 3)
(d, gmfn, smfn, off);
+#endif
case SH_type_l1_64_shadow:
case SH_type_fl1_64_shadow:
@@ -848,6 +850,7 @@ sh_validate_guest_entry(struct vcpu *v,
* the free pool.
*/
+#ifdef CONFIG_HVM
const u8 sh_type_to_size[] = {
1, /* SH_type_none */
2, /* SH_type_l1_32_shadow */
@@ -866,6 +869,7 @@ const u8 sh_type_to_size[] = {
1, /* SH_type_monitor_table */
1 /* SH_type_oos_snapshot */
};
+#endif
/*
* Figure out the least acceptable quantity of shadow memory.
@@ -892,12 +896,14 @@ void shadow_unhook_mappings(struct domai
struct page_info *sp = mfn_to_page(smfn);
switch ( sp->u.sh.type )
{
+#ifdef CONFIG_HVM
case SH_type_l2_32_shadow:
SHADOW_INTERNAL_NAME(sh_unhook_32b_mappings, 2)(d, smfn, user_only);
break;
case SH_type_l2_pae_shadow:
SHADOW_INTERNAL_NAME(sh_unhook_pae_mappings, 3)(d, smfn, user_only);
break;
+#endif
case SH_type_l4_64_shadow:
SHADOW_INTERNAL_NAME(sh_unhook_64b_mappings, 4)(d, smfn, user_only);
break;
@@ -1104,8 +1110,10 @@ mfn_t shadow_alloc(struct domain *d,
/* Backpointers that are MFNs need to be packed into PDXs (PFNs don't) */
switch (shadow_type)
{
+#ifdef CONFIG_HVM
case SH_type_fl1_32_shadow:
case SH_type_fl1_pae_shadow:
+#endif
case SH_type_fl1_64_shadow:
break;
default:
@@ -1739,6 +1747,7 @@ void sh_destroy_shadow(struct domain *d,
* small numbers that the compiler will enjoy */
switch ( t )
{
+#ifdef CONFIG_HVM
case SH_type_l1_32_shadow:
case SH_type_fl1_32_shadow:
SHADOW_INTERNAL_NAME(sh_destroy_l1_shadow, 2)(d, smfn);
@@ -1754,6 +1763,7 @@ void sh_destroy_shadow(struct domain *d,
case SH_type_l2_pae_shadow:
SHADOW_INTERNAL_NAME(sh_destroy_l2_shadow, 3)(d, smfn);
break;
+#endif
case SH_type_l1_64_shadow:
case SH_type_fl1_64_shadow:
@@ -1804,12 +1814,14 @@ int sh_remove_write_access(struct domain
/* Dispatch table for getting per-type functions */
static const hash_domain_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
+#ifdef CONFIG_HVM
SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 2), /* l1_32 */
SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 2), /* fl1_32 */
NULL, /* l2_32 */
SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 3), /* l1_pae */
SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 3), /* fl1_pae */
NULL, /* l2_pae */
+#endif
SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 4), /* l1_64 */
SHADOW_INTERNAL_NAME(sh_rm_write_access_from_l1, 4), /* fl1_64 */
NULL, /* l2_64 */
@@ -2026,12 +2038,14 @@ int sh_remove_all_mappings(struct domain
/* Dispatch table for getting per-type functions */
static const hash_domain_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
+#ifdef CONFIG_HVM
SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 2), /* l1_32 */
SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 2), /* fl1_32 */
NULL, /* l2_32 */
SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 3), /* l1_pae */
SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 3), /* fl1_pae */
NULL, /* l2_pae */
+#endif
SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 4), /* l1_64 */
SHADOW_INTERNAL_NAME(sh_rm_mappings_from_l1, 4), /* fl1_64 */
NULL, /* l2_64 */
@@ -2122,6 +2136,7 @@ static int sh_remove_shadow_via_pointer(
/* Blank the offending entry */
switch (sp->u.sh.type)
{
+#ifdef CONFIG_HVM
case SH_type_l1_32_shadow:
case SH_type_l2_32_shadow:
SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, 2)(d, vaddr, pmfn);
@@ -2130,6 +2145,7 @@ static int sh_remove_shadow_via_pointer(
case SH_type_l2_pae_shadow:
SHADOW_INTERNAL_NAME(sh_clear_shadow_entry, 3)(d, vaddr, pmfn);
break;
+#endif
case SH_type_l1_64_shadow:
case SH_type_l2_64_shadow:
case SH_type_l2h_64_shadow:
@@ -2166,12 +2182,14 @@ void sh_remove_shadows(struct domain *d,
* be called with the function to remove a lower-level shadow. */
static const hash_domain_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
+#ifdef CONFIG_HVM
NULL, /* l1_32 */
NULL, /* fl1_32 */
SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 2), /* l2_32 */
NULL, /* l1_pae */
NULL, /* fl1_pae */
SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 3), /* l2_pae */
+#endif
NULL, /* l1_64 */
NULL, /* fl1_64 */
SHADOW_INTERNAL_NAME(sh_remove_l1_shadow, 4), /* l2_64 */
@@ -2185,12 +2203,14 @@ void sh_remove_shadows(struct domain *d,
/* Another lookup table, for choosing which mask to use */
static const unsigned int masks[SH_type_unused] = {
0, /* none */
+#ifdef CONFIG_HVM
SHF_L2_32, /* l1_32 */
0, /* fl1_32 */
0, /* l2_32 */
SHF_L2_PAE, /* l1_pae */
0, /* fl1_pae */
0, /* l2_pae */
+#endif
SHF_L2H_64 | SHF_L2_64, /* l1_64 */
0, /* fl1_64 */
SHF_L3_64, /* l2_64 */
@@ -2326,12 +2346,14 @@ void sh_reset_l3_up_pointers(struct vcpu
{
static const hash_vcpu_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
+#ifdef CONFIG_HVM
NULL, /* l1_32 */
NULL, /* fl1_32 */
NULL, /* l2_32 */
NULL, /* l1_pae */
NULL, /* fl1_pae */
NULL, /* l2_pae */
+#endif
NULL, /* l1_64 */
NULL, /* fl1_64 */
NULL, /* l2_64 */
@@ -3349,12 +3371,14 @@ void shadow_audit_tables(struct vcpu *v)
static const hash_vcpu_callback_t callbacks[SH_type_unused] = {
NULL, /* none */
#if SHADOW_AUDIT & (SHADOW_AUDIT_ENTRIES | SHADOW_AUDIT_ENTRIES_FULL)
+# ifdef CONFIG_HVM
SHADOW_INTERNAL_NAME(sh_audit_l1_table, 2), /* l1_32 */
SHADOW_INTERNAL_NAME(sh_audit_fl1_table, 2), /* fl1_32 */
SHADOW_INTERNAL_NAME(sh_audit_l2_table, 2), /* l2_32 */
SHADOW_INTERNAL_NAME(sh_audit_l1_table, 3), /* l1_pae */
SHADOW_INTERNAL_NAME(sh_audit_fl1_table, 3), /* fl1_pae */
SHADOW_INTERNAL_NAME(sh_audit_l2_table, 3), /* l2_pae */
+# endif
SHADOW_INTERNAL_NAME(sh_audit_l1_table, 4), /* l1_64 */
SHADOW_INTERNAL_NAME(sh_audit_fl1_table, 4), /* fl1_64 */
SHADOW_INTERNAL_NAME(sh_audit_l2_table, 4), /* l2_64 */
--- a/xen/arch/x86/mm/shadow/private.h
+++ b/xen/arch/x86/mm/shadow/private.h
@@ -171,6 +171,7 @@ extern void shadow_audit_tables(struct v
/* Shadow type codes */
#define SH_type_none (0U) /* on the shadow free list */
#define SH_type_min_shadow (1U)
+#ifdef CONFIG_HVM
#define SH_type_l1_32_shadow (1U) /* shadowing a 32-bit L1 guest page */
#define SH_type_fl1_32_shadow (2U) /* L1 shadow for a 32b 4M superpage */
#define SH_type_l2_32_shadow (3U) /* shadowing a 32-bit L2 guest page */
@@ -188,6 +189,25 @@ extern void shadow_audit_tables(struct v
#define SH_type_monitor_table (14U) /* in use as a monitor table */
#define SH_type_oos_snapshot (15U) /* in use as OOS snapshot */
#define SH_type_unused (16U)
+#else
+#define SH_type_l1_32_shadow SH_type_unused
+#define SH_type_fl1_32_shadow SH_type_unused
+#define SH_type_l2_32_shadow SH_type_unused
+#define SH_type_l1_pae_shadow SH_type_unused
+#define SH_type_fl1_pae_shadow SH_type_unused
+#define SH_type_l2_pae_shadow SH_type_unused
+#define SH_type_l1_64_shadow 1U /* shadowing a 64-bit L1 page */
+#define SH_type_fl1_64_shadow 2U /* L1 shadow for 64-bit 2M superpg */
+#define SH_type_l2_64_shadow 3U /* shadowing a 64-bit L2 page */
+#define SH_type_l2h_64_shadow 4U /* shadowing a compat PAE L2 high page */
+#define SH_type_l3_64_shadow 5U /* shadowing a 64-bit L3 page */
+#define SH_type_l4_64_shadow 6U /* shadowing a 64-bit L4 page */
+#define SH_type_max_shadow 6U
+#define SH_type_p2m_table 7U /* in use as the p2m table */
+#define SH_type_monitor_table 8U /* in use as a monitor table */
+#define SH_type_oos_snapshot 9U /* in use as OOS snapshot */
+#define SH_type_unused 10U
+#endif
/*
* What counts as a pinnable shadow?
@@ -248,12 +268,21 @@ static inline void sh_terminate_list(str
(((1u << (SH_type_max_shadow + 1u)) - 1u) - \
((1u << SH_type_min_shadow) - 1u))
+#ifdef CONFIG_HVM
#define SHF_L1_32 (1u << SH_type_l1_32_shadow)
#define SHF_FL1_32 (1u << SH_type_fl1_32_shadow)
#define SHF_L2_32 (1u << SH_type_l2_32_shadow)
#define SHF_L1_PAE (1u << SH_type_l1_pae_shadow)
#define SHF_FL1_PAE (1u << SH_type_fl1_pae_shadow)
#define SHF_L2_PAE (1u << SH_type_l2_pae_shadow)
+#else
+#define SHF_L1_32 0
+#define SHF_FL1_32 0
+#define SHF_L2_32 0
+#define SHF_L1_PAE 0
+#define SHF_FL1_PAE 0
+#define SHF_L2_PAE 0
+#endif
#define SHF_L1_64 (1u << SH_type_l1_64_shadow)
#define SHF_FL1_64 (1u << SH_type_fl1_64_shadow)
#define SHF_L2_64 (1u << SH_type_l2_64_shadow)
@@ -329,8 +358,13 @@ extern const u8 sh_type_to_size[SH_type_
static inline unsigned int
shadow_size(unsigned int shadow_type)
{
+#ifdef CONFIG_HVM
ASSERT(shadow_type < ARRAY_SIZE(sh_type_to_size));
return sh_type_to_size[shadow_type];
+#else
+ ASSERT(shadow_type < SH_type_unused);
+ return 1;
+#endif
}
/******************************************************************************
@@ -488,8 +522,10 @@ static inline unsigned long __backpointe
{
switch (sp->u.sh.type)
{
+#ifdef CONFIG_HVM
case SH_type_fl1_32_shadow:
case SH_type_fl1_pae_shadow:
+#endif
case SH_type_fl1_64_shadow:
return sp->v.sh.back;
}
next prev parent reply other threads:[~2021-01-14 15:11 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2021-01-14 15:01 [PATCH 00/17] x86/PV: avoid speculation abuse through guest accessors plus Jan Beulich
2021-01-14 15:03 ` [PATCH 01/17] x86/shadow: use __put_user() instead of __copy_to_user() Jan Beulich
2021-01-14 15:04 ` [PATCH 02/17] x86: split __{get,put}_user() into "guest" and "unsafe" variants Jan Beulich
2021-02-05 15:43 ` Roger Pau Monné
2021-02-05 16:13 ` Jan Beulich
2021-02-05 16:18 ` Roger Pau Monné
2021-02-05 16:26 ` Jan Beulich
2021-02-09 13:07 ` Roger Pau Monné
2021-02-09 13:15 ` Jan Beulich
2021-02-09 14:46 ` Roger Pau Monné
2021-02-09 14:57 ` Jan Beulich
2021-02-09 15:23 ` Roger Pau Monné
2021-02-09 14:55 ` Roger Pau Monné
2021-02-09 15:14 ` Jan Beulich
2021-02-09 15:27 ` Roger Pau Monné
2021-01-14 15:04 ` [PATCH 03/17] x86: split __copy_{from,to}_user() " Jan Beulich
2021-02-09 16:06 ` Roger Pau Monné
2021-02-09 17:03 ` Jan Beulich
2021-01-14 15:04 ` [PATCH 04/17] x86/PV: harden guest memory accesses against speculative abuse Jan Beulich
2021-02-09 16:26 ` Roger Pau Monné
2021-02-10 16:55 ` Jan Beulich
2021-02-11 8:11 ` Roger Pau Monné
2021-02-11 11:28 ` Jan Beulich
2021-02-12 10:41 ` Roger Pau Monné
2021-02-12 12:48 ` Jan Beulich
2021-02-12 13:02 ` Roger Pau Monné
2021-02-12 13:15 ` Jan Beulich
2021-01-14 15:05 ` [PATCH 05/17] x86: rename {get,put}_user() to {get,put}_guest() Jan Beulich
2021-01-14 15:05 ` [PATCH 06/17] x86/gdbsx: convert "user" to "guest" accesses Jan Beulich
2021-01-14 15:06 ` [PATCH 07/17] x86: rename copy_{from,to}_user() to copy_{from,to}_guest_pv() Jan Beulich
2021-01-14 15:07 ` [PATCH 08/17] x86: move stac()/clac() from {get,put}_unsafe_asm() Jan Beulich
2021-01-14 15:07 ` [PATCH 09/17] x86/PV: use get_unsafe() instead of copy_from_unsafe() Jan Beulich
2021-01-14 15:08 ` [PATCH 10/17] x86/shadow: " Jan Beulich
2021-01-14 15:08 ` [PATCH 11/17] x86/shadow: polish shadow_write_entries() Jan Beulich
2021-01-14 15:09 ` [PATCH 12/17] x86/shadow: move shadow_set_l<N>e() to their own source file Jan Beulich
2021-01-14 15:09 ` [PATCH 13/17] x86/shadow: don't open-code SHF_* shorthands Jan Beulich
2021-01-14 15:10 ` [PATCH 14/17] x86/shadow: SH_type_l2h_shadow is PV-only Jan Beulich
2021-01-14 15:10 ` [PATCH 15/17] x86/shadow: drop SH_type_l2h_pae_shadow Jan Beulich
2021-01-22 13:11 ` Tim Deegan
2021-01-22 16:31 ` Jan Beulich
2021-01-22 20:02 ` Tim Deegan
2021-01-25 11:09 ` Jan Beulich
2021-01-25 11:33 ` Jan Beulich
2021-01-14 15:10 ` Jan Beulich [this message]
2021-01-14 15:11 ` [PATCH 17/17] x86/shadow: adjust is_pv_*() checks Jan Beulich
2021-01-22 13:18 ` [PATCH 00/17] x86/PV: avoid speculation abuse through guest accessors plus Tim Deegan
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=29ca8b9d-2f87-7c9c-4144-07bd8fd457da@suse.com \
--to=jbeulich@suse.com \
--cc=andrew.cooper3@citrix.com \
--cc=george.dunlap@citrix.com \
--cc=roger.pau@citrix.com \
--cc=tim@xen.org \
--cc=wl@xen.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 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.