#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
 
        __FOP_FUNC(#name)
 
 #define __FOP_RET(name) \
-       ASM_RET \
+       "11: " ASM_RET \
        ".size " name ", .-" name "\n\t"
 
 #define FOP_RET(name) \
        __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) \
        #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)
  \
        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; \
 })