[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 |