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


Reply via email to