x86/kvm: Fix fastop function ELF metadata
Some of the fastop functions, e.g. em_setcc(), are actually just used as global labels which point to blocks of functions. The global labels are incorrectly annotated as functions. Also the functions themselves don't have size annotations. Fixes a bunch of warnings like the following: arch/x86/kvm/emulate.o: warning: objtool: seto() is missing an ELF size annotation arch/x86/kvm/emulate.o: warning: objtool: em_setcc() is missing an ELF size annotation arch/x86/kvm/emulate.o: warning: objtool: setno() is missing an ELF size annotation arch/x86/kvm/emulate.o: warning: objtool: setc() is missing an ELF size annotation Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Signed-off-by: Thomas Gleixner <tglx@linutronix.de> Acked-by: Paolo Bonzini <pbonzini@redhat.com> Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org> Link: https://lkml.kernel.org/r/c8cc9be60ebbceb3092aa5dd91916039a1f88275.1563413318.git.jpoimboe@redhat.com
This commit is contained in:
parent
083db67648
commit
d99a6ce70e
|
@ -312,29 +312,42 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt)
|
||||||
|
|
||||||
static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
|
static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
|
||||||
|
|
||||||
#define FOP_FUNC(name) \
|
#define __FOP_FUNC(name) \
|
||||||
".align " __stringify(FASTOP_SIZE) " \n\t" \
|
".align " __stringify(FASTOP_SIZE) " \n\t" \
|
||||||
".type " name ", @function \n\t" \
|
".type " name ", @function \n\t" \
|
||||||
name ":\n\t"
|
name ":\n\t"
|
||||||
|
|
||||||
#define FOP_RET "ret \n\t"
|
#define FOP_FUNC(name) \
|
||||||
|
__FOP_FUNC(#name)
|
||||||
|
|
||||||
|
#define __FOP_RET(name) \
|
||||||
|
"ret \n\t" \
|
||||||
|
".size " name ", .-" name "\n\t"
|
||||||
|
|
||||||
|
#define FOP_RET(name) \
|
||||||
|
__FOP_RET(#name)
|
||||||
|
|
||||||
#define FOP_START(op) \
|
#define FOP_START(op) \
|
||||||
extern void em_##op(struct fastop *fake); \
|
extern void em_##op(struct fastop *fake); \
|
||||||
asm(".pushsection .text, \"ax\" \n\t" \
|
asm(".pushsection .text, \"ax\" \n\t" \
|
||||||
".global em_" #op " \n\t" \
|
".global em_" #op " \n\t" \
|
||||||
FOP_FUNC("em_" #op)
|
".align " __stringify(FASTOP_SIZE) " \n\t" \
|
||||||
|
"em_" #op ":\n\t"
|
||||||
|
|
||||||
#define FOP_END \
|
#define FOP_END \
|
||||||
".popsection")
|
".popsection")
|
||||||
|
|
||||||
|
#define __FOPNOP(name) \
|
||||||
|
__FOP_FUNC(name) \
|
||||||
|
__FOP_RET(name)
|
||||||
|
|
||||||
#define FOPNOP() \
|
#define FOPNOP() \
|
||||||
FOP_FUNC(__stringify(__UNIQUE_ID(nop))) \
|
__FOPNOP(__stringify(__UNIQUE_ID(nop)))
|
||||||
FOP_RET
|
|
||||||
|
|
||||||
#define FOP1E(op, dst) \
|
#define FOP1E(op, dst) \
|
||||||
FOP_FUNC(#op "_" #dst) \
|
__FOP_FUNC(#op "_" #dst) \
|
||||||
"10: " #op " %" #dst " \n\t" FOP_RET
|
"10: " #op " %" #dst " \n\t" \
|
||||||
|
__FOP_RET(#op "_" #dst)
|
||||||
|
|
||||||
#define FOP1EEX(op, dst) \
|
#define FOP1EEX(op, dst) \
|
||||||
FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception)
|
FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception)
|
||||||
|
@ -366,8 +379,9 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
|
||||||
FOP_END
|
FOP_END
|
||||||
|
|
||||||
#define FOP2E(op, dst, src) \
|
#define FOP2E(op, dst, src) \
|
||||||
FOP_FUNC(#op "_" #dst "_" #src) \
|
__FOP_FUNC(#op "_" #dst "_" #src) \
|
||||||
#op " %" #src ", %" #dst " \n\t" FOP_RET
|
#op " %" #src ", %" #dst " \n\t" \
|
||||||
|
__FOP_RET(#op "_" #dst "_" #src)
|
||||||
|
|
||||||
#define FASTOP2(op) \
|
#define FASTOP2(op) \
|
||||||
FOP_START(op) \
|
FOP_START(op) \
|
||||||
|
@ -405,8 +419,9 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
|
||||||
FOP_END
|
FOP_END
|
||||||
|
|
||||||
#define FOP3E(op, dst, src, src2) \
|
#define FOP3E(op, dst, src, src2) \
|
||||||
FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \
|
__FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \
|
||||||
#op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET
|
#op " %" #src2 ", %" #src ", %" #dst " \n\t"\
|
||||||
|
__FOP_RET(#op "_" #dst "_" #src "_" #src2)
|
||||||
|
|
||||||
/* 3-operand, word-only, src2=cl */
|
/* 3-operand, word-only, src2=cl */
|
||||||
#define FASTOP3WCL(op) \
|
#define FASTOP3WCL(op) \
|
||||||
|
@ -423,7 +438,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *));
|
||||||
".type " #op ", @function \n\t" \
|
".type " #op ", @function \n\t" \
|
||||||
#op ": \n\t" \
|
#op ": \n\t" \
|
||||||
#op " %al \n\t" \
|
#op " %al \n\t" \
|
||||||
FOP_RET
|
__FOP_RET(#op)
|
||||||
|
|
||||||
asm(".pushsection .fixup, \"ax\"\n"
|
asm(".pushsection .fixup, \"ax\"\n"
|
||||||
".global kvm_fastop_exception \n"
|
".global kvm_fastop_exception \n"
|
||||||
|
@ -449,7 +464,10 @@ FOP_SETCC(setle)
|
||||||
FOP_SETCC(setnle)
|
FOP_SETCC(setnle)
|
||||||
FOP_END;
|
FOP_END;
|
||||||
|
|
||||||
FOP_START(salc) "pushf; sbb %al, %al; popf \n\t" FOP_RET
|
FOP_START(salc)
|
||||||
|
FOP_FUNC(salc)
|
||||||
|
"pushf; sbb %al, %al; popf \n\t"
|
||||||
|
FOP_RET(salc)
|
||||||
FOP_END;
|
FOP_END;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
|
|
Loading…
Reference in New Issue