Makes hap_enabled() a compile-time constant. This removes a number of hooks that normally go reach onto shadow paging code, clears many branches in a number of places and generally improves codegen throughout.
Take the chance to fully remove the shadow/ folder as it's now fully compiled out. Signed-off-by: Alejandro Vallejo <[email protected]> --- bloat-o-meter against prior commit (defconfig:-pv,-shadow on both): add/remove: 0/12 grow/shrink: 2/31 up/down: 67/-1609 (-1542) Function old new delta unmap_mmio_regions 1340 1374 +34 map_mmio_regions 211 244 +33 opt_hap_enabled 1 - -1 shadow_vcpu_init 2 - -2 __setup_str_opt_hap_enabled 4 - -4 _update_paging_modes 6 - -6 _toggle_log_dirty 6 - -6 _clean_dirty_bitmap 6 - -6 cpuid_viridian_leaves 728 714 -14 iommu_domain_init 291 276 -15 p2m_pt_change_entry_type_global 214 198 -16 paging_teardown 91 74 -17 paging_set_allocation 384 367 -17 paging_enable 76 59 -17 p2m_init_one 295 278 -17 ept_sync_domain 201 184 -17 arch_set_paging_mempool_size 437 420 -17 p2m_free_one 78 59 -19 paging_vcpu_teardown 36 15 -21 p2m_pt_init 125 104 -21 p2m_pt_change_entry_type_range 218 197 -21 arch_do_physinfo 76 53 -23 sh_none_ops 24 - -24 paging_final_teardown 134 110 -24 __setup_opt_hap_enabled 24 - -24 paging_vcpu_init 41 15 -26 paging_domain_init 167 141 -26 p2m_mem_access_sanity_check 71 42 -29 hvm_enable 449 419 -30 init_guest_cpu_policies 1247 1213 -34 paging_domctl 3357 3318 -39 __start_xen 9456 9416 -40 arch_sanitise_domain_config 794 747 -47 symbols_offsets 29636 29588 -48 p2m_set_entry 305 247 -58 guest_cpuid 1919 1858 -61 ept_dump_p2m_table 817 751 -66 recalculate_cpuid_policy 874 806 -68 shadow_domain_init 71 - -71 mmio_order 73 - -73 hvm_shadow_max_featuremask 76 - -76 hvm_shadow_def_featuremask 76 - -76 dm_op 3594 3510 -84 symbols_sorted_offsets 58464 58368 -96 symbols_names 103425 103213 -212 Total: Before=3644618, After=3643076, chg -0.04% --- xen/arch/x86/Kconfig | 2 ++ xen/arch/x86/hvm/Kconfig | 3 +++ xen/arch/x86/hvm/hvm.c | 8 ++++++++ xen/arch/x86/include/asm/hvm/hvm.h | 2 +- xen/arch/x86/mm/Makefile | 2 +- xen/include/xen/sched.h | 3 +++ 6 files changed, 18 insertions(+), 2 deletions(-) diff --git a/xen/arch/x86/Kconfig b/xen/arch/x86/Kconfig index 2ce4747f6e..190f419720 100644 --- a/xen/arch/x86/Kconfig +++ b/xen/arch/x86/Kconfig @@ -67,6 +67,7 @@ source "arch/Kconfig" config PV def_bool y prompt "PV support" + select OPT_HAP help Interfaces to support PV domains. These require guest kernel support to run as a PV guest, but don't require any specific hardware support. @@ -147,6 +148,7 @@ config SHADOW_PAGING bool "Shadow Paging" default !PV_SHIM_EXCLUSIVE depends on PV || HVM + select OPT_HAP help Shadow paging is a software alternative to hardware paging support (Intel EPT, AMD NPT). diff --git a/xen/arch/x86/hvm/Kconfig b/xen/arch/x86/hvm/Kconfig index f32bf5cbb7..310e09847b 100644 --- a/xen/arch/x86/hvm/Kconfig +++ b/xen/arch/x86/hvm/Kconfig @@ -92,4 +92,7 @@ config MEM_SHARING bool "Xen memory sharing support (UNSUPPORTED)" if UNSUPPORTED depends on INTEL_VMX +config OPT_HAP + bool + endif diff --git a/xen/arch/x86/hvm/hvm.c b/xen/arch/x86/hvm/hvm.c index da56944e74..ce58632b02 100644 --- a/xen/arch/x86/hvm/hvm.c +++ b/xen/arch/x86/hvm/hvm.c @@ -91,9 +91,11 @@ struct hvm_function_table __ro_after_init hvm_funcs; unsigned long __section(".bss.page_aligned") __aligned(PAGE_SIZE) hvm_io_bitmap[HVM_IOBITMAP_SIZE / BYTES_PER_LONG]; +#ifdef CONFIG_OPT_HAP /* Xen command-line option to enable HAP */ static bool __initdata opt_hap_enabled = true; boolean_param("hap", opt_hap_enabled); +#endif /* CONFIG_OPT_HAP */ #ifndef opt_hvm_fep /* Permit use of the Forced Emulation Prefix in HVM guests */ @@ -144,15 +146,21 @@ static bool __init hap_supported(struct hvm_function_table *fns) if ( !fns->caps.hap ) { printk("HVM: Hardware Assisted Paging (HAP) not detected\n"); + + if ( !IS_ENABLED(CONFIG_OPT_HAP) ) + panic("HAP is compile-time mandatory\n"); + return false; } +#ifdef CONFIG_OPT_HAP if ( !opt_hap_enabled ) { fns->caps.hap = false; printk("HVM: Hardware Assisted Paging (HAP) detected but disabled\n"); return false; } +#endif /* CONFIG_OPT_HAP */ return true; } diff --git a/xen/arch/x86/include/asm/hvm/hvm.h b/xen/arch/x86/include/asm/hvm/hvm.h index dc609bf4cb..b330d65d6d 100644 --- a/xen/arch/x86/include/asm/hvm/hvm.h +++ b/xen/arch/x86/include/asm/hvm/hvm.h @@ -703,7 +703,7 @@ static inline bool hvm_is_singlestep_supported(void) static inline bool hvm_hap_supported(void) { - return hvm_funcs.caps.hap; + return !IS_ENABLED(CONFIG_OPT_HAP) ?: hvm_funcs.caps.hap; } /* returns true if hardware supports alternate p2m's */ diff --git a/xen/arch/x86/mm/Makefile b/xen/arch/x86/mm/Makefile index 960f6e8409..64fde82c50 100644 --- a/xen/arch/x86/mm/Makefile +++ b/xen/arch/x86/mm/Makefile @@ -1,4 +1,4 @@ -obj-y += shadow/ +obj-$(CONFIG_OPT_HAP) += shadow/ obj-$(CONFIG_HVM) += hap/ obj-$(CONFIG_ALTP2M) += altp2m.o diff --git a/xen/include/xen/sched.h b/xen/include/xen/sched.h index 1268632344..0e317504f7 100644 --- a/xen/include/xen/sched.h +++ b/xen/include/xen/sched.h @@ -1220,6 +1220,9 @@ static always_inline bool is_hvm_vcpu(const struct vcpu *v) static always_inline bool hap_enabled(const struct domain *d) { + if ( !IS_ENABLED(CONFIG_OPT_HAP) ) + return true; + /* sanitise_domain_config() rejects HAP && !HVM */ return IS_ENABLED(CONFIG_HVM) && evaluate_nospec(d->options & XEN_DOMCTL_CDF_hap); -- 2.43.0
