[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen staging] x86/stubs: Consolidate the stubs infrastructure in asm/stubs.h
commit 6cfe3ae346fc84fbd4380fc45c70780935da590a Author: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> AuthorDate: Mon May 5 18:34:49 2025 +0100 Commit: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> CommitDate: Mon May 26 19:02:11 2025 +0100 x86/stubs: Consolidate the stubs infrastructure in asm/stubs.h Very few files need the stubs. Move the infrastructure out of processor.h and config.h into a new stubs.h, and adjust the includes accordingly. Make the per-cpu struct stubs be read mostly; they're unmodified during the uptime of the CPU, and move them into smpboot.c seeing as that's where they're allocated and freed. No functional change. Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx> Acked-by: Jan Beulich <jbeulich@xxxxxxxx> --- xen/arch/x86/alternative.c | 1 + xen/arch/x86/extable.c | 8 +++++--- xen/arch/x86/hvm/vmx/vmx.c | 1 + xen/arch/x86/include/asm/config.h | 5 ----- xen/arch/x86/include/asm/processor.h | 11 ----------- xen/arch/x86/include/asm/stubs.h | 37 ++++++++++++++++++++++++++++++++++++ xen/arch/x86/pv/emul-priv-op.c | 1 + xen/arch/x86/setup.c | 1 + xen/arch/x86/smpboot.c | 3 +++ xen/arch/x86/x86_64/traps.c | 3 +-- xen/arch/x86/x86_emulate/private.h | 2 ++ 11 files changed, 52 insertions(+), 21 deletions(-) diff --git a/xen/arch/x86/alternative.c b/xen/arch/x86/alternative.c index ecc56964bd..d4fe56b3da 100644 --- a/xen/arch/x86/alternative.c +++ b/xen/arch/x86/alternative.c @@ -11,6 +11,7 @@ #include <asm/alternative.h> #include <xen/init.h> #include <asm/setup.h> +#include <asm/stubs.h> #include <asm/system.h> #include <asm/traps.h> #include <asm/nmi.h> diff --git a/xen/arch/x86/extable.c b/xen/arch/x86/extable.c index de39202452..5f5103179a 100644 --- a/xen/arch/x86/extable.c +++ b/xen/arch/x86/extable.c @@ -1,16 +1,18 @@ +#include <xen/domain_page.h> #include <xen/init.h> #include <xen/list.h> +#include <xen/livepatch.h> #include <xen/perfc.h> #include <xen/rcupdate.h> #include <xen/sort.h> #include <xen/spinlock.h> -#include <asm/uaccess.h> -#include <xen/domain_page.h> #include <xen/virtual_region.h> -#include <xen/livepatch.h> #include <xen/warning.h> +#include <asm/stubs.h> +#include <asm/uaccess.h> + #define EX_FIELD(ptr, field) ((unsigned long)&(ptr)->field + (ptr)->field) static inline unsigned long ex_addr(const struct exception_table_entry *x) diff --git a/xen/arch/x86/hvm/vmx/vmx.c b/xen/arch/x86/hvm/vmx/vmx.c index 827db6bdd8..c2262c5848 100644 --- a/xen/arch/x86/hvm/vmx/vmx.c +++ b/xen/arch/x86/hvm/vmx/vmx.c @@ -48,6 +48,7 @@ #include <asm/monitor.h> #include <asm/prot-key.h> #include <asm/spec_ctrl.h> +#include <asm/stubs.h> #include <public/arch-x86/cpuid.h> static bool __initdata opt_force_ept; diff --git a/xen/arch/x86/include/asm/config.h b/xen/arch/x86/include/asm/config.h index f0123a7de9..3553bf89dc 100644 --- a/xen/arch/x86/include/asm/config.h +++ b/xen/arch/x86/include/asm/config.h @@ -49,11 +49,6 @@ /* Primary shadow stack is slot 5 of 8, immediately under the primary stack. */ #define PRIMARY_SHSTK_SLOT 5 -/* Total size of syscall and emulation stubs. */ -#define STUB_BUF_SHIFT (L1_CACHE_SHIFT > 7 ? L1_CACHE_SHIFT : 7) -#define STUB_BUF_SIZE (1 << STUB_BUF_SHIFT) -#define STUBS_PER_PAGE (PAGE_SIZE / STUB_BUF_SIZE) - /* Return value for zero-size _xmalloc(), distinguished from NULL. */ #define ZERO_BLOCK_PTR ((void *)0xBAD0BAD0BAD0BAD0UL) diff --git a/xen/arch/x86/include/asm/processor.h b/xen/arch/x86/include/asm/processor.h index eacd425c53..1820e04a32 100644 --- a/xen/arch/x86/include/asm/processor.h +++ b/xen/arch/x86/include/asm/processor.h @@ -424,17 +424,6 @@ static inline void enable_nmis(void) void nocall sysenter_entry(void); -struct stubs { - union { - void(*func)(void); - unsigned long addr; - }; - unsigned long mfn; -}; - -DECLARE_PER_CPU(struct stubs, stubs); -unsigned long alloc_stub_page(unsigned int cpu, unsigned long *mfn); - static inline uint8_t get_cpu_family(uint32_t raw, uint8_t *model, uint8_t *stepping) { diff --git a/xen/arch/x86/include/asm/stubs.h b/xen/arch/x86/include/asm/stubs.h new file mode 100644 index 0000000000..a520928e9a --- /dev/null +++ b/xen/arch/x86/include/asm/stubs.h @@ -0,0 +1,37 @@ +/* SPDX-License-Identifier: GPL-2.0-only */ +#ifndef X86_ASM_STUBS_H +#define X86_ASM_STUBS_H + +/* + * Xen has several per-cpu executable stubs which are written dynamically. + * These are: + * + * - The SYSCALL entry stubs, LSTAR and CSTAR. These are written on boot, and + * are responsible for moving back onto Xen's stack. + * + * - The emulation stub. This is used to replay an instruction or sequence + * which trapped for emulation. + * + * The stubs have an executable alias in l2_xenmap[] (i.e. within 1G of the + * rest of .text), and are written via map_domain_page(). + */ + +#include <xen/percpu.h> + +/* Total size of syscall and emulation stubs. */ +#define STUB_BUF_SHIFT (L1_CACHE_SHIFT > 7 ? L1_CACHE_SHIFT : 7) +#define STUB_BUF_SIZE (1 << STUB_BUF_SHIFT) +#define STUBS_PER_PAGE (PAGE_SIZE / STUB_BUF_SIZE) + +struct stubs { + union { + void (*func)(void); + unsigned long addr; + }; + unsigned long mfn; +}; + +DECLARE_PER_CPU(struct stubs, stubs); +unsigned long alloc_stub_page(unsigned int cpu, unsigned long *mfn); + +#endif /* X86_ASM_STUBS_H */ diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c index 20a90703c8..463befe043 100644 --- a/xen/arch/x86/pv/emul-priv-op.c +++ b/xen/arch/x86/pv/emul-priv-op.c @@ -21,6 +21,7 @@ #include <asm/pv/domain.h> #include <asm/pv/trace.h> #include <asm/shared.h> +#include <asm/stubs.h> #include <xsm/xsm.h> diff --git a/xen/arch/x86/setup.c b/xen/arch/x86/setup.c index 2518954124..1f5cb67bd0 100644 --- a/xen/arch/x86/setup.c +++ b/xen/arch/x86/setup.c @@ -55,6 +55,7 @@ #include <asm/setup.h> #include <asm/smp.h> #include <asm/spec_ctrl.h> +#include <asm/stubs.h> #include <asm/tboot.h> #include <asm/trampoline.h> #include <asm/traps.h> diff --git a/xen/arch/x86/smpboot.c b/xen/arch/x86/smpboot.c index 0189d6c332..41fe67d43c 100644 --- a/xen/arch/x86/smpboot.c +++ b/xen/arch/x86/smpboot.c @@ -38,6 +38,7 @@ #include <asm/prot-key.h> #include <asm/setup.h> #include <asm/spec_ctrl.h> +#include <asm/stubs.h> #include <asm/tboot.h> #include <asm/time.h> #include <asm/trampoline.h> @@ -57,6 +58,8 @@ static cpumask_t scratch_cpu0mask; DEFINE_PER_CPU_READ_MOSTLY(cpumask_var_t, send_ipi_cpumask); static cpumask_t send_ipi_cpu0mask; +DEFINE_PER_CPU_READ_MOSTLY(struct stubs, stubs); + cpumask_t cpu_online_map __read_mostly; EXPORT_SYMBOL(cpu_online_map); diff --git a/xen/arch/x86/x86_64/traps.c b/xen/arch/x86/x86_64/traps.c index 23622cdb14..c77f304bb0 100644 --- a/xen/arch/x86/x86_64/traps.c +++ b/xen/arch/x86/x86_64/traps.c @@ -21,6 +21,7 @@ #include <asm/nmi.h> #include <asm/page.h> #include <asm/shared.h> +#include <asm/stubs.h> #include <asm/traps.h> struct extra_state @@ -357,8 +358,6 @@ static unsigned int write_stub_trampoline( return ROUNDUP(p - stub, 16); } -DEFINE_PER_CPU(struct stubs, stubs); - void nocall lstar_enter(void); void nocall cstar_enter(void); diff --git a/xen/arch/x86/x86_emulate/private.h b/xen/arch/x86/x86_emulate/private.h index 467bce3c84..f6130c7cf5 100644 --- a/xen/arch/x86/x86_emulate/private.h +++ b/xen/arch/x86/x86_emulate/private.h @@ -13,8 +13,10 @@ # include <xen/bug.h> # include <xen/kernel.h> + # include <asm/endbr.h> # include <asm/msr-index.h> +# include <asm/stubs.h> # include <asm/x86-vendors.h> # include <asm/x86_emulate.h> -- generated by git-patchbot for /home/xen/git/xen.git#staging
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |