mirror of
https://github.com/xen-project/xen.git
synced 2026-10-29 10:40:03 +01:00
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 1212af3e8c)
This commit is contained in:
1 parent
aed8192f57
commit
796959c8bd
4 files changed
+13
-10
No files matched your search
@@ -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
|
||||
|
||||
@@ -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
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
@@ -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;
|
||||
}
|
||||
|
||||
|
||||