Mailing List Archive

[xen staging-4.17] x86/PV: avoid indirect call for I/O emulation quirk hook
commit 796959c8bd04672cb93ccbb1bc2f79e35209e30b
Author: Jan Beulich <jbeulich@suse.com>
AuthorDate: Mon Jan 22 13:40:00 2024 +0100
Commit: Andrew Cooper <andrew.cooper3@citrix.com>
CommitDate: Tue Apr 9 16:48:18 2024 +0100

x86/PV: avoid indirect call for I/O emulation quirk hook

This way ioemul_handle_proliant_quirk() won't need ENDBR anymore.

While touching this code, also
- arrange for it to not be built at all when !PV,
- add "const" to the last function parameter and bring the definition
in sync with the declaration (for Misra).

Signed-off-by: Jan Beulich <jbeulich@suse.com>
Reviewed-by: Andrew Cooper <andrew.cooper3@citrix.com>
(cherry picked from commit 1212af3e8c4d3a1350046d4fe0ca3b97b51e67de)
---
xen/arch/x86/Makefile | 2 +-
xen/arch/x86/include/asm/io.h | 10 +++++++---
xen/arch/x86/ioport_emulate.c | 9 ++++-----
xen/arch/x86/pv/emul-priv-op.c | 2 +-
4 files changed, 13 insertions(+), 10 deletions(-)

diff --git a/xen/arch/x86/Makefile b/xen/arch/x86/Makefile
index f213a6b56a..cb9d952659 100644
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -43,7 +43,7 @@ obj-$(CONFIG_LIVEPATCH) += alternative.o livepatch.o
obj-y += msi.o
obj-y += msr.o
obj-$(CONFIG_INDIRECT_THUNK) += indirect-thunk.o
-obj-y += ioport_emulate.o
+obj-$(CONFIG_PV) += ioport_emulate.o
obj-y += irq.o
obj-$(CONFIG_KEXEC) += machine_kexec.o
obj-y += mm.o x86_64/mm.o
diff --git a/xen/arch/x86/include/asm/io.h b/xen/arch/x86/include/asm/io.h
index 92b784a861..9b19d2d389 100644
--- a/xen/arch/x86/include/asm/io.h
+++ b/xen/arch/x86/include/asm/io.h
@@ -47,10 +47,14 @@ __OUT(b,"b",char)
__OUT(w,"w",short)
__OUT(l,,int)

-/* Function pointer used to handle platform specific I/O port emulation. */
+/*
+ * Boolean indicator and function used to handle platform specific I/O port
+ * emulation.
+ */
#define IOEMUL_QUIRK_STUB_BYTES 9
+extern bool ioemul_handle_quirk;
struct cpu_user_regs;
-extern unsigned int (*ioemul_handle_quirk)(
- u8 opcode, char *io_emul_stub, struct cpu_user_regs *regs);
+unsigned int ioemul_handle_proliant_quirk(
+ uint8_t opcode, char *io_emul_stub, const struct cpu_user_regs *regs);

#endif
diff --git a/xen/arch/x86/ioport_emulate.c b/xen/arch/x86/ioport_emulate.c
index 6caeb3d470..0c1e389bc8 100644
--- a/xen/arch/x86/ioport_emulate.c
+++ b/xen/arch/x86/ioport_emulate.c
@@ -8,11 +8,10 @@
#include <xen/sched.h>
#include <xen/dmi.h>

-unsigned int (*__read_mostly ioemul_handle_quirk)(
- uint8_t opcode, char *io_emul_stub, struct cpu_user_regs *regs);
+bool __ro_after_init ioemul_handle_quirk;

-static unsigned int cf_check ioemul_handle_proliant_quirk(
- u8 opcode, char *io_emul_stub, struct cpu_user_regs *regs)
+unsigned int ioemul_handle_proliant_quirk(
+ uint8_t opcode, char *io_emul_stub, const struct cpu_user_regs *regs)
{
static const char stub[] = {
0x9c, /* pushf */
@@ -103,7 +102,7 @@ static const struct dmi_system_id __initconstrel ioport_quirks_tbl[] = {
static int __init cf_check ioport_quirks_init(void)
{
if ( dmi_check_system(ioport_quirks_tbl) )
- ioemul_handle_quirk = ioemul_handle_proliant_quirk;
+ ioemul_handle_quirk = true;

return 0;
}
diff --git a/xen/arch/x86/pv/emul-priv-op.c b/xen/arch/x86/pv/emul-priv-op.c
index 2c94beb10e..e429dfa4f0 100644
--- a/xen/arch/x86/pv/emul-priv-op.c
+++ b/xen/arch/x86/pv/emul-priv-op.c
@@ -124,7 +124,7 @@ static io_emul_stub_t *io_emul_stub_setup(struct priv_op_ctxt *ctxt, u8 opcode,
/* Some platforms might need to quirk the stub for specific inputs. */
if ( unlikely(ioemul_handle_quirk) )
{
- quirk_bytes = ioemul_handle_quirk(opcode, p, ctxt->ctxt.regs);
+ quirk_bytes = ioemul_handle_proliant_quirk(opcode, p, ctxt->ctxt.regs);
p += quirk_bytes;
}

--
generated by git-patchbot for /home/xen/git/xen.git#staging-4.17