|
@@ -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");
|