Message ID | e399651c89ace54906c203c0557f66ed6ea3ce8d.1453405861.git.jpoimboe@redhat.com (mailing list archive) |
---|---|
State | New, archived |
Headers | show |
On 21/01/2016 23:49, Josh Poimboeuf wrote: > The callable functions created with the FOP* and FASTOP* macros are > missing ELF function annotations, which confuses tools like stacktool. > Properly annotate them. > > This adds some additional labels to the assembly, but the generated > binary code is unchanged (with the exception of instructions which have > embedded references to __LINE__). > > Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> > Cc: Gleb Natapov <gleb@kernel.org> > Cc: Paolo Bonzini <pbonzini@redhat.com> > Cc: kvm@vger.kernel.org > --- > arch/x86/kvm/emulate.c | 29 +++++++++++++++++++++-------- > 1 file changed, 21 insertions(+), 8 deletions(-) > > diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c > index 1505587..aa4d726 100644 > --- a/arch/x86/kvm/emulate.c > +++ b/arch/x86/kvm/emulate.c > @@ -309,23 +309,29 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt) > > static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); > > -#define FOP_ALIGN ".align " __stringify(FASTOP_SIZE) " \n\t" > +#define FOP_FUNC(name) \ > + ".align " __stringify(FASTOP_SIZE) " \n\t" \ > + ".type " name ", @function \n\t" \ > + name ":\n\t" > + > #define FOP_RET "ret \n\t" > > #define FOP_START(op) \ > extern void em_##op(struct fastop *fake); \ > asm(".pushsection .text, \"ax\" \n\t" \ > ".global em_" #op " \n\t" \ > - FOP_ALIGN \ > - "em_" #op ": \n\t" > + FOP_FUNC("em_" #op) > > #define FOP_END \ > ".popsection") > > -#define FOPNOP() FOP_ALIGN FOP_RET > +#define FOPNOP() \ > + FOP_FUNC(__stringify(__UNIQUE_ID(nop))) \ > + FOP_RET > > #define FOP1E(op, dst) \ > - FOP_ALIGN "10: " #op " %" #dst " \n\t" FOP_RET > + FOP_FUNC(#op "_" #dst) \ > + "10: " #op " %" #dst " \n\t" FOP_RET > > #define FOP1EEX(op, dst) \ > FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception) > @@ -357,7 +363,8 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); > FOP_END > > #define FOP2E(op, dst, src) \ > - FOP_ALIGN #op " %" #src ", %" #dst " \n\t" FOP_RET > + FOP_FUNC(#op "_" #dst "_" #src) \ > + #op " %" #src ", %" #dst " \n\t" FOP_RET > > #define FASTOP2(op) \ > FOP_START(op) \ > @@ -395,7 +402,8 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); > FOP_END > > #define FOP3E(op, dst, src, src2) \ > - FOP_ALIGN #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET > + FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \ > + #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET > > /* 3-operand, word-only, src2=cl */ > #define FASTOP3WCL(op) \ > @@ -407,7 +415,12 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); > FOP_END > > /* Special case for SETcc - 1 instruction per cc */ > -#define FOP_SETCC(op) ".align 4; " #op " %al; ret \n\t" > +#define FOP_SETCC(op) \ > + ".align 4 \n\t" \ > + ".type " #op ", @function \n\t" \ > + #op ": \n\t" \ > + #op " %al \n\t" \ > + FOP_RET > > asm(".global kvm_fastop_exception \n" > "kvm_fastop_exception: xor %esi, %esi; ret"); > Acked-by: Paolo Bonzini <pbonzini@redhat.com> -- To unsubscribe from this list: send the line "unsubscribe kvm" in the body of a message to majordomo@vger.kernel.org More majordomo info at http://vger.kernel.org/majordomo-info.html
diff --git a/arch/x86/kvm/emulate.c b/arch/x86/kvm/emulate.c index 1505587..aa4d726 100644 --- a/arch/x86/kvm/emulate.c +++ b/arch/x86/kvm/emulate.c @@ -309,23 +309,29 @@ static void invalidate_registers(struct x86_emulate_ctxt *ctxt) static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); -#define FOP_ALIGN ".align " __stringify(FASTOP_SIZE) " \n\t" +#define FOP_FUNC(name) \ + ".align " __stringify(FASTOP_SIZE) " \n\t" \ + ".type " name ", @function \n\t" \ + name ":\n\t" + #define FOP_RET "ret \n\t" #define FOP_START(op) \ extern void em_##op(struct fastop *fake); \ asm(".pushsection .text, \"ax\" \n\t" \ ".global em_" #op " \n\t" \ - FOP_ALIGN \ - "em_" #op ": \n\t" + FOP_FUNC("em_" #op) #define FOP_END \ ".popsection") -#define FOPNOP() FOP_ALIGN FOP_RET +#define FOPNOP() \ + FOP_FUNC(__stringify(__UNIQUE_ID(nop))) \ + FOP_RET #define FOP1E(op, dst) \ - FOP_ALIGN "10: " #op " %" #dst " \n\t" FOP_RET + FOP_FUNC(#op "_" #dst) \ + "10: " #op " %" #dst " \n\t" FOP_RET #define FOP1EEX(op, dst) \ FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception) @@ -357,7 +363,8 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); FOP_END #define FOP2E(op, dst, src) \ - FOP_ALIGN #op " %" #src ", %" #dst " \n\t" FOP_RET + FOP_FUNC(#op "_" #dst "_" #src) \ + #op " %" #src ", %" #dst " \n\t" FOP_RET #define FASTOP2(op) \ FOP_START(op) \ @@ -395,7 +402,8 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); FOP_END #define FOP3E(op, dst, src, src2) \ - FOP_ALIGN #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET + FOP_FUNC(#op "_" #dst "_" #src "_" #src2) \ + #op " %" #src2 ", %" #src ", %" #dst " \n\t" FOP_RET /* 3-operand, word-only, src2=cl */ #define FASTOP3WCL(op) \ @@ -407,7 +415,12 @@ static int fastop(struct x86_emulate_ctxt *ctxt, void (*fop)(struct fastop *)); FOP_END /* Special case for SETcc - 1 instruction per cc */ -#define FOP_SETCC(op) ".align 4; " #op " %al; ret \n\t" +#define FOP_SETCC(op) \ + ".align 4 \n\t" \ + ".type " #op ", @function \n\t" \ + #op ": \n\t" \ + #op " %al \n\t" \ + FOP_RET asm(".global kvm_fastop_exception \n" "kvm_fastop_exception: xor %esi, %esi; ret");
The callable functions created with the FOP* and FASTOP* macros are missing ELF function annotations, which confuses tools like stacktool. Properly annotate them. This adds some additional labels to the assembly, but the generated binary code is unchanged (with the exception of instructions which have embedded references to __LINE__). Signed-off-by: Josh Poimboeuf <jpoimboe@redhat.com> Cc: Gleb Natapov <gleb@kernel.org> Cc: Paolo Bonzini <pbonzini@redhat.com> Cc: kvm@vger.kernel.org --- arch/x86/kvm/emulate.c | 29 +++++++++++++++++++++-------- 1 file changed, 21 insertions(+), 8 deletions(-)