From: Juergen Gross Date: Fri, 22 May 2026 15:21:12 +0000 (+0200) Subject: x86/xen: Guard PV-only stuff in xen-ops.h with CONFIG_XEN_PV X-Git-Url: http://git.ipfire.org/gitweb/?a=commitdiff_plain;h=41e5f312aec83657ce651c0bf0dd3e2e4879717a;p=thirdparty%2Fkernel%2Flinux.git x86/xen: Guard PV-only stuff in xen-ops.h with CONFIG_XEN_PV A lot of arch/x86/xen/xen-ops.h is meant to be for PV only. Guard all of it with CONFIG_XEN_PV in order to avoid someone misusing it in non-PV builds. Additionally any 64-bit tests for now guarded items can be dropped. Move the enum pt_level definition to mmu_pv.c, as it is used only there. Signed-off-by: Juergen Gross Message-ID: <20260522152114.77319-2-jgross@suse.com> --- diff --git a/arch/x86/xen/mmu_pv.c b/arch/x86/xen/mmu_pv.c index 3eee5f84f8a7..cd80406be9c6 100644 --- a/arch/x86/xen/mmu_pv.c +++ b/arch/x86/xen/mmu_pv.c @@ -84,6 +84,14 @@ #include "xen-ops.h" +enum pt_level { + PT_PGD, + PT_P4D, + PT_PUD, + PT_PMD, + PT_PTE +}; + /* * Prototypes for functions called via PV_CALLEE_SAVE_REGS_THUNK() in order * to avoid warnings with "-Wmissing-prototypes". diff --git a/arch/x86/xen/xen-ops.h b/arch/x86/xen/xen-ops.h index f6c331b20fad..a27ab1f50cf9 100644 --- a/arch/x86/xen/xen-ops.h +++ b/arch/x86/xen/xen-ops.h @@ -12,28 +12,24 @@ #include +#ifdef CONFIG_XEN_PV + #include /* These are code, but not functions. Defined in entry.S */ extern const char xen_failsafe_callback[]; -void xen_entry_SYSENTER_compat(void); -#ifdef CONFIG_X86_64 -void xen_entry_SYSCALL_64(void); -void xen_entry_SYSCALL_compat(void); -#endif +DECLARE_PER_CPU(unsigned long, xen_cr3); extern void *xen_initial_gdt; +extern cpumask_var_t xen_cpu_initialized_map; struct trap_info; void xen_copy_trap_info(struct trap_info *traps); -DECLARE_PER_CPU_ALIGNED(struct vcpu_info, xen_vcpu_info); -DECLARE_PER_CPU(unsigned long, xen_cr3); - -extern struct start_info *xen_start_info; -extern struct shared_info xen_dummy_shared_info; -extern struct shared_info *HYPERVISOR_shared_info; +void xen_entry_SYSENTER_compat(void); +void xen_entry_SYSCALL_64(void); +void xen_entry_SYSCALL_compat(void); void xen_setup_mfn_list_list(void); void xen_build_mfn_list_list(void); @@ -44,13 +40,10 @@ void __init xen_pt_check_e820(void); void xen_mm_pin_all(void); void xen_mm_unpin_all(void); -#ifdef CONFIG_X86_64 void __init xen_relocate_p2m(void); -#endif void __init xen_do_remap_nonram(void); void __init xen_add_remap_nonram(phys_addr_t maddr, phys_addr_t paddr, unsigned long size); - void __init xen_chk_is_e820_usable(phys_addr_t start, phys_addr_t size, const char *component); unsigned long __ref xen_chk_extra_mem(unsigned long pfn); @@ -59,17 +52,119 @@ void __init xen_remap_memory(void); phys_addr_t __init xen_find_free_area(phys_addr_t size); char * __init xen_memory_setup(void); void __init xen_arch_setup(void); -void xen_banner(void); void xen_enable_syscall(void); -void xen_vcpu_restore(void); +void __init xen_build_dynamic_phys_to_machine(void); +void __init xen_vmalloc_p2m_tree(void); +void xen_init_irq_ops(void); +void xen_setup_vcpu_info_placement(void); +void __init xen_init_apic(void); + +__visible void xen_irq_enable_direct(void); +__visible void xen_irq_disable_direct(void); +__visible unsigned long xen_save_fl_direct(void); + +__visible unsigned long xen_read_cr2(void); +__visible unsigned long xen_read_cr2_direct(void); + +/* These are not functions, and cannot be called normally */ +__visible void xen_iret(void); + +void xen_force_evtchn_callback(void); + +void xen_pv_pre_suspend(void); +void xen_pv_post_suspend(int suspend_cancelled); +void xen_start_kernel(struct start_info *si); + +void set_pte_mfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); +void xen_init_mmu_ops(void); + +/* Multicalls */ +struct multicall_space +{ + struct multicall_entry *mc; + void *args; +}; + +/* Allocate room for a multicall and its args */ +struct multicall_space __xen_mc_entry(size_t args); + +DECLARE_PER_CPU(unsigned long, xen_mc_irq_flags); + +/* Call to start a batch of multiple __xen_mc_entry()s. Must be + paired with xen_mc_issue() */ +static inline void xen_mc_batch(void) +{ + unsigned long flags; + + /* need to disable interrupts until this entry is complete */ + local_irq_save(flags); + trace_xen_mc_batch(xen_get_lazy_mode()); + __this_cpu_write(xen_mc_irq_flags, flags); +} + +static inline struct multicall_space xen_mc_entry(size_t args) +{ + xen_mc_batch(); + return __xen_mc_entry(args); +} + +/* Flush all pending multicalls */ +void xen_mc_flush(void); + +/* Issue a multicall if we're not in a lazy mode */ +static inline void xen_mc_issue(unsigned mode) +{ + trace_xen_mc_issue(mode); + + if ((xen_get_lazy_mode() & mode) == 0) + xen_mc_flush(); + + /* restore flags saved in xen_mc_batch */ + local_irq_restore(this_cpu_read(xen_mc_irq_flags)); +} + +/* Set up a callback to be called when the current batch is flushed */ +void xen_mc_callback(void (*fn)(void *), void *data); + +/* + * Try to extend the arguments of the previous multicall command. The + * previous command's op must match. If it does, then it attempts to + * extend the argument space allocated to the multicall entry by + * arg_size bytes. + * + * The returned multicall_space will return with mc pointing to the + * command on success, or NULL on failure, and args pointing to the + * newly allocated space. + */ +struct multicall_space xen_mc_extend_args(unsigned long op, size_t arg_size); + +extern bool is_xen_pmu; + +irqreturn_t xen_pmu_irq_handler(int irq, void *dev_id); +bool pmu_msr_chk_emulated(u32 msr, u64 *val, bool is_read); +int pmu_apic_update(uint32_t reg); +u64 xen_read_pmc(int counter); + +void xen_hypercall_pv(void); + +#else + +static inline void xen_pv_pre_suspend(void) {} +static inline void xen_pv_post_suspend(int suspend_cancelled) {} +#endif /* CONFIG_XEN_PV */ + +DECLARE_PER_CPU_ALIGNED(struct vcpu_info, xen_vcpu_info); + +extern struct start_info *xen_start_info; +extern struct shared_info xen_dummy_shared_info; +extern struct shared_info *HYPERVISOR_shared_info; + +void xen_banner(void); +void xen_vcpu_restore(void); void xen_hvm_init_shared_info(void); void xen_unplug_emulated_devices(void); -void __init xen_build_dynamic_phys_to_machine(void); -void __init xen_vmalloc_p2m_tree(void); - -void xen_init_irq_ops(void); void xen_setup_timer(int cpu); void xen_setup_runstate_info(int cpu); void xen_teardown_timer(int cpu); @@ -83,13 +178,10 @@ bool xen_vcpu_stolen(int vcpu); void xen_vcpu_setup(int cpu); void xen_vcpu_info_reset(int cpu); -void xen_setup_vcpu_info_placement(void); #ifdef CONFIG_SMP void xen_smp_init(void); void __init xen_hvm_smp_init(void); - -extern cpumask_var_t xen_cpu_initialized_map; #else static inline void xen_smp_init(void) {} static inline void xen_hvm_smp_init(void) {} @@ -125,8 +217,6 @@ static inline void __init xen_init_vga(const struct dom0_vga_console_info *info, void xen_add_preferred_consoles(void); -void __init xen_init_apic(void); - #ifdef CONFIG_XEN_EFI extern void xen_efi_init(struct boot_params *boot_params); #else @@ -135,16 +225,6 @@ static inline void __init xen_efi_init(struct boot_params *boot_params) } #endif -__visible void xen_irq_enable_direct(void); -__visible void xen_irq_disable_direct(void); -__visible unsigned long xen_save_fl_direct(void); - -__visible unsigned long xen_read_cr2(void); -__visible unsigned long xen_read_cr2_direct(void); - -/* These are not functions, and cannot be called normally */ -__visible void xen_iret(void); - extern int xen_panic_handler_init(void); int xen_cpuhp_setup(int (*cpu_up_prepare_cb)(unsigned int), @@ -153,16 +233,6 @@ int xen_cpuhp_setup(int (*cpu_up_prepare_cb)(unsigned int), void xen_pin_vcpu(int cpu); void xen_emergency_restart(void); -void xen_force_evtchn_callback(void); - -#ifdef CONFIG_XEN_PV -void xen_pv_pre_suspend(void); -void xen_pv_post_suspend(int suspend_cancelled); -void xen_start_kernel(struct start_info *si); -#else -static inline void xen_pv_pre_suspend(void) {} -static inline void xen_pv_post_suspend(int suspend_cancelled) {} -#endif #ifdef CONFIG_XEN_PVHVM void xen_hvm_post_suspend(int suspend_cancelled); @@ -186,83 +256,9 @@ void xen_add_extra_mem(unsigned long start_pfn, unsigned long n_pfns); struct dentry * __init xen_init_debugfs(void); -enum pt_level { - PT_PGD, - PT_P4D, - PT_PUD, - PT_PMD, - PT_PTE -}; - bool __set_phys_to_machine(unsigned long pfn, unsigned long mfn); -void set_pte_mfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); -unsigned long xen_read_cr2_direct(void); -void xen_init_mmu_ops(void); void xen_hvm_init_mmu_ops(void); -/* Multicalls */ -struct multicall_space -{ - struct multicall_entry *mc; - void *args; -}; - -/* Allocate room for a multicall and its args */ -struct multicall_space __xen_mc_entry(size_t args); - -DECLARE_PER_CPU(unsigned long, xen_mc_irq_flags); - -/* Call to start a batch of multiple __xen_mc_entry()s. Must be - paired with xen_mc_issue() */ -static inline void xen_mc_batch(void) -{ - unsigned long flags; - - /* need to disable interrupts until this entry is complete */ - local_irq_save(flags); - trace_xen_mc_batch(xen_get_lazy_mode()); - __this_cpu_write(xen_mc_irq_flags, flags); -} - -static inline struct multicall_space xen_mc_entry(size_t args) -{ - xen_mc_batch(); - return __xen_mc_entry(args); -} - -/* Flush all pending multicalls */ -void xen_mc_flush(void); - -/* Issue a multicall if we're not in a lazy mode */ -static inline void xen_mc_issue(unsigned mode) -{ - trace_xen_mc_issue(mode); - - if ((xen_get_lazy_mode() & mode) == 0) - xen_mc_flush(); - - /* restore flags saved in xen_mc_batch */ - local_irq_restore(this_cpu_read(xen_mc_irq_flags)); -} - -/* Set up a callback to be called when the current batch is flushed */ -void xen_mc_callback(void (*fn)(void *), void *data); - -/* - * Try to extend the arguments of the previous multicall command. The - * previous command's op must match. If it does, then it attempts to - * extend the argument space allocated to the multicall entry by - * arg_size bytes. - * - * The returned multicall_space will return with mc pointing to the - * command on success, or NULL on failure, and args pointing to the - * newly allocated space. - */ -struct multicall_space xen_mc_extend_args(unsigned long op, size_t arg_size); - -extern bool is_xen_pmu; - -irqreturn_t xen_pmu_irq_handler(int irq, void *dev_id); #ifdef CONFIG_XEN_HAVE_VPMU void xen_pmu_init(int cpu); void xen_pmu_finish(int cpu); @@ -270,9 +266,6 @@ void xen_pmu_finish(int cpu); static inline void xen_pmu_init(int cpu) {} static inline void xen_pmu_finish(int cpu) {} #endif -bool pmu_msr_chk_emulated(u32 msr, u64 *val, bool is_read); -int pmu_apic_update(uint32_t reg); -u64 xen_read_pmc(int counter); #ifdef CONFIG_SMP @@ -321,9 +314,6 @@ static inline void xen_smp_intr_free_pv(unsigned int cpu) {} static inline void xen_smp_count_cpus(void) { } #endif /* CONFIG_SMP */ -#ifdef CONFIG_XEN_PV -void xen_hypercall_pv(void); -#endif void xen_hypercall_hvm(void); void xen_hypercall_amd(void); void xen_hypercall_intel(void);