From d66bf122c0ab79063a607d6cf68edf5e91d17d5e Mon Sep 17 00:00:00 2001 From: Stefano Stabellini Date: Fri, 12 Mar 2021 15:16:32 -0800 Subject: [PATCH] xen: introduce XENFEAT_direct_mapped and XENFEAT_not_direct_mapped Introduce two feature flags to tell the domain whether it is direct-mapped or not. It allows the guest kernel to make informed decisions on things such as swiotlb-xen enablement. The introduction of both flags (XENFEAT_direct_mapped and XENFEAT_not_direct_mapped) allows the guest kernel to avoid any guesswork if one of the two is present, or fallback to the current checks if neither of them is present. XENFEAT_direct_mapped is always set for not auto-translated guests. For auto-translated guests, only Dom0 on ARM is direct-mapped. Also, see is_domain_direct_mapped() which refers to auto-translated guests: xen/include/asm-arm/domain.h:is_domain_direct_mapped xen/include/asm-x86/domain.h:is_domain_direct_mapped Signed-off-by: Stefano Stabellini Reviewed-by: Julien Grall Reviewed-by: Jan Beulich CC: jbeulich@suse.com CC: andrew.cooper3@citrix.com CC: julien@xen.org --- xen/common/kernel.c | 4 ++++ xen/include/public/features.h | 14 ++++++++++++++ 2 files changed, 18 insertions(+) diff --git a/xen/common/kernel.c b/xen/common/kernel.c index 7a345ae45e..d77756a81e 100644 --- a/xen/common/kernel.c +++ b/xen/common/kernel.c @@ -560,6 +560,10 @@ DO(xen_version)(int cmd, XEN_GUEST_HANDLE_PARAM(void) arg) (1U << XENFEAT_hvm_callback_vector) | (has_pirq(d) ? (1U << XENFEAT_hvm_pirqs) : 0); #endif + if ( !paging_mode_translate(d) || is_domain_direct_mapped(d) ) + fi.submap |= (1U << XENFEAT_direct_mapped); + else + fi.submap |= (1U << XENFEAT_not_direct_mapped); break; default: return -EINVAL; diff --git a/xen/include/public/features.h b/xen/include/public/features.h index 1613b2aab8..9ee2f760ef 100644 --- a/xen/include/public/features.h +++ b/xen/include/public/features.h @@ -114,6 +114,20 @@ */ #define XENFEAT_linux_rsdp_unrestricted 15 +/* + * A direct-mapped (or 1:1 mapped) domain is a domain for which its + * local pages have gfn == mfn. If a domain is direct-mapped, + * XENFEAT_direct_mapped is set; otherwise XENFEAT_not_direct_mapped + * is set. + * + * If neither flag is set (e.g. older Xen releases) the assumptions are: + * - not auto_translated domains (x86 only) are always direct-mapped + * - on x86, auto_translated domains are not direct-mapped + * - on ARM, Dom0 is direct-mapped, DomUs are not + */ +#define XENFEAT_not_direct_mapped 16 +#define XENFEAT_direct_mapped 17 + #define XENFEAT_NR_SUBMAPS 1 #endif /* __XEN_PUBLIC_FEATURES_H__ */ -- 2.39.5