|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [PATCH] x86/PV: use altcall for I/O emulation quirk hook
This way we can arrange for ioemul_handle_proliant_quirk()'s ENDBR to
also be zapped. Utilize existing data rather than introducing another
otherwise unused static variable (array); eventually (if any new quirk
was in need of adding) we may want to use .callback and .driver_data
anyway.
For the decision to be taken before the 2nd alternative patching pass,
the initcall needs to become a pre-SMP one.
While touching this code, also arrange for it to not be built at all
when !PV - that way the respective ENDBR won't be there from the
beginning.
Signed-off-by: Jan Beulich <jbeulich@xxxxxxxx>
---
Obviously the file may want moving to pv/ then. I wasn't sure whether
to also fold doing so right into here.
--- a/xen/arch/x86/Makefile
+++ b/xen/arch/x86/Makefile
@@ -45,7 +45,7 @@ obj-$(CONFIG_LIVEPATCH) += alternative.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
--- a/xen/arch/x86/ioport_emulate.c
+++ b/xen/arch/x86/ioport_emulate.c
@@ -36,7 +36,7 @@ static unsigned int cf_check ioemul_hand
}
/* This table is the set of system-specific I/O emulation hooks. */
-static const struct dmi_system_id __initconstrel ioport_quirks_tbl[] = {
+static const struct dmi_system_id __initconst_cf_clobber ioport_quirks_tbl[] =
{
/*
* I/O emulation hook for certain HP ProLiant servers with
* 'special' SMM goodness.
@@ -46,6 +46,8 @@ static const struct dmi_system_id __init
DMI_MATCH2(
DMI_MATCH(DMI_BIOS_VENDOR, "HP"),
DMI_MATCH(DMI_PRODUCT_NAME, "ProLiant DL3")),
+ /* Need in one entry only as long as .callback isn't also used. */
+ .driver_data = ioemul_handle_proliant_quirk,
},
{
.ident = "HP ProLiant DL5xx",
@@ -99,7 +101,7 @@ static int __init cf_check ioport_quirks
return 0;
}
-__initcall(ioport_quirks_init);
+presmp_initcall(ioport_quirks_init);
/*
* Local variables:
--- a/xen/arch/x86/pv/emul-priv-op.c
+++ b/xen/arch/x86/pv/emul-priv-op.c
@@ -112,7 +112,8 @@ static io_emul_stub_t *io_emul_stub_setu
/* 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 = alternative_call(ioemul_handle_quirk, opcode, p,
+ ctxt->ctxt.regs);
p += quirk_bytes;
}
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |