x86/kvm: Remove .fixup usage
authorPeter Zijlstra <peterz@infradead.org>
Wed, 10 Nov 2021 10:01:16 +0000 (11:01 +0100)
committerPeter Zijlstra <peterz@infradead.org>
Sat, 11 Dec 2021 08:09:48 +0000 (09:09 +0100)
KVM instruction emulation has a gnarly hack where the .fixup does a
return, however there's already a ret right after the 10b label, so
mark that as 11 and have the exception clear %esi to remove the
.fixup.

Suggested-by: Paolo Bonzini <pbonzini@redhat.com>
Signed-off-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Reviewed-by: Josh Poimboeuf <jpoimboe@redhat.com>
Link: https://lore.kernel.org/r/20211110101325.722157053@infradead.org
arch/x86/include/asm/extable_fixup_types.h
arch/x86/kvm/emulate.c

index a43b8c1..31ad42f 100644 (file)
@@ -46,5 +46,6 @@
 #define        EX_TYPE_IMM_REG                 17 /* reg := (long)imm */
 #define        EX_TYPE_EFAULT_REG              (EX_TYPE_IMM_REG | EX_DATA_IMM(-EFAULT))
 #define        EX_TYPE_ZERO_REG                (EX_TYPE_IMM_REG | EX_DATA_IMM(0))
+#define        EX_TYPE_ONE_REG                 (EX_TYPE_IMM_REG | EX_DATA_IMM(1))
 
 #endif
index b026350..1e19a4d 100644 (file)
@@ -315,7 +315,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop);
        __FOP_FUNC(#name)
 
 #define __FOP_RET(name) \
-       ASM_RET \
+       "11: " ASM_RET \
        ".size " name ", .-" name "\n\t"
 
 #define FOP_RET(name) \
@@ -344,7 +344,7 @@ static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop);
        __FOP_RET(#op "_" #dst)
 
 #define FOP1EEX(op,  dst) \
-       FOP1E(op, dst) _ASM_EXTABLE(10b, kvm_fastop_exception)
+       FOP1E(op, dst) _ASM_EXTABLE_TYPE_REG(10b, 11b, EX_TYPE_ZERO_REG, %%esi)
 
 #define FASTOP1(op) \
        FOP_START(op) \
@@ -434,10 +434,6 @@ static int fastop(struct x86_emulate_ctxt *ctxt, fastop_t fop);
        #op " %al \n\t" \
        __FOP_RET(#op)
 
-asm(".pushsection .fixup, \"ax\"\n"
-    "kvm_fastop_exception: xor %esi, %esi; " ASM_RET
-    ".popsection");
-
 FOP_START(setcc)
 FOP_SETCC(seto)
 FOP_SETCC(setno)
@@ -473,12 +469,8 @@ FOP_END;
  \
        asm volatile("1:" insn "\n" \
                     "2:\n" \
-                    ".pushsection .fixup, \"ax\"\n" \
-                    "3: movl $1, %[_fault]\n" \
-                    "   jmp  2b\n" \
-                    ".popsection\n" \
-                    _ASM_EXTABLE(1b, 3b) \
-                    : [_fault] "+qm"(_fault) inoutclob ); \
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_ONE_REG, %[_fault]) \
+                    : [_fault] "+r"(_fault) inoutclob ); \
  \
        _fault ? X86EMUL_UNHANDLEABLE : X86EMUL_CONTINUE; \
 })