|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [xen master] 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#master
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |