3:     popl    %fs
        addl    $(4 + \pop), %esp       /* pop the unused "gs" slot */
        IRET_FRAME
-.pushsection .fixup, "ax"
-4:     movl    $0, (%esp)
-       jmp     1b
-5:     movl    $0, (%esp)
-       jmp     2b
-6:     movl    $0, (%esp)
-       jmp     3b
-.popsection
-       _ASM_EXTABLE(1b, 4b)
-       _ASM_EXTABLE(2b, 5b)
-       _ASM_EXTABLE(3b, 6b)
+       _ASM_EXTABLE_TYPE(1b, 1b, EX_TYPE_POP_ZERO)
+       _ASM_EXTABLE_TYPE(2b, 2b, EX_TYPE_POP_ZERO)
+       _ASM_EXTABLE_TYPE(3b, 3b, EX_TYPE_POP_ZERO)
 .endm
 
 .macro RESTORE_ALL_NMI cr3_reg:req pop=0
        sti
        sysexit
 
-.pushsection .fixup, "ax"
-2:     movl    $0, PT_FS(%esp)
-       jmp     1b
-.popsection
+2:     movl    $0, PT_FS(%esp)
+       jmp     1b
        _ASM_EXTABLE(1b, 2b)
 
 .Lsysenter_fix_flags:
         */
        iret
 
-.section .fixup, "ax"
-SYM_CODE_START(asm_iret_error)
+.Lasm_iret_error:
        pushl   $0                              # no error code
        pushl   $iret_error
 
 #endif
 
        jmp     handle_exception
-SYM_CODE_END(asm_iret_error)
-.previous
-       _ASM_EXTABLE(.Lirq_return, asm_iret_error)
+
+       _ASM_EXTABLE(.Lirq_return, .Lasm_iret_error)
 SYM_FUNC_END(entry_INT80_32)
 
 .macro FIXUP_ESPFIX_STACK
 
        return ex_handler_default(fixup, regs);
 }
 
+static bool ex_handler_pop_zero(const struct exception_table_entry *fixup,
+                               struct pt_regs *regs)
+{
+       /*
+        * Typically used for when "pop %seg" traps, in which case we'll clear
+        * the stack slot and re-try the instruction, which will then succeed
+        * to pop zero.
+        */
+       *((unsigned long *)regs->sp) = 0;
+       return ex_handler_default(fixup, regs);
+}
+
 int ex_get_fixup_type(unsigned long ip)
 {
        const struct exception_table_entry *e = search_exception_tables(ip);
        case EX_TYPE_WRMSR_IN_MCE:
                ex_handler_msr_mce(regs, true);
                break;
+       case EX_TYPE_POP_ZERO:
+               return ex_handler_pop_zero(e, regs);
        }
        BUG();
 }