Merge tag 'x86_core_for_v5.17_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
authorLinus Torvalds <torvalds@linux-foundation.org>
Thu, 13 Jan 2022 00:31:19 +0000 (16:31 -0800)
committerLinus Torvalds <torvalds@linux-foundation.org>
Thu, 13 Jan 2022 00:31:19 +0000 (16:31 -0800)
Pull x86 core updates from Borislav Petkov:

 - Get rid of all the .fixup sections because this generates
   misleading/wrong stacktraces and confuse RELIABLE_STACKTRACE and
   LIVEPATCH as the backtrace misses the function which is being fixed
   up.

 - Add Straight Line Speculation mitigation support which uses a new
   compiler switch -mharden-sls= which sticks an INT3 after a RET or an
   indirect branch in order to block speculation after them. Reportedly,
   CPUs do speculate behind such insns.

 - The usual set of cleanups and improvements

* tag 'x86_core_for_v5.17_rc1' of git://git.kernel.org/pub/scm/linux/kernel/git/tip/tip: (32 commits)
  x86/entry_32: Fix segment exceptions
  objtool: Remove .fixup handling
  x86: Remove .fixup section
  x86/word-at-a-time: Remove .fixup usage
  x86/usercopy: Remove .fixup usage
  x86/usercopy_32: Simplify __copy_user_intel_nocache()
  x86/sgx: Remove .fixup usage
  x86/checksum_32: Remove .fixup usage
  x86/vmx: Remove .fixup usage
  x86/kvm: Remove .fixup usage
  x86/segment: Remove .fixup usage
  x86/fpu: Remove .fixup usage
  x86/xen: Remove .fixup usage
  x86/uaccess: Remove .fixup usage
  x86/futex: Remove .fixup usage
  x86/msr: Remove .fixup usage
  x86/extable: Extend extable functionality
  x86/entry_32: Remove .fixup usage
  x86/entry_64: Remove .fixup usage
  x86/copy_mc_64: Remove .fixup usage
  ...

163 files changed:
Makefile
arch/x86/Kconfig
arch/x86/Kconfig.cpu
arch/x86/Makefile
arch/x86/boot/compressed/efi_thunk_64.S
arch/x86/boot/compressed/head_64.S
arch/x86/boot/compressed/mem_encrypt.S
arch/x86/crypto/aegis128-aesni-asm.S
arch/x86/crypto/aes_ctrby8_avx-x86_64.S
arch/x86/crypto/aesni-intel_asm.S
arch/x86/crypto/aesni-intel_avx-x86_64.S
arch/x86/crypto/blake2s-core.S
arch/x86/crypto/blowfish-x86_64-asm_64.S
arch/x86/crypto/camellia-aesni-avx-asm_64.S
arch/x86/crypto/camellia-aesni-avx2-asm_64.S
arch/x86/crypto/camellia-x86_64-asm_64.S
arch/x86/crypto/cast5-avx-x86_64-asm_64.S
arch/x86/crypto/cast6-avx-x86_64-asm_64.S
arch/x86/crypto/chacha-avx2-x86_64.S
arch/x86/crypto/chacha-avx512vl-x86_64.S
arch/x86/crypto/chacha-ssse3-x86_64.S
arch/x86/crypto/crc32-pclmul_asm.S
arch/x86/crypto/crc32c-pcl-intel-asm_64.S
arch/x86/crypto/crct10dif-pcl-asm_64.S
arch/x86/crypto/des3_ede-asm_64.S
arch/x86/crypto/ghash-clmulni-intel_asm.S
arch/x86/crypto/nh-avx2-x86_64.S
arch/x86/crypto/nh-sse2-x86_64.S
arch/x86/crypto/serpent-avx-x86_64-asm_64.S
arch/x86/crypto/serpent-avx2-asm_64.S
arch/x86/crypto/serpent-sse2-i586-asm_32.S
arch/x86/crypto/serpent-sse2-x86_64-asm_64.S
arch/x86/crypto/sha1_avx2_x86_64_asm.S
arch/x86/crypto/sha1_ni_asm.S
arch/x86/crypto/sha1_ssse3_asm.S
arch/x86/crypto/sha256-avx-asm.S
arch/x86/crypto/sha256-avx2-asm.S
arch/x86/crypto/sha256-ssse3-asm.S
arch/x86/crypto/sha256_ni_asm.S
arch/x86/crypto/sha512-avx-asm.S
arch/x86/crypto/sha512-avx2-asm.S
arch/x86/crypto/sha512-ssse3-asm.S
arch/x86/crypto/sm4-aesni-avx-asm_64.S
arch/x86/crypto/sm4-aesni-avx2-asm_64.S
arch/x86/crypto/twofish-avx-x86_64-asm_64.S
arch/x86/crypto/twofish-i586-asm_32.S
arch/x86/crypto/twofish-x86_64-asm_64-3way.S
arch/x86/crypto/twofish-x86_64-asm_64.S
arch/x86/entry/entry_32.S
arch/x86/entry/entry_64.S
arch/x86/entry/thunk_32.S
arch/x86/entry/thunk_64.S
arch/x86/entry/vdso/vdso-layout.lds.S
arch/x86/entry/vdso/vdso32/system_call.S
arch/x86/entry/vdso/vsgx.S
arch/x86/entry/vsyscall/vsyscall_emu_64.S
arch/x86/include/asm/asm.h
arch/x86/include/asm/extable.h
arch/x86/include/asm/extable_fixup_types.h
arch/x86/include/asm/futex.h
arch/x86/include/asm/insn-eval.h
arch/x86/include/asm/linkage.h
arch/x86/include/asm/mmx.h
arch/x86/include/asm/msr.h
arch/x86/include/asm/page_32.h
arch/x86/include/asm/paravirt.h
arch/x86/include/asm/qspinlock_paravirt.h
arch/x86/include/asm/required-features.h
arch/x86/include/asm/segment.h
arch/x86/include/asm/sgx.h
arch/x86/include/asm/static_call.h
arch/x86/include/asm/string_32.h
arch/x86/include/asm/uaccess.h
arch/x86/include/asm/word-at-a-time.h
arch/x86/include/asm/xen/page.h
arch/x86/kernel/acpi/wakeup_32.S
arch/x86/kernel/alternative.c
arch/x86/kernel/cpu/sgx/encls.h
arch/x86/kernel/fpu/legacy.h
arch/x86/kernel/fpu/xstate.h
arch/x86/kernel/ftrace.c
arch/x86/kernel/ftrace_32.S
arch/x86/kernel/ftrace_64.S
arch/x86/kernel/head_32.S
arch/x86/kernel/irqflags.S
arch/x86/kernel/kprobes/core.c
arch/x86/kernel/paravirt.c
arch/x86/kernel/relocate_kernel_32.S
arch/x86/kernel/relocate_kernel_64.S
arch/x86/kernel/sev_verify_cbit.S
arch/x86/kernel/static_call.c
arch/x86/kernel/verify_cpu.S
arch/x86/kernel/vmlinux.lds.S
arch/x86/kvm/emulate.c
arch/x86/kvm/svm/vmenter.S
arch/x86/kvm/vmx/vmenter.S
arch/x86/kvm/vmx/vmx_ops.h
arch/x86/lib/Makefile
arch/x86/lib/atomic64_386_32.S
arch/x86/lib/atomic64_cx8_32.S
arch/x86/lib/checksum_32.S
arch/x86/lib/clear_page_64.S
arch/x86/lib/cmpxchg16b_emu.S
arch/x86/lib/cmpxchg8b_emu.S
arch/x86/lib/copy_mc_64.S
arch/x86/lib/copy_page_64.S
arch/x86/lib/copy_user_64.S
arch/x86/lib/csum-copy_64.S
arch/x86/lib/csum-partial_64.c
arch/x86/lib/error-inject.c
arch/x86/lib/getuser.S
arch/x86/lib/hweight.S
arch/x86/lib/insn-eval.c
arch/x86/lib/iomap_copy_64.S
arch/x86/lib/memcpy_32.c
arch/x86/lib/memcpy_64.S
arch/x86/lib/memmove_64.S
arch/x86/lib/memset_64.S
arch/x86/lib/mmx_32.c
arch/x86/lib/msr-reg.S
arch/x86/lib/putuser.S
arch/x86/lib/retpoline.S
arch/x86/lib/usercopy_32.c
arch/x86/lib/usercopy_64.c
arch/x86/math-emu/div_Xsig.S
arch/x86/math-emu/div_small.S
arch/x86/math-emu/mul_Xsig.S
arch/x86/math-emu/polynom_Xsig.S
arch/x86/math-emu/reg_norm.S
arch/x86/math-emu/reg_round.S
arch/x86/math-emu/reg_u_add.S
arch/x86/math-emu/reg_u_div.S
arch/x86/math-emu/reg_u_mul.S
arch/x86/math-emu/reg_u_sub.S
arch/x86/math-emu/round_Xsig.S
arch/x86/math-emu/shr_Xsig.S
arch/x86/math-emu/wm_shrx.S
arch/x86/mm/extable.c
arch/x86/mm/mem_encrypt_boot.S
arch/x86/net/bpf_jit_comp.c
arch/x86/platform/efi/efi_stub_32.S
arch/x86/platform/efi/efi_stub_64.S
arch/x86/platform/efi/efi_thunk_64.S
arch/x86/platform/olpc/xo1-wakeup.S
arch/x86/power/hibernate_asm_32.S
arch/x86/power/hibernate_asm_64.S
arch/x86/um/checksum_32.S
arch/x86/um/setjmp_32.S
arch/x86/um/setjmp_64.S
arch/x86/xen/xen-asm.S
arch/x86/xen/xen-head.S
include/linux/bitfield.h
samples/ftrace/ftrace-direct-modify.c
samples/ftrace/ftrace-direct-too.c
samples/ftrace/ftrace-direct.c
scripts/Makefile.build
scripts/link-vmlinux.sh
tools/arch/x86/include/asm/required-features.h
tools/objtool/arch/x86/decode.c
tools/objtool/builtin-check.c
tools/objtool/check.c
tools/objtool/include/objtool/arch.h
tools/objtool/include/objtool/builtin.h

index 45278d5..0fc511a 100644 (file)
--- a/Makefile
+++ b/Makefile
@@ -688,17 +688,6 @@ ifdef CONFIG_FUNCTION_TRACER
   CC_FLAGS_FTRACE := -pg
 endif
 
-ifdef CONFIG_CC_IS_GCC
-RETPOLINE_CFLAGS       := $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register)
-RETPOLINE_VDSO_CFLAGS  := $(call cc-option,-mindirect-branch=thunk-inline -mindirect-branch-register)
-endif
-ifdef CONFIG_CC_IS_CLANG
-RETPOLINE_CFLAGS       := -mretpoline-external-thunk
-RETPOLINE_VDSO_CFLAGS  := -mretpoline
-endif
-export RETPOLINE_CFLAGS
-export RETPOLINE_VDSO_CFLAGS
-
 include $(srctree)/arch/$(SRCARCH)/Makefile
 
 ifdef need-config
index 8910b09..976dd6b 100644 (file)
@@ -473,6 +473,18 @@ config RETPOLINE
          branches. Requires a compiler with -mindirect-branch=thunk-extern
          support for full protection. The kernel may run slower.
 
+config CC_HAS_SLS
+       def_bool $(cc-option,-mharden-sls=all)
+
+config SLS
+       bool "Mitigate Straight-Line-Speculation"
+       depends on CC_HAS_SLS && X86_64
+       default n
+       help
+         Compile the kernel with straight-line-speculation options to guard
+         against straight line speculation. The kernel image might be slightly
+         larger.
+
 config X86_CPU_RESCTRL
        bool "x86 CPU resource control support"
        depends on X86 && (CPU_SUP_INTEL || CPU_SUP_AMD)
@@ -1952,7 +1964,7 @@ config EFI
 
 config EFI_STUB
        bool "EFI stub support"
-       depends on EFI && !X86_USE_3DNOW
+       depends on EFI
        depends on $(cc-option,-mabi=ms) || X86_32
        select RELOCATABLE
        help
index eefc434..542377c 100644 (file)
@@ -342,10 +342,6 @@ config X86_USE_PPRO_CHECKSUM
        def_bool y
        depends on MWINCHIP3D || MWINCHIPC6 || MCYRIXIII || MK7 || MK6 || MPENTIUM4 || MPENTIUMM || MPENTIUMIII || MPENTIUMII || M686 || MK8 || MVIAC3_2 || MVIAC7 || MEFFICEON || MGEODE_LX || MCORE2 || MATOM
 
-config X86_USE_3DNOW
-       def_bool y
-       depends on (MCYRIXIII || MK7 || MGEODE_LX) && !UML
-
 #
 # P6_NOPs are a relatively minor optimization that require a family >=
 # 6 processor, except that it is broken on certain VIA chips.
index 4224386..e84cdd4 100644 (file)
@@ -12,6 +12,18 @@ else
         KBUILD_DEFCONFIG := $(ARCH)_defconfig
 endif
 
+ifdef CONFIG_CC_IS_GCC
+RETPOLINE_CFLAGS       := $(call cc-option,-mindirect-branch=thunk-extern -mindirect-branch-register)
+RETPOLINE_CFLAGS       += $(call cc-option,-mindirect-branch-cs-prefix)
+RETPOLINE_VDSO_CFLAGS  := $(call cc-option,-mindirect-branch=thunk-inline -mindirect-branch-register)
+endif
+ifdef CONFIG_CC_IS_CLANG
+RETPOLINE_CFLAGS       := -mretpoline-external-thunk
+RETPOLINE_VDSO_CFLAGS  := -mretpoline
+endif
+export RETPOLINE_CFLAGS
+export RETPOLINE_VDSO_CFLAGS
+
 # For gcc stack alignment is specified with -mpreferred-stack-boundary,
 # clang has the option -mstack-alignment for that purpose.
 ifneq ($(call cc-option, -mpreferred-stack-boundary=4),)
@@ -179,6 +191,10 @@ ifdef CONFIG_RETPOLINE
   endif
 endif
 
+ifdef CONFIG_SLS
+  KBUILD_CFLAGS += -mharden-sls=all
+endif
+
 KBUILD_LDFLAGS += -m elf_$(UTS_MACHINE)
 
 ifdef CONFIG_LTO_CLANG
index d05f781..67e7edc 100644 (file)
@@ -101,7 +101,7 @@ SYM_FUNC_START(__efi64_thunk)
 
        pop     %rbx
        pop     %rbp
-       ret
+       RET
 SYM_FUNC_END(__efi64_thunk)
 
        .code32
index 572c535..fd9441f 100644 (file)
@@ -813,7 +813,7 @@ SYM_FUNC_START(efi32_pe_entry)
 2:     popl    %edi                            // restore callee-save registers
        popl    %ebx
        leave
-       ret
+       RET
 SYM_FUNC_END(efi32_pe_entry)
 
        .section ".rodata"
@@ -868,7 +868,7 @@ SYM_FUNC_START(startup32_set_idt_entry)
 
        pop     %ecx
        pop     %ebx
-       ret
+       RET
 SYM_FUNC_END(startup32_set_idt_entry)
 #endif
 
@@ -884,7 +884,7 @@ SYM_FUNC_START(startup32_load_idt)
        movl    %eax, rva(boot32_idt_desc+2)(%ebp)
        lidt    rva(boot32_idt_desc)(%ebp)
 #endif
-       ret
+       RET
 SYM_FUNC_END(startup32_load_idt)
 
 /*
@@ -954,7 +954,7 @@ SYM_FUNC_START(startup32_check_sev_cbit)
        popl    %ebx
        popl    %eax
 #endif
-       ret
+       RET
 SYM_FUNC_END(startup32_check_sev_cbit)
 
 /*
index c1e81a8..a63424d 100644 (file)
@@ -58,7 +58,7 @@ SYM_FUNC_START(get_sev_encryption_bit)
 
 #endif /* CONFIG_AMD_MEM_ENCRYPT */
 
-       ret
+       RET
 SYM_FUNC_END(get_sev_encryption_bit)
 
 /**
@@ -92,7 +92,7 @@ SYM_CODE_START_LOCAL(sev_es_req_cpuid)
        /* All good - return success */
        xorl    %eax, %eax
 1:
-       ret
+       RET
 2:
        movl    $-1, %eax
        jmp     1b
@@ -221,7 +221,7 @@ SYM_FUNC_START(set_sev_encryption_mask)
 #endif
 
        xor     %rax, %rax
-       ret
+       RET
 SYM_FUNC_END(set_sev_encryption_mask)
 
        .data
index 51d46d9..b48ddeb 100644 (file)
@@ -122,7 +122,7 @@ SYM_FUNC_START_LOCAL(__load_partial)
        pxor T0, MSG
 
 .Lld_partial_8:
-       ret
+       RET
 SYM_FUNC_END(__load_partial)
 
 /*
@@ -180,7 +180,7 @@ SYM_FUNC_START_LOCAL(__store_partial)
        mov %r10b, (%r9)
 
 .Lst_partial_1:
-       ret
+       RET
 SYM_FUNC_END(__store_partial)
 
 /*
@@ -225,7 +225,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_init)
        movdqu STATE4, 0x40(STATEP)
 
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_init)
 
 /*
@@ -337,7 +337,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_ad)
        movdqu STATE3, 0x30(STATEP)
        movdqu STATE4, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lad_out_1:
        movdqu STATE4, 0x00(STATEP)
@@ -346,7 +346,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_ad)
        movdqu STATE2, 0x30(STATEP)
        movdqu STATE3, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lad_out_2:
        movdqu STATE3, 0x00(STATEP)
@@ -355,7 +355,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_ad)
        movdqu STATE1, 0x30(STATEP)
        movdqu STATE2, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lad_out_3:
        movdqu STATE2, 0x00(STATEP)
@@ -364,7 +364,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_ad)
        movdqu STATE0, 0x30(STATEP)
        movdqu STATE1, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lad_out_4:
        movdqu STATE1, 0x00(STATEP)
@@ -373,11 +373,11 @@ SYM_FUNC_START(crypto_aegis128_aesni_ad)
        movdqu STATE4, 0x30(STATEP)
        movdqu STATE0, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lad_out:
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_ad)
 
 .macro encrypt_block a s0 s1 s2 s3 s4 i
@@ -452,7 +452,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc)
        movdqu STATE2, 0x30(STATEP)
        movdqu STATE3, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lenc_out_1:
        movdqu STATE3, 0x00(STATEP)
@@ -461,7 +461,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc)
        movdqu STATE1, 0x30(STATEP)
        movdqu STATE2, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lenc_out_2:
        movdqu STATE2, 0x00(STATEP)
@@ -470,7 +470,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc)
        movdqu STATE0, 0x30(STATEP)
        movdqu STATE1, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lenc_out_3:
        movdqu STATE1, 0x00(STATEP)
@@ -479,7 +479,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc)
        movdqu STATE4, 0x30(STATEP)
        movdqu STATE0, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lenc_out_4:
        movdqu STATE0, 0x00(STATEP)
@@ -488,11 +488,11 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc)
        movdqu STATE3, 0x30(STATEP)
        movdqu STATE4, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Lenc_out:
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_enc)
 
 /*
@@ -532,7 +532,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_enc_tail)
        movdqu STATE3, 0x40(STATEP)
 
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_enc_tail)
 
 .macro decrypt_block a s0 s1 s2 s3 s4 i
@@ -606,7 +606,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec)
        movdqu STATE2, 0x30(STATEP)
        movdqu STATE3, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Ldec_out_1:
        movdqu STATE3, 0x00(STATEP)
@@ -615,7 +615,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec)
        movdqu STATE1, 0x30(STATEP)
        movdqu STATE2, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Ldec_out_2:
        movdqu STATE2, 0x00(STATEP)
@@ -624,7 +624,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec)
        movdqu STATE0, 0x30(STATEP)
        movdqu STATE1, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Ldec_out_3:
        movdqu STATE1, 0x00(STATEP)
@@ -633,7 +633,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec)
        movdqu STATE4, 0x30(STATEP)
        movdqu STATE0, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Ldec_out_4:
        movdqu STATE0, 0x00(STATEP)
@@ -642,11 +642,11 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec)
        movdqu STATE3, 0x30(STATEP)
        movdqu STATE4, 0x40(STATEP)
        FRAME_END
-       ret
+       RET
 
 .Ldec_out:
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_dec)
 
 /*
@@ -696,7 +696,7 @@ SYM_FUNC_START(crypto_aegis128_aesni_dec_tail)
        movdqu STATE3, 0x40(STATEP)
 
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_dec_tail)
 
 /*
@@ -743,5 +743,5 @@ SYM_FUNC_START(crypto_aegis128_aesni_final)
        movdqu MSG, (%rsi)
 
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(crypto_aegis128_aesni_final)
index 3f0fc7d..c799838 100644 (file)
@@ -525,7 +525,7 @@ ddq_add_8:
        /* return updated IV */
        vpshufb xbyteswap, xcounter, xcounter
        vmovdqu xcounter, (p_iv)
-       ret
+       RET
 .endm
 
 /*
index 4e39725..363699d 100644 (file)
@@ -1594,7 +1594,7 @@ SYM_FUNC_START(aesni_gcm_dec)
        GCM_ENC_DEC dec
        GCM_COMPLETE arg10, arg11
        FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_dec)
 
 
@@ -1683,7 +1683,7 @@ SYM_FUNC_START(aesni_gcm_enc)
 
        GCM_COMPLETE arg10, arg11
        FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_enc)
 
 /*****************************************************************************
@@ -1701,7 +1701,7 @@ SYM_FUNC_START(aesni_gcm_init)
        FUNC_SAVE
        GCM_INIT %arg3, %arg4,%arg5, %arg6
        FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_init)
 
 /*****************************************************************************
@@ -1716,7 +1716,7 @@ SYM_FUNC_START(aesni_gcm_enc_update)
        FUNC_SAVE
        GCM_ENC_DEC enc
        FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_enc_update)
 
 /*****************************************************************************
@@ -1731,7 +1731,7 @@ SYM_FUNC_START(aesni_gcm_dec_update)
        FUNC_SAVE
        GCM_ENC_DEC dec
        FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_dec_update)
 
 /*****************************************************************************
@@ -1746,7 +1746,7 @@ SYM_FUNC_START(aesni_gcm_finalize)
        FUNC_SAVE
        GCM_COMPLETE %arg3 %arg4
        FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_finalize)
 
 #endif
@@ -1762,7 +1762,7 @@ SYM_FUNC_START_LOCAL(_key_expansion_256a)
        pxor %xmm1, %xmm0
        movaps %xmm0, (TKEYP)
        add $0x10, TKEYP
-       ret
+       RET
 SYM_FUNC_END(_key_expansion_256a)
 SYM_FUNC_END_ALIAS(_key_expansion_128)
 
@@ -1787,7 +1787,7 @@ SYM_FUNC_START_LOCAL(_key_expansion_192a)
        shufps $0b01001110, %xmm2, %xmm1
        movaps %xmm1, 0x10(TKEYP)
        add $0x20, TKEYP
-       ret
+       RET
 SYM_FUNC_END(_key_expansion_192a)
 
 SYM_FUNC_START_LOCAL(_key_expansion_192b)
@@ -1806,7 +1806,7 @@ SYM_FUNC_START_LOCAL(_key_expansion_192b)
 
        movaps %xmm0, (TKEYP)
        add $0x10, TKEYP
-       ret
+       RET
 SYM_FUNC_END(_key_expansion_192b)
 
 SYM_FUNC_START_LOCAL(_key_expansion_256b)
@@ -1818,7 +1818,7 @@ SYM_FUNC_START_LOCAL(_key_expansion_256b)
        pxor %xmm1, %xmm2
        movaps %xmm2, (TKEYP)
        add $0x10, TKEYP
-       ret
+       RET
 SYM_FUNC_END(_key_expansion_256b)
 
 /*
@@ -1933,7 +1933,7 @@ SYM_FUNC_START(aesni_set_key)
        popl KEYP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_set_key)
 
 /*
@@ -1957,7 +1957,7 @@ SYM_FUNC_START(aesni_enc)
        popl KEYP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_enc)
 
 /*
@@ -2014,7 +2014,7 @@ SYM_FUNC_START_LOCAL(_aesni_enc1)
        aesenc KEY, STATE
        movaps 0x70(TKEYP), KEY
        aesenclast KEY, STATE
-       ret
+       RET
 SYM_FUNC_END(_aesni_enc1)
 
 /*
@@ -2122,7 +2122,7 @@ SYM_FUNC_START_LOCAL(_aesni_enc4)
        aesenclast KEY, STATE2
        aesenclast KEY, STATE3
        aesenclast KEY, STATE4
-       ret
+       RET
 SYM_FUNC_END(_aesni_enc4)
 
 /*
@@ -2147,7 +2147,7 @@ SYM_FUNC_START(aesni_dec)
        popl KEYP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_dec)
 
 /*
@@ -2204,7 +2204,7 @@ SYM_FUNC_START_LOCAL(_aesni_dec1)
        aesdec KEY, STATE
        movaps 0x70(TKEYP), KEY
        aesdeclast KEY, STATE
-       ret
+       RET
 SYM_FUNC_END(_aesni_dec1)
 
 /*
@@ -2312,7 +2312,7 @@ SYM_FUNC_START_LOCAL(_aesni_dec4)
        aesdeclast KEY, STATE2
        aesdeclast KEY, STATE3
        aesdeclast KEY, STATE4
-       ret
+       RET
 SYM_FUNC_END(_aesni_dec4)
 
 /*
@@ -2372,7 +2372,7 @@ SYM_FUNC_START(aesni_ecb_enc)
        popl LEN
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_ecb_enc)
 
 /*
@@ -2433,7 +2433,7 @@ SYM_FUNC_START(aesni_ecb_dec)
        popl LEN
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_ecb_dec)
 
 /*
@@ -2477,7 +2477,7 @@ SYM_FUNC_START(aesni_cbc_enc)
        popl IVP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_cbc_enc)
 
 /*
@@ -2570,7 +2570,7 @@ SYM_FUNC_START(aesni_cbc_dec)
        popl IVP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_cbc_dec)
 
 /*
@@ -2627,7 +2627,7 @@ SYM_FUNC_START(aesni_cts_cbc_enc)
        popl IVP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_cts_cbc_enc)
 
 /*
@@ -2688,7 +2688,7 @@ SYM_FUNC_START(aesni_cts_cbc_dec)
        popl IVP
 #endif
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_cts_cbc_dec)
 
 .pushsection .rodata
@@ -2725,7 +2725,7 @@ SYM_FUNC_START_LOCAL(_aesni_inc_init)
        mov $1, TCTR_LOW
        movq TCTR_LOW, INC
        movq CTR, TCTR_LOW
-       ret
+       RET
 SYM_FUNC_END(_aesni_inc_init)
 
 /*
@@ -2753,7 +2753,7 @@ SYM_FUNC_START_LOCAL(_aesni_inc)
 .Linc_low:
        movaps CTR, IV
        pshufb BSWAP_MASK, IV
-       ret
+       RET
 SYM_FUNC_END(_aesni_inc)
 
 /*
@@ -2816,7 +2816,7 @@ SYM_FUNC_START(aesni_ctr_enc)
        movups IV, (IVP)
 .Lctr_enc_just_ret:
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(aesni_ctr_enc)
 
 #endif
@@ -2932,7 +2932,7 @@ SYM_FUNC_START(aesni_xts_encrypt)
        popl IVP
 #endif
        FRAME_END
-       ret
+       RET
 
 .Lxts_enc_1x:
        add $64, LEN
@@ -3092,7 +3092,7 @@ SYM_FUNC_START(aesni_xts_decrypt)
        popl IVP
 #endif
        FRAME_END
-       ret
+       RET
 
 .Lxts_dec_1x:
        add $64, LEN
index 98e3552..0852ab5 100644 (file)
@@ -1767,7 +1767,7 @@ SYM_FUNC_START(aesni_gcm_init_avx_gen2)
         FUNC_SAVE
         INIT GHASH_MUL_AVX, PRECOMPUTE_AVX
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_init_avx_gen2)
 
 ###############################################################################
@@ -1788,15 +1788,15 @@ SYM_FUNC_START(aesni_gcm_enc_update_avx_gen2)
         # must be 192
         GCM_ENC_DEC INITIAL_BLOCKS_AVX, GHASH_8_ENCRYPT_8_PARALLEL_AVX, GHASH_LAST_8_AVX, GHASH_MUL_AVX, ENC, 11
         FUNC_RESTORE
-        ret
+        RET
 key_128_enc_update:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX, GHASH_8_ENCRYPT_8_PARALLEL_AVX, GHASH_LAST_8_AVX, GHASH_MUL_AVX, ENC, 9
         FUNC_RESTORE
-        ret
+        RET
 key_256_enc_update:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX, GHASH_8_ENCRYPT_8_PARALLEL_AVX, GHASH_LAST_8_AVX, GHASH_MUL_AVX, ENC, 13
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_enc_update_avx_gen2)
 
 ###############################################################################
@@ -1817,15 +1817,15 @@ SYM_FUNC_START(aesni_gcm_dec_update_avx_gen2)
         # must be 192
         GCM_ENC_DEC INITIAL_BLOCKS_AVX, GHASH_8_ENCRYPT_8_PARALLEL_AVX, GHASH_LAST_8_AVX, GHASH_MUL_AVX, DEC, 11
         FUNC_RESTORE
-        ret
+        RET
 key_128_dec_update:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX, GHASH_8_ENCRYPT_8_PARALLEL_AVX, GHASH_LAST_8_AVX, GHASH_MUL_AVX, DEC, 9
         FUNC_RESTORE
-        ret
+        RET
 key_256_dec_update:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX, GHASH_8_ENCRYPT_8_PARALLEL_AVX, GHASH_LAST_8_AVX, GHASH_MUL_AVX, DEC, 13
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_dec_update_avx_gen2)
 
 ###############################################################################
@@ -1846,15 +1846,15 @@ SYM_FUNC_START(aesni_gcm_finalize_avx_gen2)
         # must be 192
         GCM_COMPLETE GHASH_MUL_AVX, 11, arg3, arg4
         FUNC_RESTORE
-        ret
+        RET
 key_128_finalize:
         GCM_COMPLETE GHASH_MUL_AVX, 9, arg3, arg4
         FUNC_RESTORE
-        ret
+        RET
 key_256_finalize:
         GCM_COMPLETE GHASH_MUL_AVX, 13, arg3, arg4
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_finalize_avx_gen2)
 
 ###############################################################################
@@ -2735,7 +2735,7 @@ SYM_FUNC_START(aesni_gcm_init_avx_gen4)
         FUNC_SAVE
         INIT GHASH_MUL_AVX2, PRECOMPUTE_AVX2
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_init_avx_gen4)
 
 ###############################################################################
@@ -2756,15 +2756,15 @@ SYM_FUNC_START(aesni_gcm_enc_update_avx_gen4)
         # must be 192
         GCM_ENC_DEC INITIAL_BLOCKS_AVX2, GHASH_8_ENCRYPT_8_PARALLEL_AVX2, GHASH_LAST_8_AVX2, GHASH_MUL_AVX2, ENC, 11
         FUNC_RESTORE
-       ret
+       RET
 key_128_enc_update4:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX2, GHASH_8_ENCRYPT_8_PARALLEL_AVX2, GHASH_LAST_8_AVX2, GHASH_MUL_AVX2, ENC, 9
         FUNC_RESTORE
-       ret
+       RET
 key_256_enc_update4:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX2, GHASH_8_ENCRYPT_8_PARALLEL_AVX2, GHASH_LAST_8_AVX2, GHASH_MUL_AVX2, ENC, 13
         FUNC_RESTORE
-       ret
+       RET
 SYM_FUNC_END(aesni_gcm_enc_update_avx_gen4)
 
 ###############################################################################
@@ -2785,15 +2785,15 @@ SYM_FUNC_START(aesni_gcm_dec_update_avx_gen4)
         # must be 192
         GCM_ENC_DEC INITIAL_BLOCKS_AVX2, GHASH_8_ENCRYPT_8_PARALLEL_AVX2, GHASH_LAST_8_AVX2, GHASH_MUL_AVX2, DEC, 11
         FUNC_RESTORE
-        ret
+        RET
 key_128_dec_update4:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX2, GHASH_8_ENCRYPT_8_PARALLEL_AVX2, GHASH_LAST_8_AVX2, GHASH_MUL_AVX2, DEC, 9
         FUNC_RESTORE
-        ret
+        RET
 key_256_dec_update4:
         GCM_ENC_DEC INITIAL_BLOCKS_AVX2, GHASH_8_ENCRYPT_8_PARALLEL_AVX2, GHASH_LAST_8_AVX2, GHASH_MUL_AVX2, DEC, 13
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_dec_update_avx_gen4)
 
 ###############################################################################
@@ -2814,13 +2814,13 @@ SYM_FUNC_START(aesni_gcm_finalize_avx_gen4)
         # must be 192
         GCM_COMPLETE GHASH_MUL_AVX2, 11, arg3, arg4
         FUNC_RESTORE
-        ret
+        RET
 key_128_finalize4:
         GCM_COMPLETE GHASH_MUL_AVX2, 9, arg3, arg4
         FUNC_RESTORE
-        ret
+        RET
 key_256_finalize4:
         GCM_COMPLETE GHASH_MUL_AVX2, 13, arg3, arg4
         FUNC_RESTORE
-        ret
+        RET
 SYM_FUNC_END(aesni_gcm_finalize_avx_gen4)
index 2ca7997..b50b35f 100644 (file)
@@ -171,7 +171,7 @@ SYM_FUNC_START(blake2s_compress_ssse3)
        movdqu          %xmm1,0x10(%rdi)
        movdqu          %xmm14,0x20(%rdi)
 .Lendofloop:
-       ret
+       RET
 SYM_FUNC_END(blake2s_compress_ssse3)
 
 #ifdef CONFIG_AS_AVX512
@@ -251,6 +251,6 @@ SYM_FUNC_START(blake2s_compress_avx512)
        vmovdqu         %xmm1,0x10(%rdi)
        vmovdqu         %xmm4,0x20(%rdi)
        vzeroupper
-       retq
+       RET
 SYM_FUNC_END(blake2s_compress_avx512)
 #endif /* CONFIG_AS_AVX512 */
index 4222ac6..802d715 100644 (file)
@@ -135,10 +135,10 @@ SYM_FUNC_START(__blowfish_enc_blk)
        jnz .L__enc_xor;
 
        write_block();
-       ret;
+       RET;
 .L__enc_xor:
        xor_block();
-       ret;
+       RET;
 SYM_FUNC_END(__blowfish_enc_blk)
 
 SYM_FUNC_START(blowfish_dec_blk)
@@ -170,7 +170,7 @@ SYM_FUNC_START(blowfish_dec_blk)
 
        movq %r11, %r12;
 
-       ret;
+       RET;
 SYM_FUNC_END(blowfish_dec_blk)
 
 /**********************************************************************
@@ -322,14 +322,14 @@ SYM_FUNC_START(__blowfish_enc_blk_4way)
 
        popq %rbx;
        popq %r12;
-       ret;
+       RET;
 
 .L__enc_xor4:
        xor_block4();
 
        popq %rbx;
        popq %r12;
-       ret;
+       RET;
 SYM_FUNC_END(__blowfish_enc_blk_4way)
 
 SYM_FUNC_START(blowfish_dec_blk_4way)
@@ -364,5 +364,5 @@ SYM_FUNC_START(blowfish_dec_blk_4way)
        popq %rbx;
        popq %r12;
 
-       ret;
+       RET;
 SYM_FUNC_END(blowfish_dec_blk_4way)
index e2a0e0f..2e1658d 100644 (file)
@@ -192,7 +192,7 @@ SYM_FUNC_START_LOCAL(roundsm16_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_c
        roundsm16(%xmm0, %xmm1, %xmm2, %xmm3, %xmm4, %xmm5, %xmm6, %xmm7,
                  %xmm8, %xmm9, %xmm10, %xmm11, %xmm12, %xmm13, %xmm14, %xmm15,
                  %rcx, (%r9));
-       ret;
+       RET;
 SYM_FUNC_END(roundsm16_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_cd)
 
 .align 8
@@ -200,7 +200,7 @@ SYM_FUNC_START_LOCAL(roundsm16_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_a
        roundsm16(%xmm4, %xmm5, %xmm6, %xmm7, %xmm0, %xmm1, %xmm2, %xmm3,
                  %xmm12, %xmm13, %xmm14, %xmm15, %xmm8, %xmm9, %xmm10, %xmm11,
                  %rax, (%r9));
-       ret;
+       RET;
 SYM_FUNC_END(roundsm16_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab)
 
 /*
@@ -778,7 +778,7 @@ SYM_FUNC_START_LOCAL(__camellia_enc_blk16)
                    %xmm15, (key_table)(CTX, %r8, 8), (%rax), 1 * 16(%rax));
 
        FRAME_END
-       ret;
+       RET;
 
 .align 8
 .Lenc_max32:
@@ -865,7 +865,7 @@ SYM_FUNC_START_LOCAL(__camellia_dec_blk16)
                    %xmm15, (key_table)(CTX), (%rax), 1 * 16(%rax));
 
        FRAME_END
-       ret;
+       RET;
 
 .align 8
 .Ldec_max32:
@@ -906,7 +906,7 @@ SYM_FUNC_START(camellia_ecb_enc_16way)
                     %xmm8, %rsi);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(camellia_ecb_enc_16way)
 
 SYM_FUNC_START(camellia_ecb_dec_16way)
@@ -936,7 +936,7 @@ SYM_FUNC_START(camellia_ecb_dec_16way)
                     %xmm8, %rsi);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(camellia_ecb_dec_16way)
 
 SYM_FUNC_START(camellia_cbc_dec_16way)
@@ -987,5 +987,5 @@ SYM_FUNC_START(camellia_cbc_dec_16way)
                     %xmm8, %rsi);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(camellia_cbc_dec_16way)
index 706f708..0e4e9ab 100644 (file)
@@ -226,7 +226,7 @@ SYM_FUNC_START_LOCAL(roundsm32_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_c
        roundsm32(%ymm0, %ymm1, %ymm2, %ymm3, %ymm4, %ymm5, %ymm6, %ymm7,
                  %ymm8, %ymm9, %ymm10, %ymm11, %ymm12, %ymm13, %ymm14, %ymm15,
                  %rcx, (%r9));
-       ret;
+       RET;
 SYM_FUNC_END(roundsm32_x0_x1_x2_x3_x4_x5_x6_x7_y0_y1_y2_y3_y4_y5_y6_y7_cd)
 
 .align 8
@@ -234,7 +234,7 @@ SYM_FUNC_START_LOCAL(roundsm32_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_a
        roundsm32(%ymm4, %ymm5, %ymm6, %ymm7, %ymm0, %ymm1, %ymm2, %ymm3,
                  %ymm12, %ymm13, %ymm14, %ymm15, %ymm8, %ymm9, %ymm10, %ymm11,
                  %rax, (%r9));
-       ret;
+       RET;
 SYM_FUNC_END(roundsm32_x4_x5_x6_x7_x0_x1_x2_x3_y4_y5_y6_y7_y0_y1_y2_y3_ab)
 
 /*
@@ -814,7 +814,7 @@ SYM_FUNC_START_LOCAL(__camellia_enc_blk32)
                    %ymm15, (key_table)(CTX, %r8, 8), (%rax), 1 * 32(%rax));
 
        FRAME_END
-       ret;
+       RET;
 
 .align 8
 .Lenc_max32:
@@ -901,7 +901,7 @@ SYM_FUNC_START_LOCAL(__camellia_dec_blk32)
                    %ymm15, (key_table)(CTX), (%rax), 1 * 32(%rax));
 
        FRAME_END
-       ret;
+       RET;
 
 .align 8
 .Ldec_max32:
@@ -946,7 +946,7 @@ SYM_FUNC_START(camellia_ecb_enc_32way)
        vzeroupper;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(camellia_ecb_enc_32way)
 
 SYM_FUNC_START(camellia_ecb_dec_32way)
@@ -980,7 +980,7 @@ SYM_FUNC_START(camellia_ecb_dec_32way)
        vzeroupper;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(camellia_ecb_dec_32way)
 
 SYM_FUNC_START(camellia_cbc_dec_32way)
@@ -1047,5 +1047,5 @@ SYM_FUNC_START(camellia_cbc_dec_32way)
 
        addq $(16 * 32), %rsp;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(camellia_cbc_dec_32way)
index 1372e64..347c059 100644 (file)
@@ -213,13 +213,13 @@ SYM_FUNC_START(__camellia_enc_blk)
        enc_outunpack(mov, RT1);
 
        movq RR12, %r12;
-       ret;
+       RET;
 
 .L__enc_xor:
        enc_outunpack(xor, RT1);
 
        movq RR12, %r12;
-       ret;
+       RET;
 SYM_FUNC_END(__camellia_enc_blk)
 
 SYM_FUNC_START(camellia_dec_blk)
@@ -257,7 +257,7 @@ SYM_FUNC_START(camellia_dec_blk)
        dec_outunpack();
 
        movq RR12, %r12;
-       ret;
+       RET;
 SYM_FUNC_END(camellia_dec_blk)
 
 /**********************************************************************
@@ -448,14 +448,14 @@ SYM_FUNC_START(__camellia_enc_blk_2way)
 
        movq RR12, %r12;
        popq %rbx;
-       ret;
+       RET;
 
 .L__enc2_xor:
        enc_outunpack2(xor, RT2);
 
        movq RR12, %r12;
        popq %rbx;
-       ret;
+       RET;
 SYM_FUNC_END(__camellia_enc_blk_2way)
 
 SYM_FUNC_START(camellia_dec_blk_2way)
@@ -495,5 +495,5 @@ SYM_FUNC_START(camellia_dec_blk_2way)
 
        movq RR12, %r12;
        movq RXOR, %rbx;
-       ret;
+       RET;
 SYM_FUNC_END(camellia_dec_blk_2way)
index 8a6181b..b258af4 100644 (file)
@@ -279,7 +279,7 @@ SYM_FUNC_START_LOCAL(__cast5_enc_blk16)
        outunpack_blocks(RR3, RL3, RTMP, RX, RKM);
        outunpack_blocks(RR4, RL4, RTMP, RX, RKM);
 
-       ret;
+       RET;
 SYM_FUNC_END(__cast5_enc_blk16)
 
 .align 16
@@ -352,7 +352,7 @@ SYM_FUNC_START_LOCAL(__cast5_dec_blk16)
        outunpack_blocks(RR3, RL3, RTMP, RX, RKM);
        outunpack_blocks(RR4, RL4, RTMP, RX, RKM);
 
-       ret;
+       RET;
 
 .L__skip_dec:
        vpsrldq $4, RKR, RKR;
@@ -393,7 +393,7 @@ SYM_FUNC_START(cast5_ecb_enc_16way)
 
        popq %r15;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast5_ecb_enc_16way)
 
 SYM_FUNC_START(cast5_ecb_dec_16way)
@@ -431,7 +431,7 @@ SYM_FUNC_START(cast5_ecb_dec_16way)
 
        popq %r15;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast5_ecb_dec_16way)
 
 SYM_FUNC_START(cast5_cbc_dec_16way)
@@ -483,7 +483,7 @@ SYM_FUNC_START(cast5_cbc_dec_16way)
        popq %r15;
        popq %r12;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast5_cbc_dec_16way)
 
 SYM_FUNC_START(cast5_ctr_16way)
@@ -559,5 +559,5 @@ SYM_FUNC_START(cast5_ctr_16way)
        popq %r15;
        popq %r12;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast5_ctr_16way)
index fbddcec..82b716f 100644 (file)
@@ -289,7 +289,7 @@ SYM_FUNC_START_LOCAL(__cast6_enc_blk8)
        outunpack_blocks(RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
        outunpack_blocks(RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
 
-       ret;
+       RET;
 SYM_FUNC_END(__cast6_enc_blk8)
 
 .align 8
@@ -336,7 +336,7 @@ SYM_FUNC_START_LOCAL(__cast6_dec_blk8)
        outunpack_blocks(RA1, RB1, RC1, RD1, RTMP, RX, RKRF, RKM);
        outunpack_blocks(RA2, RB2, RC2, RD2, RTMP, RX, RKRF, RKM);
 
-       ret;
+       RET;
 SYM_FUNC_END(__cast6_dec_blk8)
 
 SYM_FUNC_START(cast6_ecb_enc_8way)
@@ -359,7 +359,7 @@ SYM_FUNC_START(cast6_ecb_enc_8way)
 
        popq %r15;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast6_ecb_enc_8way)
 
 SYM_FUNC_START(cast6_ecb_dec_8way)
@@ -382,7 +382,7 @@ SYM_FUNC_START(cast6_ecb_dec_8way)
 
        popq %r15;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast6_ecb_dec_8way)
 
 SYM_FUNC_START(cast6_cbc_dec_8way)
@@ -408,5 +408,5 @@ SYM_FUNC_START(cast6_cbc_dec_8way)
        popq %r15;
        popq %r12;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(cast6_cbc_dec_8way)
index ee9a40a..f3d8fc0 100644 (file)
@@ -193,7 +193,7 @@ SYM_FUNC_START(chacha_2block_xor_avx2)
 
 .Ldone2:
        vzeroupper
-       ret
+       RET
 
 .Lxorpart2:
        # xor remaining bytes from partial register into output
@@ -498,7 +498,7 @@ SYM_FUNC_START(chacha_4block_xor_avx2)
 
 .Ldone4:
        vzeroupper
-       ret
+       RET
 
 .Lxorpart4:
        # xor remaining bytes from partial register into output
@@ -992,7 +992,7 @@ SYM_FUNC_START(chacha_8block_xor_avx2)
 .Ldone8:
        vzeroupper
        lea             -8(%r10),%rsp
-       ret
+       RET
 
 .Lxorpart8:
        # xor remaining bytes from partial register into output
index bb193fd..946f74d 100644 (file)
@@ -166,7 +166,7 @@ SYM_FUNC_START(chacha_2block_xor_avx512vl)
 
 .Ldone2:
        vzeroupper
-       ret
+       RET
 
 .Lxorpart2:
        # xor remaining bytes from partial register into output
@@ -432,7 +432,7 @@ SYM_FUNC_START(chacha_4block_xor_avx512vl)
 
 .Ldone4:
        vzeroupper
-       ret
+       RET
 
 .Lxorpart4:
        # xor remaining bytes from partial register into output
@@ -812,7 +812,7 @@ SYM_FUNC_START(chacha_8block_xor_avx512vl)
 
 .Ldone8:
        vzeroupper
-       ret
+       RET
 
 .Lxorpart8:
        # xor remaining bytes from partial register into output
index ca1788b..7111949 100644 (file)
@@ -108,7 +108,7 @@ SYM_FUNC_START_LOCAL(chacha_permute)
        sub             $2,%r8d
        jnz             .Ldoubleround
 
-       ret
+       RET
 SYM_FUNC_END(chacha_permute)
 
 SYM_FUNC_START(chacha_block_xor_ssse3)
@@ -166,7 +166,7 @@ SYM_FUNC_START(chacha_block_xor_ssse3)
 
 .Ldone:
        FRAME_END
-       ret
+       RET
 
 .Lxorpart:
        # xor remaining bytes from partial register into output
@@ -217,7 +217,7 @@ SYM_FUNC_START(hchacha_block_ssse3)
        movdqu          %xmm3,0x10(%rsi)
 
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(hchacha_block_ssse3)
 
 SYM_FUNC_START(chacha_4block_xor_ssse3)
@@ -762,7 +762,7 @@ SYM_FUNC_START(chacha_4block_xor_ssse3)
 
 .Ldone4:
        lea             -8(%r10),%rsp
-       ret
+       RET
 
 .Lxorpart4:
        # xor remaining bytes from partial register into output
index 6e7d4c4..c392a6e 100644 (file)
@@ -236,5 +236,5 @@ fold_64:
        pxor    %xmm2, %xmm1
        pextrd  $0x01, %xmm1, %eax
 
-       ret
+       RET
 SYM_FUNC_END(crc32_pclmul_le_16)
index ac1f303..80c0d22 100644 (file)
@@ -306,7 +306,7 @@ do_return:
        popq    %rsi
        popq    %rdi
        popq    %rbx
-        ret
+        RET
 SYM_FUNC_END(crc_pcl)
 
 .section       .rodata, "a", @progbits
index b2533d6..721474a 100644 (file)
@@ -257,7 +257,7 @@ SYM_FUNC_START(crc_t10dif_pcl)
        # Final CRC value (x^16 * M(x)) mod G(x) is in low 16 bits of xmm0.
 
        pextrw  $0, %xmm0, %eax
-       ret
+       RET
 
 .align 16
 .Lless_than_256_bytes:
index fac0fdc..f4c760f 100644 (file)
@@ -243,7 +243,7 @@ SYM_FUNC_START(des3_ede_x86_64_crypt_blk)
        popq %r12;
        popq %rbx;
 
-       ret;
+       RET;
 SYM_FUNC_END(des3_ede_x86_64_crypt_blk)
 
 /***********************************************************************
@@ -528,7 +528,7 @@ SYM_FUNC_START(des3_ede_x86_64_crypt_blk_3way)
        popq %r12;
        popq %rbx;
 
-       ret;
+       RET;
 SYM_FUNC_END(des3_ede_x86_64_crypt_blk_3way)
 
 .section       .rodata, "a", @progbits
index 99ac25e..2bf8718 100644 (file)
@@ -85,7 +85,7 @@ SYM_FUNC_START_LOCAL(__clmul_gf128mul_ble)
        psrlq $1, T2
        pxor T2, T1
        pxor T1, DATA
-       ret
+       RET
 SYM_FUNC_END(__clmul_gf128mul_ble)
 
 /* void clmul_ghash_mul(char *dst, const u128 *shash) */
@@ -99,7 +99,7 @@ SYM_FUNC_START(clmul_ghash_mul)
        pshufb BSWAP, DATA
        movups DATA, (%rdi)
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(clmul_ghash_mul)
 
 /*
@@ -128,5 +128,5 @@ SYM_FUNC_START(clmul_ghash_update)
        movups DATA, (%rdi)
 .Lupdate_just_ret:
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(clmul_ghash_update)
index b22c7b9..6a0b15e 100644 (file)
@@ -153,5 +153,5 @@ SYM_FUNC_START(nh_avx2)
        vpaddq          T1, T0, T0
        vpaddq          T4, T0, T0
        vmovdqu         T0, (HASH)
-       ret
+       RET
 SYM_FUNC_END(nh_avx2)
index d7ae22d..34c567b 100644 (file)
@@ -119,5 +119,5 @@ SYM_FUNC_START(nh_sse2)
        paddq           PASS2_SUMS, T1
        movdqu          T0, 0x00(HASH)
        movdqu          T1, 0x10(HASH)
-       ret
+       RET
 SYM_FUNC_END(nh_sse2)
index b7ee24d..82f2313 100644 (file)
@@ -601,7 +601,7 @@ SYM_FUNC_START_LOCAL(__serpent_enc_blk8_avx)
        write_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2);
        write_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__serpent_enc_blk8_avx)
 
 .align 8
@@ -655,7 +655,7 @@ SYM_FUNC_START_LOCAL(__serpent_dec_blk8_avx)
        write_blocks(RC1, RD1, RB1, RE1, RK0, RK1, RK2);
        write_blocks(RC2, RD2, RB2, RE2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__serpent_dec_blk8_avx)
 
 SYM_FUNC_START(serpent_ecb_enc_8way_avx)
@@ -673,7 +673,7 @@ SYM_FUNC_START(serpent_ecb_enc_8way_avx)
        store_8way(%rsi, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(serpent_ecb_enc_8way_avx)
 
 SYM_FUNC_START(serpent_ecb_dec_8way_avx)
@@ -691,7 +691,7 @@ SYM_FUNC_START(serpent_ecb_dec_8way_avx)
        store_8way(%rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(serpent_ecb_dec_8way_avx)
 
 SYM_FUNC_START(serpent_cbc_dec_8way_avx)
@@ -709,5 +709,5 @@ SYM_FUNC_START(serpent_cbc_dec_8way_avx)
        store_cbc_8way(%rdx, %rsi, RC1, RD1, RB1, RE1, RC2, RD2, RB2, RE2);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(serpent_cbc_dec_8way_avx)
index 9161b6e..8ea34c9 100644 (file)
@@ -601,7 +601,7 @@ SYM_FUNC_START_LOCAL(__serpent_enc_blk16)
        write_blocks(RA1, RB1, RC1, RD1, RK0, RK1, RK2);
        write_blocks(RA2, RB2, RC2, RD2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__serpent_enc_blk16)
 
 .align 8
@@ -655,7 +655,7 @@ SYM_FUNC_START_LOCAL(__serpent_dec_blk16)
        write_blocks(RC1, RD1, RB1, RE1, RK0, RK1, RK2);
        write_blocks(RC2, RD2, RB2, RE2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__serpent_dec_blk16)
 
 SYM_FUNC_START(serpent_ecb_enc_16way)
@@ -677,7 +677,7 @@ SYM_FUNC_START(serpent_ecb_enc_16way)
        vzeroupper;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(serpent_ecb_enc_16way)
 
 SYM_FUNC_START(serpent_ecb_dec_16way)
@@ -699,7 +699,7 @@ SYM_FUNC_START(serpent_ecb_dec_16way)
        vzeroupper;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(serpent_ecb_dec_16way)
 
 SYM_FUNC_START(serpent_cbc_dec_16way)
@@ -722,5 +722,5 @@ SYM_FUNC_START(serpent_cbc_dec_16way)
        vzeroupper;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(serpent_cbc_dec_16way)
index 6379b99..8ccb03a 100644 (file)
@@ -553,12 +553,12 @@ SYM_FUNC_START(__serpent_enc_blk_4way)
 
        write_blocks(%eax, RA, RB, RC, RD, RT0, RT1, RE);
 
-       ret;
+       RET;
 
 .L__enc_xor4:
        xor_blocks(%eax, RA, RB, RC, RD, RT0, RT1, RE);
 
-       ret;
+       RET;
 SYM_FUNC_END(__serpent_enc_blk_4way)
 
 SYM_FUNC_START(serpent_dec_blk_4way)
@@ -612,5 +612,5 @@ SYM_FUNC_START(serpent_dec_blk_4way)
        movl arg_dst(%esp), %eax;
        write_blocks(%eax, RC, RD, RB, RE, RT0, RT1, RA);
 
-       ret;
+       RET;
 SYM_FUNC_END(serpent_dec_blk_4way)
index efb6dc1..e0998a0 100644 (file)
@@ -675,13 +675,13 @@ SYM_FUNC_START(__serpent_enc_blk_8way)
        write_blocks(%rsi, RA1, RB1, RC1, RD1, RK0, RK1, RK2);
        write_blocks(%rax, RA2, RB2, RC2, RD2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 
 .L__enc_xor8:
        xor_blocks(%rsi, RA1, RB1, RC1, RD1, RK0, RK1, RK2);
        xor_blocks(%rax, RA2, RB2, RC2, RD2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__serpent_enc_blk_8way)
 
 SYM_FUNC_START(serpent_dec_blk_8way)
@@ -735,5 +735,5 @@ SYM_FUNC_START(serpent_dec_blk_8way)
        write_blocks(%rsi, RC1, RD1, RB1, RE1, RK0, RK1, RK2);
        write_blocks(%rax, RC2, RD2, RB2, RE2, RK0, RK1, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(serpent_dec_blk_8way)
index 5eed620..a96b2fd 100644 (file)
@@ -674,7 +674,7 @@ _loop3:
        pop     %r12
        pop     %rbx
 
-       ret
+       RET
 
        SYM_FUNC_END(\name)
 .endm
index 5d8415f..2f94ec0 100644 (file)
@@ -290,7 +290,7 @@ SYM_FUNC_START(sha1_ni_transform)
        mov             %rbp, %rsp
        pop             %rbp
 
-       ret
+       RET
 SYM_FUNC_END(sha1_ni_transform)
 
 .section       .rodata.cst16.PSHUFFLE_BYTE_FLIP_MASK, "aM", @progbits, 16
index d25668d..263f916 100644 (file)
@@ -99,7 +99,7 @@
        pop     %rbp
        pop     %r12
        pop     %rbx
-       ret
+       RET
 
        SYM_FUNC_END(\name)
 .endm
index 4739cd3..3baa1ec 100644 (file)
@@ -458,7 +458,7 @@ done_hash:
        popq    %r13
        popq    %r12
        popq    %rbx
-       ret
+       RET
 SYM_FUNC_END(sha256_transform_avx)
 
 .section       .rodata.cst256.K256, "aM", @progbits, 256
index 4087f74..9bcdbc4 100644 (file)
@@ -710,7 +710,7 @@ done_hash:
        popq    %r13
        popq    %r12
        popq    %rbx
-       ret
+       RET
 SYM_FUNC_END(sha256_transform_rorx)
 
 .section       .rodata.cst512.K256, "aM", @progbits, 512
index ddfa863..c4a5db6 100644 (file)
@@ -472,7 +472,7 @@ done_hash:
        popq    %r12
        popq    %rbx
 
-       ret
+       RET
 SYM_FUNC_END(sha256_transform_ssse3)
 
 .section       .rodata.cst256.K256, "aM", @progbits, 256
index 7abade0..94d50dd 100644 (file)
@@ -326,7 +326,7 @@ SYM_FUNC_START(sha256_ni_transform)
 
 .Ldone_hash:
 
-       ret
+       RET
 SYM_FUNC_END(sha256_ni_transform)
 
 .section       .rodata.cst256.K256, "aM", @progbits, 256
index 3d8f0fd..1fefe6d 100644 (file)
@@ -361,7 +361,7 @@ updateblock:
        pop     %rbx
 
 nowork:
-       ret
+       RET
 SYM_FUNC_END(sha512_transform_avx)
 
 ########################################################################
index 072cb0f..5cdaab7 100644 (file)
@@ -679,7 +679,7 @@ done_hash:
        pop     %r12
        pop     %rbx
 
-       ret
+       RET
 SYM_FUNC_END(sha512_transform_rorx)
 
 ########################################################################
index bd51c90..b84c22e 100644 (file)
@@ -363,7 +363,7 @@ updateblock:
        pop     %rbx
 
 nowork:
-       ret
+       RET
 SYM_FUNC_END(sha512_transform_ssse3)
 
 ########################################################################
index 1cc72b4..4767ab6 100644 (file)
@@ -246,7 +246,7 @@ SYM_FUNC_START(sm4_aesni_avx_crypt4)
 .Lblk4_store_output_done:
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx_crypt4)
 
 .align 8
@@ -356,7 +356,7 @@ SYM_FUNC_START_LOCAL(__sm4_crypt_blk8)
        vpshufb RTMP2, RB3, RB3;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(__sm4_crypt_blk8)
 
 /*
@@ -412,7 +412,7 @@ SYM_FUNC_START(sm4_aesni_avx_crypt8)
 .Lblk8_store_output_done:
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx_crypt8)
 
 /*
@@ -487,7 +487,7 @@ SYM_FUNC_START(sm4_aesni_avx_ctr_enc_blk8)
 
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx_ctr_enc_blk8)
 
 /*
@@ -537,7 +537,7 @@ SYM_FUNC_START(sm4_aesni_avx_cbc_dec_blk8)
 
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx_cbc_dec_blk8)
 
 /*
@@ -590,5 +590,5 @@ SYM_FUNC_START(sm4_aesni_avx_cfb_dec_blk8)
 
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx_cfb_dec_blk8)
index 9c5d3f3..4732fe8 100644 (file)
@@ -268,7 +268,7 @@ SYM_FUNC_START_LOCAL(__sm4_crypt_blk16)
        vpshufb RTMP2, RB3, RB3;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(__sm4_crypt_blk16)
 
 #define inc_le128(x, minus_one, tmp) \
@@ -387,7 +387,7 @@ SYM_FUNC_START(sm4_aesni_avx2_ctr_enc_blk16)
 
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx2_ctr_enc_blk16)
 
 /*
@@ -441,7 +441,7 @@ SYM_FUNC_START(sm4_aesni_avx2_cbc_dec_blk16)
 
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx2_cbc_dec_blk16)
 
 /*
@@ -497,5 +497,5 @@ SYM_FUNC_START(sm4_aesni_avx2_cfb_dec_blk16)
 
        vzeroall;
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(sm4_aesni_avx2_cfb_dec_blk16)
index 37e63b3..31f9b2e 100644 (file)
@@ -267,7 +267,7 @@ SYM_FUNC_START_LOCAL(__twofish_enc_blk8)
        outunpack_blocks(RC1, RD1, RA1, RB1, RK1, RX0, RY0, RK2);
        outunpack_blocks(RC2, RD2, RA2, RB2, RK1, RX0, RY0, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__twofish_enc_blk8)
 
 .align 8
@@ -307,7 +307,7 @@ SYM_FUNC_START_LOCAL(__twofish_dec_blk8)
        outunpack_blocks(RA1, RB1, RC1, RD1, RK1, RX0, RY0, RK2);
        outunpack_blocks(RA2, RB2, RC2, RD2, RK1, RX0, RY0, RK2);
 
-       ret;
+       RET;
 SYM_FUNC_END(__twofish_dec_blk8)
 
 SYM_FUNC_START(twofish_ecb_enc_8way)
@@ -327,7 +327,7 @@ SYM_FUNC_START(twofish_ecb_enc_8way)
        store_8way(%r11, RC1, RD1, RA1, RB1, RC2, RD2, RA2, RB2);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(twofish_ecb_enc_8way)
 
 SYM_FUNC_START(twofish_ecb_dec_8way)
@@ -347,7 +347,7 @@ SYM_FUNC_START(twofish_ecb_dec_8way)
        store_8way(%r11, RA1, RB1, RC1, RD1, RA2, RB2, RC2, RD2);
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(twofish_ecb_dec_8way)
 
 SYM_FUNC_START(twofish_cbc_dec_8way)
@@ -372,5 +372,5 @@ SYM_FUNC_START(twofish_cbc_dec_8way)
        popq %r12;
 
        FRAME_END
-       ret;
+       RET;
 SYM_FUNC_END(twofish_cbc_dec_8way)
index a6f09e4..3abcad6 100644 (file)
@@ -260,7 +260,7 @@ SYM_FUNC_START(twofish_enc_blk)
        pop     %ebx
        pop     %ebp
        mov     $1,     %eax
-       ret
+       RET
 SYM_FUNC_END(twofish_enc_blk)
 
 SYM_FUNC_START(twofish_dec_blk)
@@ -317,5 +317,5 @@ SYM_FUNC_START(twofish_dec_blk)
        pop     %ebx
        pop     %ebp
        mov     $1,     %eax
-       ret
+       RET
 SYM_FUNC_END(twofish_dec_blk)
index bca4cea..d2288bf 100644 (file)
@@ -258,7 +258,7 @@ SYM_FUNC_START(__twofish_enc_blk_3way)
        popq %rbx;
        popq %r12;
        popq %r13;
-       ret;
+       RET;
 
 .L__enc_xor3:
        outunpack_enc3(xor);
@@ -266,7 +266,7 @@ SYM_FUNC_START(__twofish_enc_blk_3way)
        popq %rbx;
        popq %r12;
        popq %r13;
-       ret;
+       RET;
 SYM_FUNC_END(__twofish_enc_blk_3way)
 
 SYM_FUNC_START(twofish_dec_blk_3way)
@@ -301,5 +301,5 @@ SYM_FUNC_START(twofish_dec_blk_3way)
        popq %rbx;
        popq %r12;
        popq %r13;
-       ret;
+       RET;
 SYM_FUNC_END(twofish_dec_blk_3way)
index d2e5623..775af29 100644 (file)
@@ -252,7 +252,7 @@ SYM_FUNC_START(twofish_enc_blk)
 
        popq    R1
        movl    $1,%eax
-       ret
+       RET
 SYM_FUNC_END(twofish_enc_blk)
 
 SYM_FUNC_START(twofish_dec_blk)
@@ -304,5 +304,5 @@ SYM_FUNC_START(twofish_dec_blk)
 
        popq    R1
        movl    $1,%eax
-       ret
+       RET
 SYM_FUNC_END(twofish_dec_blk)
index ccb9d32..a7ec22b 100644 (file)
 1:     popl    %ds
 2:     popl    %es
 3:     popl    %fs
-       addl    $(4 + \pop), %esp       /* pop the unused "gs" slot */
+4:     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)
+
+       /*
+        * There is no _ASM_EXTABLE_TYPE_REG() for ASM, however since this is
+        * ASM the registers are known and we can trivially hard-code them.
+        */
+       _ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_POP_ZERO|EX_REG_DS)
+       _ASM_EXTABLE_TYPE(2b, 3b, EX_TYPE_POP_ZERO|EX_REG_ES)
+       _ASM_EXTABLE_TYPE(3b, 4b, EX_TYPE_POP_ZERO|EX_REG_FS)
 .endm
 
 .macro RESTORE_ALL_NMI cr3_reg:req pop=0
@@ -740,7 +737,7 @@ SYM_FUNC_START(schedule_tail_wrapper)
        popl    %eax
 
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(schedule_tail_wrapper)
 .popsection
 
@@ -925,10 +922,8 @@ SYM_FUNC_START(entry_SYSENTER_32)
        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:
@@ -996,8 +991,7 @@ restore_all_switch_stack:
         */
        iret
 
-.section .fixup, "ax"
-SYM_CODE_START(asm_iret_error)
+.Lasm_iret_error:
        pushl   $0                              # no error code
        pushl   $iret_error
 
@@ -1014,9 +1008,8 @@ SYM_CODE_START(asm_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
index 97b1f84..1ffdbfa 100644 (file)
@@ -738,14 +738,10 @@ SYM_FUNC_START(asm_load_gs_index)
 2:     ALTERNATIVE "", "mfence", X86_BUG_SWAPGS_FENCE
        swapgs
        FRAME_END
-       ret
-SYM_FUNC_END(asm_load_gs_index)
-EXPORT_SYMBOL(asm_load_gs_index)
+       RET
 
-       _ASM_EXTABLE(.Lgs_change, .Lbad_gs)
-       .section .fixup, "ax"
        /* running with kernelgs */
-SYM_CODE_START_LOCAL_NOALIGN(.Lbad_gs)
+.Lbad_gs:
        swapgs                                  /* switch back to user gs */
 .macro ZAP_GS
        /* This can't be a string because the preprocessor needs to see it. */
@@ -756,8 +752,11 @@ SYM_CODE_START_LOCAL_NOALIGN(.Lbad_gs)
        xorl    %eax, %eax
        movl    %eax, %gs
        jmp     2b
-SYM_CODE_END(.Lbad_gs)
-       .previous
+
+       _ASM_EXTABLE(.Lgs_change, .Lbad_gs)
+
+SYM_FUNC_END(asm_load_gs_index)
+EXPORT_SYMBOL(asm_load_gs_index)
 
 #ifdef CONFIG_XEN_PV
 /*
@@ -889,7 +888,7 @@ SYM_CODE_START_LOCAL(paranoid_entry)
         * is needed here.
         */
        SAVE_AND_SET_GSBASE scratch_reg=%rax save_reg=%rbx
-       ret
+       RET
 
 .Lparanoid_entry_checkgs:
        /* EBX = 1 -> kernel GSBASE active, no restore required */
@@ -910,7 +909,7 @@ SYM_CODE_START_LOCAL(paranoid_entry)
 .Lparanoid_kernel_gsbase:
 
        FENCE_SWAPGS_KERNEL_ENTRY
-       ret
+       RET
 SYM_CODE_END(paranoid_entry)
 
 /*
@@ -989,7 +988,7 @@ SYM_CODE_START_LOCAL(error_entry)
        movq    %rax, %rsp                      /* switch stack */
        ENCODE_FRAME_POINTER
        pushq   %r12
-       ret
+       RET
 
        /*
         * There are two places in the kernel that can potentially fault with
@@ -1020,7 +1019,7 @@ SYM_CODE_START_LOCAL(error_entry)
         */
 .Lerror_entry_done_lfence:
        FENCE_SWAPGS_KERNEL_ENTRY
-       ret
+       RET
 
 .Lbstep_iret:
        /* Fix truncated RIP */
index f1f96d4..7591bab 100644 (file)
@@ -24,7 +24,7 @@ SYM_CODE_START_NOALIGN(\name)
        popl %edx
        popl %ecx
        popl %eax
-       ret
+       RET
        _ASM_NOKPROBE(\name)
 SYM_CODE_END(\name)
        .endm
index 496b11e..505b488 100644 (file)
@@ -50,7 +50,7 @@ SYM_CODE_START_LOCAL_NOALIGN(__thunk_restore)
        popq %rsi
        popq %rdi
        popq %rbp
-       ret
+       RET
        _ASM_NOKPROBE(__thunk_restore)
 SYM_CODE_END(__thunk_restore)
 #endif
index dc8da76..bafa73f 100644 (file)
@@ -77,7 +77,6 @@ SECTIONS
 
        .text           : {
                *(.text*)
-               *(.fixup)
        }                                               :text   =0x90909090,
 
 
index 6ddd7a9..d33c651 100644 (file)
@@ -78,7 +78,7 @@ SYM_INNER_LABEL(int80_landing_pad, SYM_L_GLOBAL)
        popl    %ecx
        CFI_RESTORE             ecx
        CFI_ADJUST_CFA_OFFSET   -4
-       ret
+       RET
        CFI_ENDPROC
 
        .size __kernel_vsyscall,.-__kernel_vsyscall
index 99dafac..d77d278 100644 (file)
@@ -81,7 +81,7 @@ SYM_FUNC_START(__vdso_sgx_enter_enclave)
        pop     %rbx
        leave
        .cfi_def_cfa            %rsp, 8
-       ret
+       RET
 
        /* The out-of-line code runs with the pre-leave stack frame. */
        .cfi_def_cfa            %rbp, 16
index 2e203f3..15e3515 100644 (file)
@@ -19,17 +19,17 @@ __vsyscall_page:
 
        mov $__NR_gettimeofday, %rax
        syscall
-       ret
+       RET
 
        .balign 1024, 0xcc
        mov $__NR_time, %rax
        syscall
-       ret
+       RET
 
        .balign 1024, 0xcc
        mov $__NR_getcpu, %rax
        syscall
-       ret
+       RET
 
        .balign 4096, 0xcc
 
index 3a16848..c878fed 100644 (file)
 
 #else /* ! __ASSEMBLY__ */
 
+# define DEFINE_EXTABLE_TYPE_REG \
+       ".macro extable_type_reg type:req reg:req\n"                                            \
+       ".set found, 0\n"                                                                       \
+       ".set regnr, 0\n"                                                                       \
+       ".irp rs,rax,rcx,rdx,rbx,rsp,rbp,rsi,rdi,r8,r9,r10,r11,r12,r13,r14,r15\n"               \
+       ".ifc \\reg, %%\\rs\n"                                                                  \
+       ".set found, found+1\n"                                                                 \
+       ".long \\type + (regnr << 8)\n"                                                         \
+       ".endif\n"                                                                              \
+       ".set regnr, regnr+1\n"                                                                 \
+       ".endr\n"                                                                               \
+       ".set regnr, 0\n"                                                                       \
+       ".irp rs,eax,ecx,edx,ebx,esp,ebp,esi,edi,r8d,r9d,r10d,r11d,r12d,r13d,r14d,r15d\n"       \
+       ".ifc \\reg, %%\\rs\n"                                                                  \
+       ".set found, found+1\n"                                                                 \
+       ".long \\type + (regnr << 8)\n"                                                         \
+       ".endif\n"                                                                              \
+       ".set regnr, regnr+1\n"                                                                 \
+       ".endr\n"                                                                               \
+       ".if (found != 1)\n"                                                                    \
+       ".error \"extable_type_reg: bad register argument\"\n"                                  \
+       ".endif\n"                                                                              \
+       ".endm\n"
+
+# define UNDEFINE_EXTABLE_TYPE_REG \
+       ".purgem extable_type_reg\n"
+
 # define _ASM_EXTABLE_TYPE(from, to, type)                     \
        " .pushsection \"__ex_table\",\"a\"\n"                  \
        " .balign 4\n"                                          \
        " .long " __stringify(type) " \n"                       \
        " .popsection\n"
 
+# define _ASM_EXTABLE_TYPE_REG(from, to, type, reg)                            \
+       " .pushsection \"__ex_table\",\"a\"\n"                                  \
+       " .balign 4\n"                                                          \
+       " .long (" #from ") - .\n"                                              \
+       " .long (" #to ") - .\n"                                                \
+       DEFINE_EXTABLE_TYPE_REG                                                 \
+       "extable_type_reg reg=" __stringify(reg) ", type=" __stringify(type) " \n"\
+       UNDEFINE_EXTABLE_TYPE_REG                                               \
+       " .popsection\n"
+
 /* For C file, we already have NOKPROBE_SYMBOL macro */
 
 /*
index 93f400e..155c991 100644 (file)
@@ -21,7 +21,7 @@
  */
 
 struct exception_table_entry {
-       int insn, fixup, type;
+       int insn, fixup, data;
 };
 struct pt_regs;
 
@@ -31,8 +31,8 @@ struct pt_regs;
        do {                                                    \
                (a)->fixup = (b)->fixup + (delta);              \
                (b)->fixup = (tmp).fixup - (delta);             \
-               (a)->type = (b)->type;                          \
-               (b)->type = (tmp).type;                         \
+               (a)->data = (b)->data;                          \
+               (b)->data = (tmp).data;                         \
        } while (0)
 
 extern int fixup_exception(struct pt_regs *regs, int trapnr,
index 409524d..5036226 100644 (file)
@@ -2,6 +2,36 @@
 #ifndef _ASM_X86_EXTABLE_FIXUP_TYPES_H
 #define _ASM_X86_EXTABLE_FIXUP_TYPES_H
 
+/*
+ * Our IMM is signed, as such it must live at the top end of the word. Also,
+ * since C99 hex constants are of ambigious type, force cast the mask to 'int'
+ * so that FIELD_GET() will DTRT and sign extend the value when it extracts it.
+ */
+#define EX_DATA_TYPE_MASK              ((int)0x000000FF)
+#define EX_DATA_REG_MASK               ((int)0x00000F00)
+#define EX_DATA_FLAG_MASK              ((int)0x0000F000)
+#define EX_DATA_IMM_MASK               ((int)0xFFFF0000)
+
+#define EX_DATA_REG_SHIFT              8
+#define EX_DATA_FLAG_SHIFT             12
+#define EX_DATA_IMM_SHIFT              16
+
+#define EX_DATA_REG(reg)               ((reg) << EX_DATA_REG_SHIFT)
+#define EX_DATA_FLAG(flag)             ((flag) << EX_DATA_FLAG_SHIFT)
+#define EX_DATA_IMM(imm)               ((imm) << EX_DATA_IMM_SHIFT)
+
+/* segment regs */
+#define EX_REG_DS                      EX_DATA_REG(8)
+#define EX_REG_ES                      EX_DATA_REG(9)
+#define EX_REG_FS                      EX_DATA_REG(10)
+#define EX_REG_GS                      EX_DATA_REG(11)
+
+/* flags */
+#define EX_FLAG_CLEAR_AX               EX_DATA_FLAG(1)
+#define EX_FLAG_CLEAR_DX               EX_DATA_FLAG(2)
+#define EX_FLAG_CLEAR_AX_DX            EX_DATA_FLAG(3)
+
+/* types */
 #define        EX_TYPE_NONE                     0
 #define        EX_TYPE_DEFAULT                  1
 #define        EX_TYPE_FAULT                    2
 #define        EX_TYPE_COPY                     4
 #define        EX_TYPE_CLEAR_FS                 5
 #define        EX_TYPE_FPU_RESTORE              6
-#define        EX_TYPE_WRMSR                    7
-#define        EX_TYPE_RDMSR                    8
-#define        EX_TYPE_BPF                      9
+#define        EX_TYPE_BPF                      7
+#define        EX_TYPE_WRMSR                    8
+#define        EX_TYPE_RDMSR                    9
+#define        EX_TYPE_WRMSR_SAFE              10 /* reg := -EIO */
+#define        EX_TYPE_RDMSR_SAFE              11 /* reg := -EIO */
+#define        EX_TYPE_WRMSR_IN_MCE            12
+#define        EX_TYPE_RDMSR_IN_MCE            13
+#define        EX_TYPE_DEFAULT_MCE_SAFE        14
+#define        EX_TYPE_FAULT_MCE_SAFE          15
+
+#define        EX_TYPE_POP_REG                 16 /* sp += sizeof(long) */
+#define EX_TYPE_POP_ZERO               (EX_TYPE_POP_REG | EX_DATA_IMM(0))
+
+#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))
 
-#define        EX_TYPE_WRMSR_IN_MCE            10
-#define        EX_TYPE_RDMSR_IN_MCE            11
+#define        EX_TYPE_FAULT_SGX               18
 
-#define        EX_TYPE_DEFAULT_MCE_SAFE        12
-#define        EX_TYPE_FAULT_MCE_SAFE          13
+#define        EX_TYPE_UCOPY_LEN               19 /* cx := reg + imm*cx */
+#define        EX_TYPE_UCOPY_LEN1              (EX_TYPE_UCOPY_LEN | EX_DATA_IMM(1))
+#define        EX_TYPE_UCOPY_LEN4              (EX_TYPE_UCOPY_LEN | EX_DATA_IMM(4))
+#define        EX_TYPE_UCOPY_LEN8              (EX_TYPE_UCOPY_LEN | EX_DATA_IMM(8))
 
 #endif
index f9c0011..99d345b 100644 (file)
@@ -17,13 +17,9 @@ do {                                                         \
        int oldval = 0, ret;                                    \
        asm volatile("1:\t" insn "\n"                           \
                     "2:\n"                                     \
-                    "\t.section .fixup,\"ax\"\n"               \
-                    "3:\tmov\t%3, %1\n"                        \
-                    "\tjmp\t2b\n"                              \
-                    "\t.previous\n"                            \
-                    _ASM_EXTABLE_UA(1b, 3b)                    \
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %1) \
                     : "=r" (oldval), "=r" (ret), "+m" (*uaddr) \
-                    : "i" (-EFAULT), "0" (oparg), "1" (0));    \
+                    : "0" (oparg), "1" (0));   \
        if (ret)                                                \
                goto label;                                     \
        *oval = oldval;                                         \
@@ -39,15 +35,11 @@ do {                                                                \
                     "3:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"     \
                     "\tjnz\t2b\n"                              \
                     "4:\n"                                     \
-                    "\t.section .fixup,\"ax\"\n"               \
-                    "5:\tmov\t%5, %1\n"                        \
-                    "\tjmp\t4b\n"                              \
-                    "\t.previous\n"                            \
-                    _ASM_EXTABLE_UA(1b, 5b)                    \
-                    _ASM_EXTABLE_UA(3b, 5b)                    \
+                    _ASM_EXTABLE_TYPE_REG(1b, 4b, EX_TYPE_EFAULT_REG, %1) \
+                    _ASM_EXTABLE_TYPE_REG(3b, 4b, EX_TYPE_EFAULT_REG, %1) \
                     : "=&a" (oldval), "=&r" (ret),             \
                       "+m" (*uaddr), "=&r" (tem)               \
-                    : "r" (oparg), "i" (-EFAULT), "1" (0));    \
+                    : "r" (oparg), "1" (0));                   \
        if (ret)                                                \
                goto label;                                     \
        *oval = oldval;                                         \
@@ -95,15 +87,11 @@ static inline int futex_atomic_cmpxchg_inatomic(u32 *uval, u32 __user *uaddr,
        if (!user_access_begin(uaddr, sizeof(u32)))
                return -EFAULT;
        asm volatile("\n"
-               "1:\t" LOCK_PREFIX "cmpxchgl %4, %2\n"
+               "1:\t" LOCK_PREFIX "cmpxchgl %3, %2\n"
                "2:\n"
-               "\t.section .fixup, \"ax\"\n"
-               "3:\tmov     %3, %0\n"
-               "\tjmp     2b\n"
-               "\t.previous\n"
-               _ASM_EXTABLE_UA(1b, 3b)
+               _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %0) \
                : "+r" (ret), "=a" (oldval), "+m" (*uaddr)
-               : "i" (-EFAULT), "r" (newval), "1" (oldval)
+               : "r" (newval), "1" (oldval)
                : "memory"
        );
        user_access_end();
index 43785ee..f07faa6 100644 (file)
@@ -15,6 +15,8 @@
 #define INSN_CODE_SEG_OPND_SZ(params) (params & 0xf)
 #define INSN_CODE_SEG_PARAMS(oper_sz, addr_sz) (oper_sz | (addr_sz << 4))
 
+int pt_regs_offset(struct pt_regs *regs, int regno);
+
 bool insn_has_rep_prefix(struct insn *insn);
 void __user *insn_get_addr_ref(struct insn *insn, struct pt_regs *regs);
 int insn_get_modrm_rm_off(struct insn *insn, struct pt_regs *regs);
index 3651117..0309079 100644 (file)
 #define __ALIGN_STR    __stringify(__ALIGN)
 #endif
 
+#ifdef CONFIG_SLS
+#define RET    ret; int3
+#else
+#define RET    ret
+#endif
+
+#else /* __ASSEMBLY__ */
+
+#ifdef CONFIG_SLS
+#define ASM_RET        "ret; int3\n\t"
+#else
+#define ASM_RET        "ret\n\t"
+#endif
+
 #endif /* __ASSEMBLY__ */
 
 #endif /* _ASM_X86_LINKAGE_H */
index f572d0f..e69de29 100644 (file)
@@ -1,15 +0,0 @@
-/* SPDX-License-Identifier: GPL-2.0 */
-#ifndef _ASM_X86_MMX_H
-#define _ASM_X86_MMX_H
-
-/*
- *     MMX 3Dnow! helper operations
- */
-
-#include <linux/types.h>
-
-extern void *_mmx_memcpy(void *to, const void *from, size_t size);
-extern void mmx_clear_page(void *page);
-extern void mmx_copy_page(void *to, void *from);
-
-#endif /* _ASM_X86_MMX_H */
index 6b52182..d42e6c6 100644 (file)
@@ -137,17 +137,11 @@ static inline unsigned long long native_read_msr_safe(unsigned int msr,
 {
        DECLARE_ARGS(val, low, high);
 
-       asm volatile("2: rdmsr ; xor %[err],%[err]\n"
-                    "1:\n\t"
-                    ".section .fixup,\"ax\"\n\t"
-                    "3: mov %[fault],%[err]\n\t"
-                    "xorl %%eax, %%eax\n\t"
-                    "xorl %%edx, %%edx\n\t"
-                    "jmp 1b\n\t"
-                    ".previous\n\t"
-                    _ASM_EXTABLE(2b, 3b)
+       asm volatile("1: rdmsr ; xor %[err],%[err]\n"
+                    "2:\n\t"
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_RDMSR_SAFE, %[err])
                     : [err] "=r" (*err), EAX_EDX_RET(val, low, high)
-                    : "c" (msr), [fault] "i" (-EIO));
+                    : "c" (msr));
        if (tracepoint_enabled(read_msr))
                do_trace_read_msr(msr, EAX_EDX_VAL(val, low, high), *err);
        return EAX_EDX_VAL(val, low, high);
@@ -169,15 +163,11 @@ native_write_msr_safe(unsigned int msr, u32 low, u32 high)
 {
        int err;
 
-       asm volatile("2: wrmsr ; xor %[err],%[err]\n"
-                    "1:\n\t"
-                    ".section .fixup,\"ax\"\n\t"
-                    "3:  mov %[fault],%[err] ; jmp 1b\n\t"
-                    ".previous\n\t"
-                    _ASM_EXTABLE(2b, 3b)
+       asm volatile("1: wrmsr ; xor %[err],%[err]\n"
+                    "2:\n\t"
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_WRMSR_SAFE, %[err])
                     : [err] "=a" (err)
-                    : "c" (msr), "0" (low), "d" (high),
-                      [fault] "i" (-EIO)
+                    : "c" (msr), "0" (low), "d" (high)
                     : "memory");
        if (tracepoint_enabled(write_msr))
                do_trace_write_msr(msr, ((u64)high << 32 | low), err);
index b13f848..df42f8a 100644 (file)
@@ -19,19 +19,6 @@ extern unsigned long __phys_addr(unsigned long);
 #define pfn_valid(pfn)         ((pfn) < max_mapnr)
 #endif /* CONFIG_FLATMEM */
 
-#ifdef CONFIG_X86_USE_3DNOW
-#include <asm/mmx.h>
-
-static inline void clear_page(void *page)
-{
-       mmx_clear_page(page);
-}
-
-static inline void copy_page(void *to, void *from)
-{
-       mmx_copy_page(to, from);
-}
-#else  /* !CONFIG_X86_USE_3DNOW */
 #include <linux/string.h>
 
 static inline void clear_page(void *page)
@@ -43,7 +30,6 @@ static inline void copy_page(void *to, void *from)
 {
        memcpy(to, from, PAGE_SIZE);
 }
-#endif /* CONFIG_X86_USE_3DNOW */
 #endif /* !__ASSEMBLY__ */
 
 #endif /* _ASM_X86_PAGE_32_H */
index 27d2762..0d76502 100644 (file)
@@ -671,7 +671,7 @@ bool __raw_callee_save___native_vcpu_is_preempted(long cpu);
            "call " #func ";"                                           \
            PV_RESTORE_ALL_CALLER_REGS                                  \
            FRAME_END                                                   \
-           "ret;"                                                      \
+           ASM_RET                                                     \
            ".size " PV_THUNK_NAME(func) ", .-" PV_THUNK_NAME(func) ";" \
            ".popsection")
 
index 159622e..1474cf9 100644 (file)
@@ -48,7 +48,7 @@ asm    (".pushsection .text;"
        "jne   .slowpath;"
        "pop   %rdx;"
        FRAME_END
-       "ret;"
+       ASM_RET
        ".slowpath: "
        "push   %rsi;"
        "movzbl %al,%esi;"
@@ -56,7 +56,7 @@ asm    (".pushsection .text;"
        "pop    %rsi;"
        "pop    %rdx;"
        FRAME_END
-       "ret;"
+       ASM_RET
        ".size " PV_UNLOCK ", .-" PV_UNLOCK ";"
        ".popsection");
 
index b2d504f..aff7747 100644 (file)
 # define NEED_CMOV     0
 #endif
 
-#ifdef CONFIG_X86_USE_3DNOW
-# define NEED_3DNOW    (1<<(X86_FEATURE_3DNOW & 31))
-#else
 # define NEED_3DNOW    0
-#endif
 
 #if defined(CONFIG_X86_P6_NOP) || defined(CONFIG_X86_64)
 # define NEED_NOPL     (1<<(X86_FEATURE_NOPL & 31))
index 8dd8e8e..b228c9d 100644 (file)
@@ -307,14 +307,7 @@ do {                                                                       \
                                                                        \
        asm volatile("                                          \n"     \
                     "1:        movl %k0,%%" #seg "             \n"     \
-                                                                       \
-                    ".section .fixup,\"ax\"                    \n"     \
-                    "2:        xorl %k0,%k0                    \n"     \
-                    "          jmp 1b                          \n"     \
-                    ".previous                                 \n"     \
-                                                                       \
-                    _ASM_EXTABLE(1b, 2b)                               \
-                                                                       \
+                    _ASM_EXTABLE_TYPE_REG(1b, 1b, EX_TYPE_ZERO_REG, %k0)\
                     : "+r" (__val) : : "memory");                      \
 } while (0)
 
index 05f3e21..3f9334e 100644 (file)
@@ -45,6 +45,24 @@ enum sgx_encls_function {
        EMODT   = 0x0F,
 };
 
+/**
+ * SGX_ENCLS_FAULT_FLAG - flag signifying an ENCLS return code is a trapnr
+ *
+ * ENCLS has its own (positive value) error codes and also generates
+ * ENCLS specific #GP and #PF faults.  And the ENCLS values get munged
+ * with system error codes as everything percolates back up the stack.
+ * Unfortunately (for us), we need to precisely identify each unique
+ * error code, e.g. the action taken if EWB fails varies based on the
+ * type of fault and on the exact SGX error code, i.e. we can't simply
+ * convert all faults to -EFAULT.
+ *
+ * To make all three error types coexist, we set bit 30 to identify an
+ * ENCLS fault.  Bit 31 (technically bits N:31) is used to differentiate
+ * between positive (faults and SGX error codes) and negative (system
+ * error codes) values.
+ */
+#define SGX_ENCLS_FAULT_FLAG 0x40000000
+
 /**
  * enum sgx_return_code - The return code type for ENCLS, ENCLU and ENCLV
  * %SGX_NOT_TRACKED:           Previous ETRACK's shootdown sequence has not
index 39ebe05..ed4f8bb 100644 (file)
@@ -36,7 +36,7 @@
        __ARCH_DEFINE_STATIC_CALL_TRAMP(name, ".byte 0xe9; .long " #func " - (. + 4)")
 
 #define ARCH_DEFINE_STATIC_CALL_NULL_TRAMP(name)                       \
-       __ARCH_DEFINE_STATIC_CALL_TRAMP(name, "ret; nop; nop; nop; nop")
+       __ARCH_DEFINE_STATIC_CALL_TRAMP(name, "ret; int3; nop; nop; nop")
 
 
 #define ARCH_ADD_TRAMP_KEY(name)                                       \
index f74362b..32c0d98 100644 (file)
@@ -146,42 +146,9 @@ static __always_inline void *__constant_memcpy(void *to, const void *from,
 extern void *memcpy(void *, const void *, size_t);
 
 #ifndef CONFIG_FORTIFY_SOURCE
-#ifdef CONFIG_X86_USE_3DNOW
-
-#include <asm/mmx.h>
-
-/*
- *     This CPU favours 3DNow strongly (eg AMD Athlon)
- */
-
-static inline void *__constant_memcpy3d(void *to, const void *from, size_t len)
-{
-       if (len < 512)
-               return __constant_memcpy(to, from, len);
-       return _mmx_memcpy(to, from, len);
-}
-
-static inline void *__memcpy3d(void *to, const void *from, size_t len)
-{
-       if (len < 512)
-               return __memcpy(to, from, len);
-       return _mmx_memcpy(to, from, len);
-}
-
-#define memcpy(t, f, n)                                \
-       (__builtin_constant_p((n))              \
-        ? __constant_memcpy3d((t), (f), (n))   \
-        : __memcpy3d((t), (f), (n)))
-
-#else
-
-/*
- *     No 3D Now!
- */
 
 #define memcpy(t, f, n) __builtin_memcpy(t, f, n)
 
-#endif
 #endif /* !CONFIG_FORTIFY_SOURCE */
 
 #define __HAVE_ARCH_MEMMOVE
index 8ab9e79..ac96f9b 100644 (file)
@@ -352,24 +352,22 @@ do {                                                                      \
                     "1:        movl %[lowbits],%%eax\n"                \
                     "2:        movl %[highbits],%%edx\n"               \
                     "3:\n"                                             \
-                    ".section .fixup,\"ax\"\n"                         \
-                    "4:        mov %[efault],%[errout]\n"              \
-                    "  xorl %%eax,%%eax\n"                             \
-                    "  xorl %%edx,%%edx\n"                             \
-                    "  jmp 3b\n"                                       \
-                    ".previous\n"                                      \
-                    _ASM_EXTABLE_UA(1b, 4b)                            \
-                    _ASM_EXTABLE_UA(2b, 4b)                            \
+                    _ASM_EXTABLE_TYPE_REG(1b, 3b, EX_TYPE_EFAULT_REG | \
+                                          EX_FLAG_CLEAR_AX_DX,         \
+                                          %[errout])                   \
+                    _ASM_EXTABLE_TYPE_REG(2b, 3b, EX_TYPE_EFAULT_REG | \
+                                          EX_FLAG_CLEAR_AX_DX,         \
+                                          %[errout])                   \
                     : [errout] "=r" (retval),                          \
                       [output] "=&A"(x)                                \
                     : [lowbits] "m" (__m(__ptr)),                      \
                       [highbits] "m" __m(((u32 __user *)(__ptr)) + 1), \
-                      [efault] "i" (-EFAULT), "0" (retval));           \
+                      "0" (retval));                                   \
 })
 
 #else
 #define __get_user_asm_u64(x, ptr, retval) \
-        __get_user_asm(x, ptr, retval, "q", "=r")
+        __get_user_asm(x, ptr, retval, "q")
 #endif
 
 #define __get_user_size(x, ptr, size, retval)                          \
@@ -380,14 +378,14 @@ do {                                                                      \
        __chk_user_ptr(ptr);                                            \
        switch (size) {                                                 \
        case 1:                                                         \
-               __get_user_asm(x_u8__, ptr, retval, "b", "=q");         \
+               __get_user_asm(x_u8__, ptr, retval, "b");               \
                (x) = x_u8__;                                           \
                break;                                                  \
        case 2:                                                         \
-               __get_user_asm(x, ptr, retval, "w", "=r");              \
+               __get_user_asm(x, ptr, retval, "w");                    \
                break;                                                  \
        case 4:                                                         \
-               __get_user_asm(x, ptr, retval, "l", "=r");              \
+               __get_user_asm(x, ptr, retval, "l");                    \
                break;                                                  \
        case 8:                                                         \
                __get_user_asm_u64(x, ptr, retval);                     \
@@ -397,20 +395,17 @@ do {                                                                      \
        }                                                               \
 } while (0)
 
-#define __get_user_asm(x, addr, err, itype, ltype)                     \
+#define __get_user_asm(x, addr, err, itype)                            \
        asm volatile("\n"                                               \
                     "1:        mov"itype" %[umem],%[output]\n"         \
                     "2:\n"                                             \
-                    ".section .fixup,\"ax\"\n"                         \
-                    "3:        mov %[efault],%[errout]\n"              \
-                    "  xorl %k[output],%k[output]\n"                   \
-                    "  jmp 2b\n"                                       \
-                    ".previous\n"                                      \
-                    _ASM_EXTABLE_UA(1b, 3b)                            \
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG | \
+                                          EX_FLAG_CLEAR_AX,            \
+                                          %[errout])                   \
                     : [errout] "=r" (err),                             \
-                      [output] ltype(x)                                \
+                      [output] "=a" (x)                                \
                     : [umem] "m" (__m(addr)),                          \
-                      [efault] "i" (-EFAULT), "0" (err))
+                      "0" (err))
 
 #endif // CONFIG_CC_HAS_ASM_GOTO_OUTPUT
 
index 06006b0..8338b04 100644 (file)
@@ -77,30 +77,58 @@ static inline unsigned long find_zero(unsigned long mask)
  * and the next page not being mapped, take the exception and
  * return zeroes in the non-existing part.
  */
+#ifdef CONFIG_CC_HAS_ASM_GOTO_OUTPUT
+
 static inline unsigned long load_unaligned_zeropad(const void *addr)
 {
-       unsigned long ret, dummy;
+       unsigned long offset, data;
+       unsigned long ret;
+
+       asm_volatile_goto(
+               "1:     mov %[mem], %[ret]\n"
+
+               _ASM_EXTABLE(1b, %l[do_exception])
+
+               : [ret] "=r" (ret)
+               : [mem] "m" (*(unsigned long *)addr)
+               : : do_exception);
+
+       return ret;
+
+do_exception:
+       offset = (unsigned long)addr & (sizeof(long) - 1);
+       addr = (void *)((unsigned long)addr & ~(sizeof(long) - 1));
+       data = *(unsigned long *)addr;
+       ret = data >> offset * 8;
+
+       return ret;
+}
 
-       asm(
-               "1:\tmov %2,%0\n"
+#else /* !CONFIG_CC_HAS_ASM_GOTO_OUTPUT */
+
+static inline unsigned long load_unaligned_zeropad(const void *addr)
+{
+       unsigned long offset, data;
+       unsigned long ret, err = 0;
+
+       asm(    "1:     mov %[mem], %[ret]\n"
                "2:\n"
-               ".section .fixup,\"ax\"\n"
-               "3:\t"
-               "lea %2,%1\n\t"
-               "and %3,%1\n\t"
-               "mov (%1),%0\n\t"
-               "leal %2,%%ecx\n\t"
-               "andl %4,%%ecx\n\t"
-               "shll $3,%%ecx\n\t"
-               "shr %%cl,%0\n\t"
-               "jmp 2b\n"
-               ".previous\n"
-               _ASM_EXTABLE(1b, 3b)
-               :"=&r" (ret),"=&c" (dummy)
-               :"m" (*(unsigned long *)addr),
-                "i" (-sizeof(unsigned long)),
-                "i" (sizeof(unsigned long)-1));
+
+               _ASM_EXTABLE_FAULT(1b, 2b)
+
+               : [ret] "=&r" (ret), "+a" (err)
+               : [mem] "m" (*(unsigned long *)addr));
+
+       if (unlikely(err)) {
+               offset = (unsigned long)addr & (sizeof(long) - 1);
+               addr = (void *)((unsigned long)addr & ~(sizeof(long) - 1));
+               data = *(unsigned long *)addr;
+               ret = data >> offset * 8;
+       }
+
        return ret;
 }
 
+#endif /* CONFIG_CC_HAS_ASM_GOTO_OUTPUT */
+
 #endif /* _ASM_WORD_AT_A_TIME_H */
index 1a162e5..e989bc2 100644 (file)
@@ -96,11 +96,7 @@ static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val)
 
        asm volatile("1: mov %[val], %[ptr]\n"
                     "2:\n"
-                    ".section .fixup, \"ax\"\n"
-                    "3: sub $1, %[ret]\n"
-                    "   jmp 2b\n"
-                    ".previous\n"
-                    _ASM_EXTABLE(1b, 3b)
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %[ret])
                     : [ret] "+r" (ret), [ptr] "=m" (*addr)
                     : [val] "r" (val));
 
@@ -110,16 +106,12 @@ static inline int xen_safe_write_ulong(unsigned long *addr, unsigned long val)
 static inline int xen_safe_read_ulong(const unsigned long *addr,
                                      unsigned long *val)
 {
-       int ret = 0;
        unsigned long rval = ~0ul;
+       int ret = 0;
 
        asm volatile("1: mov %[ptr], %[rval]\n"
                     "2:\n"
-                    ".section .fixup, \"ax\"\n"
-                    "3: sub $1, %[ret]\n"
-                    "   jmp 2b\n"
-                    ".previous\n"
-                    _ASM_EXTABLE(1b, 3b)
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %[ret])
                     : [ret] "+r" (ret), [rval] "+r" (rval)
                     : [ptr] "m" (*addr));
        *val = rval;
index daf88f8..cf69081 100644 (file)
@@ -60,7 +60,7 @@ save_registers:
        popl    saved_context_eflags
 
        movl    $ret_point, saved_eip
-       ret
+       RET
 
 
 restore_registers:
@@ -70,7 +70,7 @@ restore_registers:
        movl    saved_context_edi, %edi
        pushl   saved_context_eflags
        popfl
-       ret
+       RET
 
 SYM_CODE_START(do_suspend_lowlevel)
        call    save_processor_state
@@ -86,7 +86,7 @@ SYM_CODE_START(do_suspend_lowlevel)
 ret_point:
        call    restore_registers
        call    restore_processor_state
-       ret
+       RET
 SYM_CODE_END(do_suspend_lowlevel)
 
 .data
index 23fb4d5..5007c3f 100644 (file)
@@ -714,7 +714,7 @@ asm (
 "      .type           int3_magic, @function\n"
 "int3_magic:\n"
 "      movl    $1, (%" _ASM_ARG1 ")\n"
-"      ret\n"
+       ASM_RET
 "      .size           int3_magic, .-int3_magic\n"
 "      .popsection\n"
 );
@@ -1113,10 +1113,13 @@ void text_poke_sync(void)
 }
 
 struct text_poke_loc {
-       s32 rel_addr; /* addr := _stext + rel_addr */
-       s32 rel32;
+       /* addr := _stext + rel_addr */
+       s32 rel_addr;
+       s32 disp;
+       u8 len;
        u8 opcode;
        const u8 text[POKE_MAX_OPCODE_SIZE];
+       /* see text_poke_bp_batch() */
        u8 old;
 };
 
@@ -1131,7 +1134,8 @@ static struct bp_patching_desc *bp_desc;
 static __always_inline
 struct bp_patching_desc *try_get_desc(struct bp_patching_desc **descp)
 {
-       struct bp_patching_desc *desc = __READ_ONCE(*descp); /* rcu_dereference */
+       /* rcu_dereference */
+       struct bp_patching_desc *desc = __READ_ONCE(*descp);
 
        if (!desc || !arch_atomic_inc_not_zero(&desc->refs))
                return NULL;
@@ -1165,7 +1169,7 @@ noinstr int poke_int3_handler(struct pt_regs *regs)
 {
        struct bp_patching_desc *desc;
        struct text_poke_loc *tp;
-       int len, ret = 0;
+       int ret = 0;
        void *ip;
 
        if (user_mode(regs))
@@ -1205,8 +1209,7 @@ noinstr int poke_int3_handler(struct pt_regs *regs)
                        goto out_put;
        }
 
-       len = text_opcode_size(tp->opcode);
-       ip += len;
+       ip += tp->len;
 
        switch (tp->opcode) {
        case INT3_INSN_OPCODE:
@@ -1221,12 +1224,12 @@ noinstr int poke_int3_handler(struct pt_regs *regs)
                break;
 
        case CALL_INSN_OPCODE:
-               int3_emulate_call(regs, (long)ip + tp->rel32);
+               int3_emulate_call(regs, (long)ip + tp->disp);
                break;
 
        case JMP32_INSN_OPCODE:
        case JMP8_INSN_OPCODE:
-               int3_emulate_jmp(regs, (long)ip + tp->rel32);
+               int3_emulate_jmp(regs, (long)ip + tp->disp);
                break;
 
        default:
@@ -1301,7 +1304,7 @@ static void text_poke_bp_batch(struct text_poke_loc *tp, unsigned int nr_entries
         */
        for (do_sync = 0, i = 0; i < nr_entries; i++) {
                u8 old[POKE_MAX_OPCODE_SIZE] = { tp[i].old, };
-               int len = text_opcode_size(tp[i].opcode);
+               int len = tp[i].len;
 
                if (len - INT3_INSN_SIZE > 0) {
                        memcpy(old + INT3_INSN_SIZE,
@@ -1378,20 +1381,36 @@ static void text_poke_loc_init(struct text_poke_loc *tp, void *addr,
                               const void *opcode, size_t len, const void *emulate)
 {
        struct insn insn;
-       int ret;
+       int ret, i;
 
        memcpy((void *)tp->text, opcode, len);
        if (!emulate)
                emulate = opcode;
 
        ret = insn_decode_kernel(&insn, emulate);
-
        BUG_ON(ret < 0);
-       BUG_ON(len != insn.length);
 
        tp->rel_addr = addr - (void *)_stext;
+       tp->len = len;
        tp->opcode = insn.opcode.bytes[0];
 
+       switch (tp->opcode) {
+       case RET_INSN_OPCODE:
+       case JMP32_INSN_OPCODE:
+       case JMP8_INSN_OPCODE:
+               /*
+                * Control flow instructions without implied execution of the
+                * next instruction can be padded with INT3.
+                */
+               for (i = insn.length; i < len; i++)
+                       BUG_ON(tp->text[i] != INT3_INSN_OPCODE);
+               break;
+
+       default:
+               BUG_ON(len != insn.length);
+       };
+
+
        switch (tp->opcode) {
        case INT3_INSN_OPCODE:
        case RET_INSN_OPCODE:
@@ -1400,7 +1419,7 @@ static void text_poke_loc_init(struct text_poke_loc *tp, void *addr,
        case CALL_INSN_OPCODE:
        case JMP32_INSN_OPCODE:
        case JMP8_INSN_OPCODE:
-               tp->rel32 = insn.immediate.value;
+               tp->disp = insn.immediate.value;
                break;
 
        default: /* assume NOP */
@@ -1408,13 +1427,13 @@ static void text_poke_loc_init(struct text_poke_loc *tp, void *addr,
                case 2: /* NOP2 -- emulate as JMP8+0 */
                        BUG_ON(memcmp(emulate, x86_nops[len], len));
                        tp->opcode = JMP8_INSN_OPCODE;
-                       tp->rel32 = 0;
+                       tp->disp = 0;
                        break;
 
                case 5: /* NOP5 -- emulate as JMP32+0 */
                        BUG_ON(memcmp(emulate, x86_nops[len], len));
                        tp->opcode = JMP32_INSN_OPCODE;
-                       tp->rel32 = 0;
+                       tp->disp = 0;
                        break;
 
                default: /* unknown instruction */
index 9b20484..fa04a73 100644 (file)
 #include <asm/traps.h>
 #include "sgx.h"
 
-/**
- * ENCLS_FAULT_FLAG - flag signifying an ENCLS return code is a trapnr
- *
- * ENCLS has its own (positive value) error codes and also generates
- * ENCLS specific #GP and #PF faults.  And the ENCLS values get munged
- * with system error codes as everything percolates back up the stack.
- * Unfortunately (for us), we need to precisely identify each unique
- * error code, e.g. the action taken if EWB fails varies based on the
- * type of fault and on the exact SGX error code, i.e. we can't simply
- * convert all faults to -EFAULT.
- *
- * To make all three error types coexist, we set bit 30 to identify an
- * ENCLS fault.  Bit 31 (technically bits N:31) is used to differentiate
- * between positive (faults and SGX error codes) and negative (system
- * error codes) values.
- */
-#define ENCLS_FAULT_FLAG 0x40000000
-
 /* Retrieve the encoded trapnr from the specified return code. */
-#define ENCLS_TRAPNR(r) ((r) & ~ENCLS_FAULT_FLAG)
+#define ENCLS_TRAPNR(r) ((r) & ~SGX_ENCLS_FAULT_FLAG)
 
 /* Issue a WARN() about an ENCLS function. */
 #define ENCLS_WARN(r, name) {                                            \
@@ -50,7 +32,7 @@
  */
 static inline bool encls_faulted(int ret)
 {
-       return ret & ENCLS_FAULT_FLAG;
+       return ret & SGX_ENCLS_FAULT_FLAG;
 }
 
 /**
@@ -88,11 +70,7 @@ static inline bool encls_failed(int ret)
        asm volatile(                                           \
        "1: .byte 0x0f, 0x01, 0xcf;\n\t"                        \
        "2:\n"                                                  \
-       ".section .fixup,\"ax\"\n"                              \
-       "3: orl $"__stringify(ENCLS_FAULT_FLAG)",%%eax\n"       \
-       "   jmp 2b\n"                                           \
-       ".previous\n"                                           \
-       _ASM_EXTABLE_FAULT(1b, 3b)                              \
+       _ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_FAULT_SGX)            \
        : "=a"(ret)                                             \
        : "a"(rax), inputs                                      \
        : "memory", "cc");                                      \
@@ -127,7 +105,7 @@ static inline bool encls_failed(int ret)
  *
  * Return:
  *   0 on success,
- *   trapnr with ENCLS_FAULT_FLAG set on fault
+ *   trapnr with SGX_ENCLS_FAULT_FLAG set on fault
  */
 #define __encls_N(rax, rbx_out, inputs...)                     \
        ({                                                      \
@@ -136,11 +114,7 @@ static inline bool encls_failed(int ret)
        "1: .byte 0x0f, 0x01, 0xcf;\n\t"                        \
        "   xor %%eax,%%eax;\n"                                 \
        "2:\n"                                                  \
-       ".section .fixup,\"ax\"\n"                              \
-       "3: orl $"__stringify(ENCLS_FAULT_FLAG)",%%eax\n"       \
-       "   jmp 2b\n"                                           \
-       ".previous\n"                                           \
-       _ASM_EXTABLE_FAULT(1b, 3b)                              \
+       _ASM_EXTABLE_TYPE(1b, 2b, EX_TYPE_FAULT_SGX)            \
        : "=a"(ret), "=b"(rbx_out)                              \
        : "a"(rax), inputs                                      \
        : "memory");                                            \
index 17c26b1..098f367 100644 (file)
@@ -35,11 +35,7 @@ static inline void ldmxcsr(u32 mxcsr)
        int err;                                                        \
        asm volatile("1:" #insn "\n\t"                                  \
                     "2:\n"                                             \
-                    ".section .fixup,\"ax\"\n"                         \
-                    "3:  movl $-1,%[err]\n"                            \
-                    "    jmp  2b\n"                                    \
-                    ".previous\n"                                      \
-                    _ASM_EXTABLE(1b, 3b)                               \
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_EFAULT_REG, %[err]) \
                     : [err] "=r" (err), output                         \
                     : "0"(0), input);                                  \
        err;                                                            \
index 86ea7c0..e0c9264 100644 (file)
@@ -108,11 +108,7 @@ static inline u64 xfeatures_mask_independent(void)
                     "\n"                                               \
                     "xor %[err], %[err]\n"                             \
                     "3:\n"                                             \
-                    ".pushsection .fixup,\"ax\"\n"                     \
-                    "4: movl $-2, %[err]\n"                            \
-                    "jmp 3b\n"                                         \
-                    ".popsection\n"                                    \
-                    _ASM_EXTABLE(661b, 4b)                             \
+                    _ASM_EXTABLE_TYPE_REG(661b, 3b, EX_TYPE_EFAULT_REG, %[err]) \
                     : [err] "=r" (err)                                 \
                     : "D" (st), "m" (*st), "a" (lmask), "d" (hmask)    \
                     : "memory")
index c39f906..7cc540e 100644 (file)
@@ -303,7 +303,7 @@ union ftrace_op_code_union {
        } __attribute__((packed));
 };
 
-#define RET_SIZE               1
+#define RET_SIZE               1 + IS_ENABLED(CONFIG_SLS)
 
 static unsigned long
 create_trampoline(struct ftrace_ops *ops, unsigned int *tramp_size)
index e405fe1..a0ed0e4 100644 (file)
@@ -19,7 +19,7 @@
 #endif
 
 SYM_FUNC_START(__fentry__)
-       ret
+       RET
 SYM_FUNC_END(__fentry__)
 EXPORT_SYMBOL(__fentry__)
 
@@ -84,7 +84,7 @@ ftrace_graph_call:
 
 /* This is weak to keep gas from relaxing the jumps */
 SYM_INNER_LABEL_ALIGN(ftrace_stub, SYM_L_WEAK)
-       ret
+       RET
 SYM_CODE_END(ftrace_caller)
 
 SYM_CODE_START(ftrace_regs_caller)
@@ -177,7 +177,7 @@ SYM_CODE_START(ftrace_graph_caller)
        popl    %edx
        popl    %ecx
        popl    %eax
-       ret
+       RET
 SYM_CODE_END(ftrace_graph_caller)
 
 .globl return_to_handler
index 7a87990..11ac028 100644 (file)
 #ifdef CONFIG_DYNAMIC_FTRACE
 
 SYM_FUNC_START(__fentry__)
-       retq
+       RET
 SYM_FUNC_END(__fentry__)
 EXPORT_SYMBOL(__fentry__)
 
@@ -176,11 +176,11 @@ SYM_FUNC_END(ftrace_caller);
 SYM_FUNC_START(ftrace_epilogue)
 /*
  * This is weak to keep gas from relaxing the jumps.
- * It is also used to copy the retq for trampolines.
+ * It is also used to copy the RET for trampolines.
  */
 SYM_INNER_LABEL_ALIGN(ftrace_stub, SYM_L_WEAK)
        UNWIND_HINT_FUNC
-       retq
+       RET
 SYM_FUNC_END(ftrace_epilogue)
 
 SYM_FUNC_START(ftrace_regs_caller)
@@ -284,7 +284,7 @@ SYM_FUNC_START(__fentry__)
        jnz trace
 
 SYM_INNER_LABEL(ftrace_stub, SYM_L_GLOBAL)
-       retq
+       RET
 
 trace:
        /* save_mcount_regs fills in first two parameters */
index d8c64da..eb8656b 100644 (file)
@@ -340,7 +340,7 @@ SYM_FUNC_END(startup_32_smp)
 __INIT
 setup_once:
        andl $0,setup_once_ref  /* Once is enough, thanks */
-       ret
+       RET
 
 SYM_FUNC_START(early_idt_handler_array)
        # 36(%esp) %eflags
index 760e1f2..aaf9e77 100644 (file)
@@ -11,7 +11,7 @@
 SYM_FUNC_START(native_save_fl)
        pushf
        pop %_ASM_AX
-       ret
+       RET
 SYM_FUNC_END(native_save_fl)
 .popsection
 EXPORT_SYMBOL(native_save_fl)
index fce99e2..6290712 100644 (file)
@@ -1051,7 +1051,7 @@ asm(
        "       addl $4, %esp\n"
        "       popfl\n"
 #endif
-       "       ret\n"
+       ASM_RET
        ".size __kretprobe_trampoline, .-__kretprobe_trampoline\n"
 );
 NOKPROBE_SYMBOL(__kretprobe_trampoline);
index 7f7636a..4420499 100644 (file)
@@ -41,7 +41,7 @@ extern void _paravirt_nop(void);
 asm (".pushsection .entry.text, \"ax\"\n"
      ".global _paravirt_nop\n"
      "_paravirt_nop:\n\t"
-     "ret\n\t"
+     ASM_RET
      ".size _paravirt_nop, . - _paravirt_nop\n\t"
      ".type _paravirt_nop, @function\n\t"
      ".popsection");
@@ -51,7 +51,7 @@ asm (".pushsection .entry.text, \"ax\"\n"
      ".global paravirt_ret0\n"
      "paravirt_ret0:\n\t"
      "xor %" _ASM_AX ", %" _ASM_AX ";\n\t"
-     "ret\n\t"
+     ASM_RET
      ".size paravirt_ret0, . - paravirt_ret0\n\t"
      ".type paravirt_ret0, @function\n\t"
      ".popsection");
index f469153..fcc8a76 100644 (file)
@@ -91,7 +91,7 @@ SYM_CODE_START_NOALIGN(relocate_kernel)
        movl    %edi, %eax
        addl    $(identity_mapped - relocate_kernel), %eax
        pushl   %eax
-       ret
+       RET
 SYM_CODE_END(relocate_kernel)
 
 SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
@@ -159,7 +159,7 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
        xorl    %edx, %edx
        xorl    %esi, %esi
        xorl    %ebp, %ebp
-       ret
+       RET
 1:
        popl    %edx
        movl    CP_PA_SWAP_PAGE(%edi), %esp
@@ -190,7 +190,7 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
        movl    %edi, %eax
        addl    $(virtual_mapped - relocate_kernel), %eax
        pushl   %eax
-       ret
+       RET
 SYM_CODE_END(identity_mapped)
 
 SYM_CODE_START_LOCAL_NOALIGN(virtual_mapped)
@@ -208,7 +208,7 @@ SYM_CODE_START_LOCAL_NOALIGN(virtual_mapped)
        popl    %edi
        popl    %esi
        popl    %ebx
-       ret
+       RET
 SYM_CODE_END(virtual_mapped)
 
        /* Do the copies */
@@ -271,7 +271,7 @@ SYM_CODE_START_LOCAL_NOALIGN(swap_pages)
        popl    %edi
        popl    %ebx
        popl    %ebp
-       ret
+       RET
 SYM_CODE_END(swap_pages)
 
        .globl kexec_control_code_size
index c8fe74a..399f075 100644 (file)
@@ -104,7 +104,7 @@ SYM_CODE_START_NOALIGN(relocate_kernel)
        /* jump to identity mapped page */
        addq    $(identity_mapped - relocate_kernel), %r8
        pushq   %r8
-       ret
+       RET
 SYM_CODE_END(relocate_kernel)
 
 SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
@@ -191,7 +191,7 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
        xorl    %r14d, %r14d
        xorl    %r15d, %r15d
 
-       ret
+       RET
 
 1:
        popq    %rdx
@@ -210,7 +210,7 @@ SYM_CODE_START_LOCAL_NOALIGN(identity_mapped)
        call    swap_pages
        movq    $virtual_mapped, %rax
        pushq   %rax
-       ret
+       RET
 SYM_CODE_END(identity_mapped)
 
 SYM_CODE_START_LOCAL_NOALIGN(virtual_mapped)
@@ -231,7 +231,7 @@ SYM_CODE_START_LOCAL_NOALIGN(virtual_mapped)
        popq    %r12
        popq    %rbp
        popq    %rbx
-       ret
+       RET
 SYM_CODE_END(virtual_mapped)
 
        /* Do the copies */
@@ -288,7 +288,7 @@ SYM_CODE_START_LOCAL_NOALIGN(swap_pages)
        lea     PAGE_SIZE(%rax), %rsi
        jmp     0b
 3:
-       ret
+       RET
 SYM_CODE_END(swap_pages)
 
        .globl kexec_control_code_size
index ee04941..3355e27 100644 (file)
@@ -85,5 +85,5 @@ SYM_FUNC_START(sev_verify_cbit)
 #endif
        /* Return page-table pointer */
        movq    %rdi, %rax
-       ret
+       RET
 SYM_FUNC_END(sev_verify_cbit)
index 9c407a3..531fb4c 100644 (file)
@@ -17,6 +17,8 @@ enum insn_type {
  */
 static const u8 xor5rax[] = { 0x66, 0x66, 0x48, 0x31, 0xc0 };
 
+static const u8 retinsn[] = { RET_INSN_OPCODE, 0xcc, 0xcc, 0xcc, 0xcc };
+
 static void __ref __static_call_transform(void *insn, enum insn_type type, void *func)
 {
        const void *emulate = NULL;
@@ -42,8 +44,7 @@ static void __ref __static_call_transform(void *insn, enum insn_type type, void
                break;
 
        case RET:
-               code = text_gen_insn(RET_INSN_OPCODE, insn, func);
-               size = RET_INSN_SIZE;
+               code = &retinsn;
                break;
        }
 
index 641f0fe..1258a58 100644 (file)
@@ -132,9 +132,9 @@ SYM_FUNC_START_LOCAL(verify_cpu)
 .Lverify_cpu_no_longmode:
        popf                            # Restore caller passed flags
        movl $1,%eax
-       ret
+       RET
 .Lverify_cpu_sse_ok:
        popf                            # Restore caller passed flags
        xorl %eax, %eax
-       ret
+       RET
 SYM_FUNC_END(verify_cpu)
index 3d6dc12..27f8303 100644 (file)
@@ -137,7 +137,6 @@ SECTIONS
                ALIGN_ENTRY_TEXT_END
                SOFTIRQENTRY_TEXT
                STATIC_CALL_TEXT
-               *(.fixup)
                *(.gnu.warning)
 
 #ifdef CONFIG_RETPOLINE
index 28b1a4e..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) \
-       "ret \n\t" \
+       "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; ret\n"
-    ".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; \
 })
index 4fa17df..dfaeb47 100644 (file)
@@ -148,7 +148,7 @@ SYM_FUNC_START(__svm_vcpu_run)
        pop %edi
 #endif
        pop %_ASM_BP
-       ret
+       RET
 
 3:     cmpb $0, kvm_rebooting
        jne 2b
@@ -202,7 +202,7 @@ SYM_FUNC_START(__svm_sev_es_vcpu_run)
        pop %edi
 #endif
        pop %_ASM_BP
-       ret
+       RET
 
 3:     cmpb $0, kvm_rebooting
        jne 2b
index 3a64616..435c187 100644 (file)
@@ -49,14 +49,14 @@ SYM_FUNC_START_LOCAL(vmx_vmenter)
        je 2f
 
 1:     vmresume
-       ret
+       RET
 
 2:     vmlaunch
-       ret
+       RET
 
 3:     cmpb $0, kvm_rebooting
        je 4f
-       ret
+       RET
 4:     ud2
 
        _ASM_EXTABLE(1b, 3b)
@@ -89,7 +89,7 @@ SYM_FUNC_START(vmx_vmexit)
        pop %_ASM_AX
 .Lvmexit_skip_rsb:
 #endif
-       ret
+       RET
 SYM_FUNC_END(vmx_vmexit)
 
 /**
@@ -228,7 +228,7 @@ SYM_FUNC_START(__vmx_vcpu_run)
        pop %edi
 #endif
        pop %_ASM_BP
-       ret
+       RET
 
        /* VM-Fail.  Out-of-line to avoid a taken Jcc after VM-Exit. */
 2:     mov $1, %eax
@@ -293,7 +293,7 @@ SYM_FUNC_START(vmread_error_trampoline)
        pop %_ASM_AX
        pop %_ASM_BP
 
-       ret
+       RET
 SYM_FUNC_END(vmread_error_trampoline)
 
 SYM_FUNC_START(vmx_do_interrupt_nmi_irqoff)
@@ -326,5 +326,5 @@ SYM_FUNC_START(vmx_do_interrupt_nmi_irqoff)
         */
        mov %_ASM_BP, %_ASM_SP
        pop %_ASM_BP
-       ret
+       RET
 SYM_FUNC_END(vmx_do_interrupt_nmi_irqoff)
index 9e9ef47..35d9324 100644 (file)
@@ -80,9 +80,11 @@ static __always_inline unsigned long __vmcs_readl(unsigned long field)
                      * @field, and bounce through the trampoline to preserve
                      * volatile registers.
                      */
-                    "push $0\n\t"
+                    "xorl %k1, %k1\n\t"
+                    "2:\n\t"
+                    "push %1\n\t"
                     "push %2\n\t"
-                    "2:call vmread_error_trampoline\n\t"
+                    "call vmread_error_trampoline\n\t"
 
                     /*
                      * Unwind the stack.  Note, the trampoline zeros out the
@@ -93,13 +95,9 @@ static __always_inline unsigned long __vmcs_readl(unsigned long field)
                     "3:\n\t"
 
                     /* VMREAD faulted.  As above, except push '1' for @fault. */
-                    ".pushsection .fixup, \"ax\"\n\t"
-                    "4: push $1\n\t"
-                    "push %2\n\t"
-                    "jmp 2b\n\t"
-                    ".popsection\n\t"
-                    _ASM_EXTABLE(1b, 4b)
-                    : ASM_CALL_CONSTRAINT, "=r"(value) : "r"(field) : "cc");
+                    _ASM_EXTABLE_TYPE_REG(1b, 2b, EX_TYPE_ONE_REG, %1)
+
+                    : ASM_CALL_CONSTRAINT, "=&r"(value) : "r"(field) : "cc");
        return value;
 }
 
index c6506c6..f767478 100644 (file)
@@ -63,7 +63,6 @@ ifeq ($(CONFIG_X86_32),y)
 ifneq ($(CONFIG_X86_CMPXCHG64),y)
         lib-y += cmpxchg8b_emu.o atomic64_386_32.o
 endif
-        lib-$(CONFIG_X86_USE_3DNOW) += mmx_32.o
 else
         obj-y += iomap_copy_64.o
         lib-y += csum-partial_64.o csum-copy_64.o csum-wrappers_64.o
index 16bc913..e768815 100644 (file)
@@ -9,81 +9,83 @@
 #include <asm/alternative.h>
 
 /* if you want SMP support, implement these with real spinlocks */
-.macro LOCK reg
+.macro IRQ_SAVE reg
        pushfl
        cli
 .endm
 
-.macro UNLOCK reg
+.macro IRQ_RESTORE reg
        popfl
 .endm
 
-#define BEGIN(op) \
+#define BEGIN_IRQ_SAVE(op) \
 .macro endp; \
 SYM_FUNC_END(atomic64_##op##_386); \
 .purgem endp; \
 .endm; \
 SYM_FUNC_START(atomic64_##op##_386); \
-       LOCK v;
+       IRQ_SAVE v;
 
 #define ENDP endp
 
-#define RET \
-       UNLOCK v; \
-       ret
-
-#define RET_ENDP \
-       RET; \
-       ENDP
+#define RET_IRQ_RESTORE \
+       IRQ_RESTORE v; \
+       RET
 
 #define v %ecx
-BEGIN(read)
+BEGIN_IRQ_SAVE(read)
        movl  (v), %eax
        movl 4(v), %edx
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %esi
-BEGIN(set)
+BEGIN_IRQ_SAVE(set)
        movl %ebx,  (v)
        movl %ecx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v  %esi
-BEGIN(xchg)
+BEGIN_IRQ_SAVE(xchg)
        movl  (v), %eax
        movl 4(v), %edx
        movl %ebx,  (v)
        movl %ecx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %ecx
-BEGIN(add)
+BEGIN_IRQ_SAVE(add)
        addl %eax,  (v)
        adcl %edx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %ecx
-BEGIN(add_return)
+BEGIN_IRQ_SAVE(add_return)
        addl  (v), %eax
        adcl 4(v), %edx
        movl %eax,  (v)
        movl %edx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %ecx
-BEGIN(sub)
+BEGIN_IRQ_SAVE(sub)
        subl %eax,  (v)
        sbbl %edx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %ecx
-BEGIN(sub_return)
+BEGIN_IRQ_SAVE(sub_return)
        negl %edx
        negl %eax
        sbbl $0, %edx
@@ -91,47 +93,52 @@ BEGIN(sub_return)
        adcl 4(v), %edx
        movl %eax,  (v)
        movl %edx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %esi
-BEGIN(inc)
+BEGIN_IRQ_SAVE(inc)
        addl $1,  (v)
        adcl $0, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %esi
-BEGIN(inc_return)
+BEGIN_IRQ_SAVE(inc_return)
        movl  (v), %eax
        movl 4(v), %edx
        addl $1, %eax
        adcl $0, %edx
        movl %eax,  (v)
        movl %edx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %esi
-BEGIN(dec)
+BEGIN_IRQ_SAVE(dec)
        subl $1,  (v)
        sbbl $0, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %esi
-BEGIN(dec_return)
+BEGIN_IRQ_SAVE(dec_return)
        movl  (v), %eax
        movl 4(v), %edx
        subl $1, %eax
        sbbl $0, %edx
        movl %eax,  (v)
        movl %edx, 4(v)
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
 
 #define v %esi
-BEGIN(add_unless)
+BEGIN_IRQ_SAVE(add_unless)
        addl %eax, %ecx
        adcl %edx, %edi
        addl  (v), %eax
@@ -143,7 +150,7 @@ BEGIN(add_unless)
        movl %edx, 4(v)
        movl $1, %eax
 2:
-       RET
+       RET_IRQ_RESTORE
 3:
        cmpl %edx, %edi
        jne 1b
@@ -153,7 +160,7 @@ ENDP
 #undef v
 
 #define v %esi
-BEGIN(inc_not_zero)
+BEGIN_IRQ_SAVE(inc_not_zero)
        movl  (v), %eax
        movl 4(v), %edx
        testl %eax, %eax
@@ -165,7 +172,7 @@ BEGIN(inc_not_zero)
        movl %edx, 4(v)
        movl $1, %eax
 2:
-       RET
+       RET_IRQ_RESTORE
 3:
        testl %edx, %edx
        jne 1b
@@ -174,7 +181,7 @@ ENDP
 #undef v
 
 #define v %esi
-BEGIN(dec_if_positive)
+BEGIN_IRQ_SAVE(dec_if_positive)
        movl  (v), %eax
        movl 4(v), %edx
        subl $1, %eax
@@ -183,5 +190,6 @@ BEGIN(dec_if_positive)
        movl %eax,  (v)
        movl %edx, 4(v)
 1:
-RET_ENDP
+       RET_IRQ_RESTORE
+ENDP
 #undef v
index ce69356..90afb48 100644 (file)
@@ -18,7 +18,7 @@
 
 SYM_FUNC_START(atomic64_read_cx8)
        read64 %ecx
-       ret
+       RET
 SYM_FUNC_END(atomic64_read_cx8)
 
 SYM_FUNC_START(atomic64_set_cx8)
@@ -28,7 +28,7 @@ SYM_FUNC_START(atomic64_set_cx8)
        cmpxchg8b (%esi)
        jne 1b
 
-       ret
+       RET
 SYM_FUNC_END(atomic64_set_cx8)
 
 SYM_FUNC_START(atomic64_xchg_cx8)
@@ -37,7 +37,7 @@ SYM_FUNC_START(atomic64_xchg_cx8)
        cmpxchg8b (%esi)
        jne 1b
 
-       ret
+       RET
 SYM_FUNC_END(atomic64_xchg_cx8)
 
 .macro addsub_return func ins insc
@@ -68,7 +68,7 @@ SYM_FUNC_START(atomic64_\func\()_return_cx8)
        popl %esi
        popl %ebx
        popl %ebp
-       ret
+       RET
 SYM_FUNC_END(atomic64_\func\()_return_cx8)
 .endm
 
@@ -93,7 +93,7 @@ SYM_FUNC_START(atomic64_\func\()_return_cx8)
        movl %ebx, %eax
        movl %ecx, %edx
        popl %ebx
-       ret
+       RET
 SYM_FUNC_END(atomic64_\func\()_return_cx8)
 .endm
 
@@ -118,7 +118,7 @@ SYM_FUNC_START(atomic64_dec_if_positive_cx8)
        movl %ebx, %eax
        movl %ecx, %edx
        popl %ebx
-       ret
+       RET
 SYM_FUNC_END(atomic64_dec_if_positive_cx8)
 
 SYM_FUNC_START(atomic64_add_unless_cx8)
@@ -149,7 +149,7 @@ SYM_FUNC_START(atomic64_add_unless_cx8)
        addl $8, %esp
        popl %ebx
        popl %ebp
-       ret
+       RET
 4:
        cmpl %edx, 4(%esp)
        jne 2b
@@ -176,5 +176,5 @@ SYM_FUNC_START(atomic64_inc_not_zero_cx8)
        movl $1, %eax
 3:
        popl %ebx
-       ret
+       RET
 SYM_FUNC_END(atomic64_inc_not_zero_cx8)
index 4304320..23318c3 100644 (file)
@@ -127,7 +127,7 @@ SYM_FUNC_START(csum_partial)
 8:
        popl %ebx
        popl %esi
-       ret
+       RET
 SYM_FUNC_END(csum_partial)
 
 #else
@@ -245,7 +245,7 @@ SYM_FUNC_START(csum_partial)
 90: 
        popl %ebx
        popl %esi
-       ret
+       RET
 SYM_FUNC_END(csum_partial)
                                
 #endif
@@ -260,9 +260,9 @@ unsigned int csum_partial_copy_generic (const char *src, char *dst,
  * Copy from ds while checksumming, otherwise like csum_partial
  */
 
-#define EXC(y...)                      \
-       9999: y;                        \
-       _ASM_EXTABLE_UA(9999b, 6001f)
+#define EXC(y...)                                              \
+       9999: y;                                                \
+       _ASM_EXTABLE_TYPE(9999b, 7f, EX_TYPE_UACCESS | EX_FLAG_CLEAR_AX)
 
 #ifndef CONFIG_X86_USE_PPRO_CHECKSUM
 
@@ -358,20 +358,11 @@ EXC(      movb %cl, (%edi)        )
        adcl $0, %eax
 7:
 
-# Exception handler:
-.section .fixup, "ax"                                                  
-
-6001:
-       xorl %eax, %eax
-       jmp 7b
-
-.previous
-
        popl %ebx
        popl %esi
        popl %edi
        popl %ecx                       # equivalent to addl $4,%esp
-       ret     
+       RET
 SYM_FUNC_END(csum_partial_copy_generic)
 
 #else
@@ -439,15 +430,11 @@ EXC(      movb %dl, (%edi)         )
 6:     addl %edx, %eax
        adcl $0, %eax
 7:
-.section .fixup, "ax"
-6001:  xorl %eax, %eax
-       jmp  7b                 
-.previous                              
 
        popl %esi
        popl %edi
        popl %ebx
-       ret
+       RET
 SYM_FUNC_END(csum_partial_copy_generic)
                                
 #undef ROUND
index c4c7dd1..fe59b8a 100644 (file)
@@ -17,7 +17,7 @@ SYM_FUNC_START(clear_page_rep)
        movl $4096/8,%ecx
        xorl %eax,%eax
        rep stosq
-       ret
+       RET
 SYM_FUNC_END(clear_page_rep)
 EXPORT_SYMBOL_GPL(clear_page_rep)
 
@@ -39,7 +39,7 @@ SYM_FUNC_START(clear_page_orig)
        leaq    64(%rdi),%rdi
        jnz     .Lloop
        nop
-       ret
+       RET
 SYM_FUNC_END(clear_page_orig)
 EXPORT_SYMBOL_GPL(clear_page_orig)
 
@@ -47,6 +47,6 @@ SYM_FUNC_START(clear_page_erms)
        movl $4096,%ecx
        xorl %eax,%eax
        rep stosb
-       ret
+       RET
 SYM_FUNC_END(clear_page_erms)
 EXPORT_SYMBOL_GPL(clear_page_erms)
index 3542502..33c70c0 100644 (file)
@@ -37,11 +37,11 @@ SYM_FUNC_START(this_cpu_cmpxchg16b_emu)
 
        popfq
        mov $1, %al
-       ret
+       RET
 
 .Lnot_same:
        popfq
        xor %al,%al
-       ret
+       RET
 
 SYM_FUNC_END(this_cpu_cmpxchg16b_emu)
index ca01ed6..6a912d5 100644 (file)
@@ -32,7 +32,7 @@ SYM_FUNC_START(cmpxchg8b_emu)
        movl %ecx, 4(%esi)
 
        popfl
-       ret
+       RET
 
 .Lnot_same:
        movl  (%esi), %eax
@@ -40,7 +40,7 @@ SYM_FUNC_START(cmpxchg8b_emu)
        movl 4(%esi), %edx
 
        popfl
-       ret
+       RET
 
 SYM_FUNC_END(cmpxchg8b_emu)
 EXPORT_SYMBOL(cmpxchg8b_emu)
index 7334055..c859a8a 100644 (file)
@@ -77,10 +77,8 @@ SYM_FUNC_START(copy_mc_fragile)
 .L_done_memcpy_trap:
        xorl %eax, %eax
 .L_done:
-       ret
-SYM_FUNC_END(copy_mc_fragile)
+       RET
 
-       .section .fixup, "ax"
        /*
         * Return number of bytes not copied for any failure. Note that
         * there is no "tail" handling since the source buffer is 8-byte
@@ -105,14 +103,14 @@ SYM_FUNC_END(copy_mc_fragile)
        movl    %ecx, %edx
        jmp copy_mc_fragile_handle_tail
 
-       .previous
-
        _ASM_EXTABLE_TYPE(.L_read_leading_bytes, .E_leading_bytes, EX_TYPE_DEFAULT_MCE_SAFE)
        _ASM_EXTABLE_TYPE(.L_read_words, .E_read_words, EX_TYPE_DEFAULT_MCE_SAFE)
        _ASM_EXTABLE_TYPE(.L_read_trailing_bytes, .E_trailing_bytes, EX_TYPE_DEFAULT_MCE_SAFE)
        _ASM_EXTABLE(.L_write_leading_bytes, .E_leading_bytes)
        _ASM_EXTABLE(.L_write_words, .E_write_words)
        _ASM_EXTABLE(.L_write_trailing_bytes, .E_trailing_bytes)
+
+SYM_FUNC_END(copy_mc_fragile)
 #endif /* CONFIG_X86_MCE */
 
 /*
@@ -132,10 +130,8 @@ SYM_FUNC_START(copy_mc_enhanced_fast_string)
        rep movsb
        /* Copy successful. Return zero */
        xorl %eax, %eax
-       ret
-SYM_FUNC_END(copy_mc_enhanced_fast_string)
+       RET
 
-       .section .fixup, "ax"
 .E_copy:
        /*
         * On fault %rcx is updated such that the copy instruction could
@@ -145,9 +141,9 @@ SYM_FUNC_END(copy_mc_enhanced_fast_string)
         * user-copy routines.
         */
        movq %rcx, %rax
-       ret
-
-       .previous
+       RET
 
        _ASM_EXTABLE_TYPE(.L_copy, .E_copy, EX_TYPE_DEFAULT_MCE_SAFE)
+
+SYM_FUNC_END(copy_mc_enhanced_fast_string)
 #endif /* !CONFIG_UML */
index db4b4f9..30ea644 100644 (file)
@@ -17,7 +17,7 @@ SYM_FUNC_START(copy_page)
        ALTERNATIVE "jmp copy_page_regs", "", X86_FEATURE_REP_GOOD
        movl    $4096/8, %ecx
        rep     movsq
-       ret
+       RET
 SYM_FUNC_END(copy_page)
 EXPORT_SYMBOL(copy_page)
 
@@ -85,5 +85,5 @@ SYM_FUNC_START_LOCAL(copy_page_regs)
        movq    (%rsp), %rbx
        movq    1*8(%rsp), %r12
        addq    $2*8, %rsp
-       ret
+       RET
 SYM_FUNC_END(copy_page_regs)
index a2cbeae..8ca5ecf 100644 (file)
        decl %ecx
        jnz 100b
 102:
-       .section .fixup,"ax"
-103:   addl %ecx,%edx                  /* ecx is zerorest also */
-       jmp .Lcopy_user_handle_tail
-       .previous
 
-       _ASM_EXTABLE_CPY(100b, 103b)
-       _ASM_EXTABLE_CPY(101b, 103b)
-       .endm
+       _ASM_EXTABLE_CPY(100b, .Lcopy_user_handle_align)
+       _ASM_EXTABLE_CPY(101b, .Lcopy_user_handle_align)
+.endm
 
 /*
  * copy_user_generic_unrolled - memory copy with exception handling.
@@ -105,9 +101,8 @@ SYM_FUNC_START(copy_user_generic_unrolled)
        jnz 21b
 23:    xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 
-       .section .fixup,"ax"
 30:    shll $6,%ecx
        addl %ecx,%edx
        jmp 60f
@@ -115,7 +110,6 @@ SYM_FUNC_START(copy_user_generic_unrolled)
        jmp 60f
 50:    movl %ecx,%edx
 60:    jmp .Lcopy_user_handle_tail /* ecx is zerorest also */
-       .previous
 
        _ASM_EXTABLE_CPY(1b, 30b)
        _ASM_EXTABLE_CPY(2b, 30b)
@@ -166,20 +160,16 @@ SYM_FUNC_START(copy_user_generic_string)
        movl %edx,%ecx
        shrl $3,%ecx
        andl $7,%edx
-1:     rep
-       movsq
+1:     rep movsq
 2:     movl %edx,%ecx
-3:     rep
-       movsb
+3:     rep movsb
        xorl %eax,%eax
        ASM_CLAC
-       ret
+       RET
 
-       .section .fixup,"ax"
 11:    leal (%rdx,%rcx,8),%ecx
 12:    movl %ecx,%edx          /* ecx is zerorest also */
        jmp .Lcopy_user_handle_tail
-       .previous
 
        _ASM_EXTABLE_CPY(1b, 11b)
        _ASM_EXTABLE_CPY(3b, 12b)
@@ -203,16 +193,13 @@ SYM_FUNC_START(copy_user_enhanced_fast_string)
        /* CPUs without FSRM should avoid rep movsb for short copies */
        ALTERNATIVE "cmpl $64, %edx; jb .L_copy_short_string", "", X86_FEATURE_FSRM
        movl %edx,%ecx
-1:     rep
-       movsb
+1:     rep movsb
        xorl %eax,%eax
        ASM_CLAC
-       ret
+       RET
 
-       .section .fixup,"ax"
 12:    movl %ecx,%edx          /* ecx is zerorest also */
        jmp .Lcopy_user_handle_tail
-       .previous
 
        _ASM_EXTABLE_CPY(1b, 12b)
 SYM_FUNC_END(copy_user_enhanced_fast_string)
@@ -241,7 +228,7 @@ SYM_CODE_START_LOCAL(.Lcopy_user_handle_tail)
 1:     rep movsb
 2:     mov %ecx,%eax
        ASM_CLAC
-       ret
+       RET
 
 3:
        movl %edx,%eax
@@ -249,6 +236,11 @@ SYM_CODE_START_LOCAL(.Lcopy_user_handle_tail)
        RET
 
        _ASM_EXTABLE_CPY(1b, 2b)
+
+.Lcopy_user_handle_align:
+       addl %ecx,%edx                  /* ecx is zerorest also */
+       jmp .Lcopy_user_handle_tail
+
 SYM_CODE_END(.Lcopy_user_handle_tail)
 
 /*
@@ -357,9 +349,8 @@ SYM_FUNC_START(__copy_user_nocache)
        xorl %eax,%eax
        ASM_CLAC
        sfence
-       ret
+       RET
 
-       .section .fixup,"ax"
 .L_fixup_4x8b_copy:
        shll $6,%ecx
        addl %ecx,%edx
@@ -375,7 +366,6 @@ SYM_FUNC_START(__copy_user_nocache)
 .L_fixup_handle_tail:
        sfence
        jmp .Lcopy_user_handle_tail
-       .previous
 
        _ASM_EXTABLE_CPY(1b, .L_fixup_4x8b_copy)
        _ASM_EXTABLE_CPY(2b, .L_fixup_4x8b_copy)
index 1fbd8ee..d9e16a2 100644 (file)
@@ -201,7 +201,7 @@ SYM_FUNC_START(csum_partial_copy_generic)
        movq 3*8(%rsp), %r13
        movq 4*8(%rsp), %r15
        addq $5*8, %rsp
-       ret
+       RET
 .Lshort:
        movl %ecx, %r10d
        jmp  .L1
index e7925d6..1f8a8f8 100644 (file)
@@ -9,6 +9,7 @@
 #include <linux/compiler.h>
 #include <linux/export.h>
 #include <asm/checksum.h>
+#include <asm/word-at-a-time.h>
 
 static inline unsigned short from32to16(unsigned a) 
 {
@@ -21,120 +22,119 @@ static inline unsigned short from32to16(unsigned a)
 }
 
 /*
- * Do a 64-bit checksum on an arbitrary memory area.
+ * Do a checksum on an arbitrary memory area.
  * Returns a 32bit checksum.
  *
  * This isn't as time critical as it used to be because many NICs
  * do hardware checksumming these days.
- * 
- * Things tried and found to not make it faster:
- * Manual Prefetching
- * Unrolling to an 128 bytes inner loop.
- * Using interleaving with more registers to break the carry chains.
+ *
+ * Still, with CHECKSUM_COMPLETE this is called to compute
+ * checksums on IPv6 headers (40 bytes) and other small parts.
+ * it's best to have buff aligned on a 64-bit boundary
  */
-static unsigned do_csum(const unsigned char *buff, unsigned len)
+__wsum csum_partial(const void *buff, int len, __wsum sum)
 {
-       unsigned odd, count;
-       unsigned long result = 0;
+       u64 temp64 = (__force u64)sum;
+       unsigned odd, result;
 
-       if (unlikely(len == 0))
-               return result; 
        odd = 1 & (unsigned long) buff;
        if (unlikely(odd)) {
-               result = *buff << 8;
+               if (unlikely(len == 0))
+                       return sum;
+               temp64 = ror32((__force u32)sum, 8);
+               temp64 += (*(unsigned char *)buff << 8);
                len--;
                buff++;
        }
-       count = len >> 1;               /* nr of 16-bit words.. */
-       if (count) {
-               if (2 & (unsigned long) buff) {
-                       result += *(unsigned short *)buff;
-                       count--;
-                       len -= 2;
-                       buff += 2;
-               }
-               count >>= 1;            /* nr of 32-bit words.. */
-               if (count) {
-                       unsigned long zero;
-                       unsigned count64;
-                       if (4 & (unsigned long) buff) {
-                               result += *(unsigned int *) buff;
-                               count--;
-                               len -= 4;
-                               buff += 4;
-                       }
-                       count >>= 1;    /* nr of 64-bit words.. */
 
-                       /* main loop using 64byte blocks */
-                       zero = 0;
-                       count64 = count >> 3;
-                       while (count64) { 
-                               asm("addq 0*8(%[src]),%[res]\n\t"
-                                   "adcq 1*8(%[src]),%[res]\n\t"
-                                   "adcq 2*8(%[src]),%[res]\n\t"
-                                   "adcq 3*8(%[src]),%[res]\n\t"
-                                   "adcq 4*8(%[src]),%[res]\n\t"
-                                   "adcq 5*8(%[src]),%[res]\n\t"
-                                   "adcq 6*8(%[src]),%[res]\n\t"
-                                   "adcq 7*8(%[src]),%[res]\n\t"
-                                   "adcq %[zero],%[res]"
-                                   : [res] "=r" (result)
-                                   : [src] "r" (buff), [zero] "r" (zero),
-                                   "[res]" (result));
-                               buff += 64;
-                               count64--;
-                       }
+       while (unlikely(len >= 64)) {
+               asm("addq 0*8(%[src]),%[res]\n\t"
+                   "adcq 1*8(%[src]),%[res]\n\t"
+                   "adcq 2*8(%[src]),%[res]\n\t"
+                   "adcq 3*8(%[src]),%[res]\n\t"
+                   "adcq 4*8(%[src]),%[res]\n\t"
+                   "adcq 5*8(%[src]),%[res]\n\t"
+                   "adcq 6*8(%[src]),%[res]\n\t"
+                   "adcq 7*8(%[src]),%[res]\n\t"
+                   "adcq $0,%[res]"
+                   : [res] "+r" (temp64)
+                   : [src] "r" (buff)
+                   : "memory");
+               buff += 64;
+               len -= 64;
+       }
+
+       if (len & 32) {
+               asm("addq 0*8(%[src]),%[res]\n\t"
+                   "adcq 1*8(%[src]),%[res]\n\t"
+                   "adcq 2*8(%[src]),%[res]\n\t"
+                   "adcq 3*8(%[src]),%[res]\n\t"
+                   "adcq $0,%[res]"
+                       : [res] "+r" (temp64)
+                       : [src] "r" (buff)
+                       : "memory");
+               buff += 32;
+       }
+       if (len & 16) {
+               asm("addq 0*8(%[src]),%[res]\n\t"
+                   "adcq 1*8(%[src]),%[res]\n\t"
+                   "adcq $0,%[res]"
+                       : [res] "+r" (temp64)
+                       : [src] "r" (buff)
+                       : "memory");
+               buff += 16;
+       }
+       if (len & 8) {
+               asm("addq 0*8(%[src]),%[res]\n\t"
+                   "adcq $0,%[res]"
+                       : [res] "+r" (temp64)
+                       : [src] "r" (buff)
+                       : "memory");
+               buff += 8;
+       }
+       if (len & 7) {
+#ifdef CONFIG_DCACHE_WORD_ACCESS
+               unsigned int shift = (8 - (len & 7)) * 8;
+               unsigned long trail;
 
-                       /* last up to 7 8byte blocks */
-                       count %= 8; 
-                       while (count) { 
-                               asm("addq %1,%0\n\t"
-                                   "adcq %2,%0\n" 
-                                           : "=r" (result)
-                                   : "m" (*(unsigned long *)buff), 
-                                   "r" (zero),  "0" (result));
-                               --count; 
-                               buff += 8;
-                       }
-                       result = add32_with_carry(result>>32,
-                                                 result&0xffffffff); 
+               trail = (load_unaligned_zeropad(buff) << shift) >> shift;
 
-                       if (len & 4) {
-                               result += *(unsigned int *) buff;
-                               buff += 4;
-                       }
+               asm("addq %[trail],%[res]\n\t"
+                   "adcq $0,%[res]"
+                       : [res] "+r" (temp64)
+                       : [trail] "r" (trail));
+#else
+               if (len & 4) {
+                       asm("addq %[val],%[res]\n\t"
+                           "adcq $0,%[res]"
+                               : [res] "+r" (temp64)
+                               : [val] "r" ((u64)*(u32 *)buff)
+                               : "memory");
+                       buff += 4;
                }
                if (len & 2) {
-                       result += *(unsigned short *) buff;
+                       asm("addq %[val],%[res]\n\t"
+                           "adcq $0,%[res]"
+                               : [res] "+r" (temp64)
+                               : [val] "r" ((u64)*(u16 *)buff)
+                               : "memory");
                        buff += 2;
                }
+               if (len & 1) {
+                       asm("addq %[val],%[res]\n\t"
+                           "adcq $0,%[res]"
+                               : [res] "+r" (temp64)
+                               : [val] "r" ((u64)*(u8 *)buff)
+                               : "memory");
+               }
+#endif
        }
-       if (len & 1)
-               result += *buff;
-       result = add32_with_carry(result>>32, result & 0xffffffff); 
-       if (unlikely(odd)) { 
+       result = add32_with_carry(temp64 >> 32, temp64 & 0xffffffff);
+       if (unlikely(odd)) {
                result = from32to16(result);
                result = ((result >> 8) & 0xff) | ((result & 0xff) << 8);
        }
-       return result;
-}
-
-/*
- * computes the checksum of a memory block at buff, length len,
- * and adds in "sum" (32-bit)
- *
- * returns a 32-bit number suitable for feeding into itself
- * or csum_tcpudp_magic
- *
- * this function must be called with even lengths, except
- * for the last fragment, which may be odd
- *
- * it's best to have buff aligned on a 64-bit boundary
- */
-__wsum csum_partial(const void *buff, int len, __wsum sum)
-{
-       return (__force __wsum)add32_with_carry(do_csum(buff, len),
-                                               (__force u32)sum);
+       return (__force __wsum)result;
 }
 EXPORT_SYMBOL(csum_partial);
 
@@ -147,4 +147,3 @@ __sum16 ip_compute_csum(const void *buff, int len)
        return csum_fold(csum_partial(buff,len,0));
 }
 EXPORT_SYMBOL(ip_compute_csum);
-
index be5b5fb..5208970 100644 (file)
@@ -1,5 +1,6 @@
 // SPDX-License-Identifier: GPL-2.0
 
+#include <linux/linkage.h>
 #include <linux/error-injection.h>
 #include <linux/kprobes.h>
 
@@ -10,7 +11,7 @@ asm(
        ".type just_return_func, @function\n"
        ".globl just_return_func\n"
        "just_return_func:\n"
-       "       ret\n"
+               ASM_RET
        ".size just_return_func, .-just_return_func\n"
 );
 
index fa1bc21..b70d98d 100644 (file)
@@ -57,7 +57,7 @@ SYM_FUNC_START(__get_user_1)
 1:     movzbl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_1)
 EXPORT_SYMBOL(__get_user_1)
 
@@ -71,7 +71,7 @@ SYM_FUNC_START(__get_user_2)
 2:     movzwl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_2)
 EXPORT_SYMBOL(__get_user_2)
 
@@ -85,7 +85,7 @@ SYM_FUNC_START(__get_user_4)
 3:     movl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_4)
 EXPORT_SYMBOL(__get_user_4)
 
@@ -100,7 +100,7 @@ SYM_FUNC_START(__get_user_8)
 4:     movq (%_ASM_AX),%rdx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 #else
        LOAD_TASK_SIZE_MINUS_N(7)
        cmp %_ASM_DX,%_ASM_AX
@@ -112,7 +112,7 @@ SYM_FUNC_START(__get_user_8)
 5:     movl 4(%_ASM_AX),%ecx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 #endif
 SYM_FUNC_END(__get_user_8)
 EXPORT_SYMBOL(__get_user_8)
@@ -124,7 +124,7 @@ SYM_FUNC_START(__get_user_nocheck_1)
 6:     movzbl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_nocheck_1)
 EXPORT_SYMBOL(__get_user_nocheck_1)
 
@@ -134,7 +134,7 @@ SYM_FUNC_START(__get_user_nocheck_2)
 7:     movzwl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_nocheck_2)
 EXPORT_SYMBOL(__get_user_nocheck_2)
 
@@ -144,7 +144,7 @@ SYM_FUNC_START(__get_user_nocheck_4)
 8:     movl (%_ASM_AX),%edx
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_nocheck_4)
 EXPORT_SYMBOL(__get_user_nocheck_4)
 
@@ -159,7 +159,7 @@ SYM_FUNC_START(__get_user_nocheck_8)
 #endif
        xor %eax,%eax
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__get_user_nocheck_8)
 EXPORT_SYMBOL(__get_user_nocheck_8)
 
@@ -169,7 +169,7 @@ SYM_CODE_START_LOCAL(.Lbad_get_user_clac)
 bad_get_user:
        xor %edx,%edx
        mov $(-EFAULT),%_ASM_AX
-       ret
+       RET
 SYM_CODE_END(.Lbad_get_user_clac)
 
 #ifdef CONFIG_X86_32
@@ -179,7 +179,7 @@ bad_get_user_8:
        xor %edx,%edx
        xor %ecx,%ecx
        mov $(-EFAULT),%_ASM_AX
-       ret
+       RET
 SYM_CODE_END(.Lbad_get_user_8_clac)
 #endif
 
index dbf8cc9..12c16c6 100644 (file)
@@ -32,7 +32,7 @@ SYM_FUNC_START(__sw_hweight32)
        imull $0x01010101, %eax, %eax           # w_tmp *= 0x01010101
        shrl $24, %eax                          # w = w_tmp >> 24
        __ASM_SIZE(pop,) %__ASM_REG(dx)
-       ret
+       RET
 SYM_FUNC_END(__sw_hweight32)
 EXPORT_SYMBOL(__sw_hweight32)
 
@@ -65,7 +65,7 @@ SYM_FUNC_START(__sw_hweight64)
 
        popq    %rdx
        popq    %rdi
-       ret
+       RET
 #else /* CONFIG_X86_32 */
        /* We're getting an u64 arg in (%eax,%edx): unsigned long hweight64(__u64 w) */
        pushl   %ecx
@@ -77,7 +77,7 @@ SYM_FUNC_START(__sw_hweight64)
        addl    %ecx, %eax                      # result
 
        popl    %ecx
-       ret
+       RET
 #endif
 SYM_FUNC_END(__sw_hweight64)
 EXPORT_SYMBOL(__sw_hweight64)
index 53e57ef..b781d32 100644 (file)
@@ -410,32 +410,44 @@ static short get_segment_selector(struct pt_regs *regs, int seg_reg_idx)
 #endif /* CONFIG_X86_64 */
 }
 
-static int get_reg_offset(struct insn *insn, struct pt_regs *regs,
-                         enum reg_type type)
+static const int pt_regoff[] = {
+       offsetof(struct pt_regs, ax),
+       offsetof(struct pt_regs, cx),
+       offsetof(struct pt_regs, dx),
+       offsetof(struct pt_regs, bx),
+       offsetof(struct pt_regs, sp),
+       offsetof(struct pt_regs, bp),
+       offsetof(struct pt_regs, si),
+       offsetof(struct pt_regs, di),
+#ifdef CONFIG_X86_64
+       offsetof(struct pt_regs, r8),
+       offsetof(struct pt_regs, r9),
+       offsetof(struct pt_regs, r10),
+       offsetof(struct pt_regs, r11),
+       offsetof(struct pt_regs, r12),
+       offsetof(struct pt_regs, r13),
+       offsetof(struct pt_regs, r14),
+       offsetof(struct pt_regs, r15),
+#else
+       offsetof(struct pt_regs, ds),
+       offsetof(struct pt_regs, es),
+       offsetof(struct pt_regs, fs),
+       offsetof(struct pt_regs, gs),
+#endif
+};
+
+int pt_regs_offset(struct pt_regs *regs, int regno)
+{
+       if ((unsigned)regno < ARRAY_SIZE(pt_regoff))
+               return pt_regoff[regno];
+       return -EDOM;
+}
+
+static int get_regno(struct insn *insn, enum reg_type type)
 {
+       int nr_registers = ARRAY_SIZE(pt_regoff);
        int regno = 0;
 
-       static const int regoff[] = {
-               offsetof(struct pt_regs, ax),
-               offsetof(struct pt_regs, cx),
-               offsetof(struct pt_regs, dx),
-               offsetof(struct pt_regs, bx),
-               offsetof(struct pt_regs, sp),
-               offsetof(struct pt_regs, bp),
-               offsetof(struct pt_regs, si),
-               offsetof(struct pt_regs, di),
-#ifdef CONFIG_X86_64
-               offsetof(struct pt_regs, r8),
-               offsetof(struct pt_regs, r9),
-               offsetof(struct pt_regs, r10),
-               offsetof(struct pt_regs, r11),
-               offsetof(struct pt_regs, r12),
-               offsetof(struct pt_regs, r13),
-               offsetof(struct pt_regs, r14),
-               offsetof(struct pt_regs, r15),
-#endif
-       };
-       int nr_registers = ARRAY_SIZE(regoff);
        /*
         * Don't possibly decode a 32-bit instructions as
         * reading a 64-bit-only register.
@@ -503,7 +515,18 @@ static int get_reg_offset(struct insn *insn, struct pt_regs *regs,
                WARN_ONCE(1, "decoded an instruction with an invalid register");
                return -EINVAL;
        }
-       return regoff[regno];
+       return regno;
+}
+
+static int get_reg_offset(struct insn *insn, struct pt_regs *regs,
+                         enum reg_type type)
+{
+       int regno = get_regno(insn, type);
+
+       if (regno < 0)
+               return regno;
+
+       return pt_regs_offset(regs, regno);
 }
 
 /**
index cb5a196..a1f9416 100644 (file)
@@ -11,5 +11,5 @@
 SYM_FUNC_START(__iowrite32_copy)
        movl %edx,%ecx
        rep movsd
-       ret
+       RET
 SYM_FUNC_END(__iowrite32_copy)
index e565d1c..3a6e6cf 100644 (file)
@@ -7,11 +7,7 @@
 
 __visible void *memcpy(void *to, const void *from, size_t n)
 {
-#if defined(CONFIG_X86_USE_3DNOW) && !defined(CONFIG_FORTIFY_SOURCE)
-       return __memcpy3d(to, from, n);
-#else
        return __memcpy(to, from, n);
-#endif
 }
 EXPORT_SYMBOL(memcpy);
 
index 1cc9da6..59cf234 100644 (file)
@@ -39,7 +39,7 @@ SYM_FUNC_START_WEAK(memcpy)
        rep movsq
        movl %edx, %ecx
        rep movsb
-       ret
+       RET
 SYM_FUNC_END(memcpy)
 SYM_FUNC_END_ALIAS(__memcpy)
 EXPORT_SYMBOL(memcpy)
@@ -53,7 +53,7 @@ SYM_FUNC_START_LOCAL(memcpy_erms)
        movq %rdi, %rax
        movq %rdx, %rcx
        rep movsb
-       ret
+       RET
 SYM_FUNC_END(memcpy_erms)
 
 SYM_FUNC_START_LOCAL(memcpy_orig)
@@ -137,7 +137,7 @@ SYM_FUNC_START_LOCAL(memcpy_orig)
        movq %r9,       1*8(%rdi)
        movq %r10,      -2*8(%rdi, %rdx)
        movq %r11,      -1*8(%rdi, %rdx)
-       retq
+       RET
        .p2align 4
 .Lless_16bytes:
        cmpl $8,        %edx
@@ -149,7 +149,7 @@ SYM_FUNC_START_LOCAL(memcpy_orig)
        movq -1*8(%rsi, %rdx),  %r9
        movq %r8,       0*8(%rdi)
        movq %r9,       -1*8(%rdi, %rdx)
-       retq
+       RET
        .p2align 4
 .Lless_8bytes:
        cmpl $4,        %edx
@@ -162,7 +162,7 @@ SYM_FUNC_START_LOCAL(memcpy_orig)
        movl -4(%rsi, %rdx), %r8d
        movl %ecx, (%rdi)
        movl %r8d, -4(%rdi, %rdx)
-       retq
+       RET
        .p2align 4
 .Lless_3bytes:
        subl $1, %edx
@@ -180,7 +180,7 @@ SYM_FUNC_START_LOCAL(memcpy_orig)
        movb %cl, (%rdi)
 
 .Lend:
-       retq
+       RET
 SYM_FUNC_END(memcpy_orig)
 
 .popsection
index 6480101..50ea390 100644 (file)
@@ -40,7 +40,7 @@ SYM_FUNC_START(__memmove)
        /* FSRM implies ERMS => no length checks, do the copy directly */
 .Lmemmove_begin_forward:
        ALTERNATIVE "cmp $0x20, %rdx; jb 1f", "", X86_FEATURE_FSRM
-       ALTERNATIVE "", "movq %rdx, %rcx; rep movsb; retq", X86_FEATURE_ERMS
+       ALTERNATIVE "", __stringify(movq %rdx, %rcx; rep movsb; RET), X86_FEATURE_ERMS
 
        /*
         * movsq instruction have many startup latency
@@ -205,7 +205,7 @@ SYM_FUNC_START(__memmove)
        movb (%rsi), %r11b
        movb %r11b, (%rdi)
 13:
-       retq
+       RET
 SYM_FUNC_END(__memmove)
 SYM_FUNC_END_ALIAS(memmove)
 EXPORT_SYMBOL(__memmove)
index 9827ae2..d624f2b 100644 (file)
@@ -40,7 +40,7 @@ SYM_FUNC_START(__memset)
        movl %edx,%ecx
        rep stosb
        movq %r9,%rax
-       ret
+       RET
 SYM_FUNC_END(__memset)
 SYM_FUNC_END_ALIAS(memset)
 EXPORT_SYMBOL(memset)
@@ -63,7 +63,7 @@ SYM_FUNC_START_LOCAL(memset_erms)
        movq %rdx,%rcx
        rep stosb
        movq %r9,%rax
-       ret
+       RET
 SYM_FUNC_END(memset_erms)
 
 SYM_FUNC_START_LOCAL(memset_orig)
@@ -125,7 +125,7 @@ SYM_FUNC_START_LOCAL(memset_orig)
 
 .Lende:
        movq    %r10,%rax
-       ret
+       RET
 
 .Lbad_alignment:
        cmpq $7,%rdx
index cc5f4ea..e69de29 100644 (file)
@@ -1,388 +0,0 @@
-// SPDX-License-Identifier: GPL-2.0
-/*
- *     MMX 3DNow! library helper functions
- *
- *     To do:
- *     We can use MMX just for prefetch in IRQ's. This may be a win.
- *             (reported so on K6-III)
- *     We should use a better code neutral filler for the short jump
- *             leal ebx. [ebx] is apparently best for K6-2, but Cyrix ??
- *     We also want to clobber the filler register so we don't get any
- *             register forwarding stalls on the filler.
- *
- *     Add *user handling. Checksums are not a win with MMX on any CPU
- *     tested so far for any MMX solution figured.
- *
- *     22/09/2000 - Arjan van de Ven
- *             Improved for non-engineering-sample Athlons
- *
- */
-#include <linux/hardirq.h>
-#include <linux/string.h>
-#include <linux/export.h>
-#include <linux/sched.h>
-#include <linux/types.h>
-
-#include <asm/fpu/api.h>
-#include <asm/asm.h>
-
-/*
- * Use KFPU_387.  MMX instructions are not affected by MXCSR,
- * but both AMD and Intel documentation states that even integer MMX
- * operations will result in #MF if an exception is pending in FCW.
- *
- * EMMS is not needed afterwards because, after calling kernel_fpu_end(),
- * any subsequent user of the 387 stack will reinitialize it using
- * KFPU_387.
- */
-
-void *_mmx_memcpy(void *to, const void *from, size_t len)
-{
-       void *p;
-       int i;
-
-       if (unlikely(in_interrupt()))
-               return __memcpy(to, from, len);
-
-       p = to;
-       i = len >> 6; /* len/64 */
-
-       kernel_fpu_begin_mask(KFPU_387);
-
-       __asm__ __volatile__ (
-               "1: prefetch (%0)\n"            /* This set is 28 bytes */
-               "   prefetch 64(%0)\n"
-               "   prefetch 128(%0)\n"
-               "   prefetch 192(%0)\n"
-               "   prefetch 256(%0)\n"
-               "2:  \n"
-               ".section .fixup, \"ax\"\n"
-               "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
-               "   jmp 2b\n"
-               ".previous\n"
-                       _ASM_EXTABLE(1b, 3b)
-                       : : "r" (from));
-
-       for ( ; i > 5; i--) {
-               __asm__ __volatile__ (
-               "1:  prefetch 320(%0)\n"
-               "2:  movq (%0), %%mm0\n"
-               "  movq 8(%0), %%mm1\n"
-               "  movq 16(%0), %%mm2\n"
-               "  movq 24(%0), %%mm3\n"
-               "  movq %%mm0, (%1)\n"
-               "  movq %%mm1, 8(%1)\n"
-               "  movq %%mm2, 16(%1)\n"
-               "  movq %%mm3, 24(%1)\n"
-               "  movq 32(%0), %%mm0\n"
-               "  movq 40(%0), %%mm1\n"
-               "  movq 48(%0), %%mm2\n"
-               "  movq 56(%0), %%mm3\n"
-               "  movq %%mm0, 32(%1)\n"
-               "  movq %%mm1, 40(%1)\n"
-               "  movq %%mm2, 48(%1)\n"
-               "  movq %%mm3, 56(%1)\n"
-               ".section .fixup, \"ax\"\n"
-               "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
-               "   jmp 2b\n"
-               ".previous\n"
-                       _ASM_EXTABLE(1b, 3b)
-                       : : "r" (from), "r" (to) : "memory");
-
-               from += 64;
-               to += 64;
-       }
-
-       for ( ; i > 0; i--) {
-               __asm__ __volatile__ (
-               "  movq (%0), %%mm0\n"
-               "  movq 8(%0), %%mm1\n"
-               "  movq 16(%0), %%mm2\n"
-               "  movq 24(%0), %%mm3\n"
-               "  movq %%mm0, (%1)\n"
-               "  movq %%mm1, 8(%1)\n"
-               "  movq %%mm2, 16(%1)\n"
-               "  movq %%mm3, 24(%1)\n"
-               "  movq 32(%0), %%mm0\n"
-               "  movq 40(%0), %%mm1\n"
-               "  movq 48(%0), %%mm2\n"
-               "  movq 56(%0), %%mm3\n"
-               "  movq %%mm0, 32(%1)\n"
-               "  movq %%mm1, 40(%1)\n"
-               "  movq %%mm2, 48(%1)\n"
-               "  movq %%mm3, 56(%1)\n"
-                       : : "r" (from), "r" (to) : "memory");
-
-               from += 64;
-               to += 64;
-       }
-       /*
-        * Now do the tail of the block:
-        */
-       __memcpy(to, from, len & 63);
-       kernel_fpu_end();
-
-       return p;
-}
-EXPORT_SYMBOL(_mmx_memcpy);
-
-#ifdef CONFIG_MK7
-
-/*
- *     The K7 has streaming cache bypass load/store. The Cyrix III, K6 and
- *     other MMX using processors do not.
- */
-
-static void fast_clear_page(void *page)
-{
-       int i;
-
-       kernel_fpu_begin_mask(KFPU_387);
-
-       __asm__ __volatile__ (
-               "  pxor %%mm0, %%mm0\n" : :
-       );
-
-       for (i = 0; i < 4096/64; i++) {
-               __asm__ __volatile__ (
-               "  movntq %%mm0, (%0)\n"
-               "  movntq %%mm0, 8(%0)\n"
-               "  movntq %%mm0, 16(%0)\n"
-               "  movntq %%mm0, 24(%0)\n"
-               "  movntq %%mm0, 32(%0)\n"
-               "  movntq %%mm0, 40(%0)\n"
-               "  movntq %%mm0, 48(%0)\n"
-               "  movntq %%mm0, 56(%0)\n"
-               : : "r" (page) : "memory");
-               page += 64;
-       }
-
-       /*
-        * Since movntq is weakly-ordered, a "sfence" is needed to become
-        * ordered again:
-        */
-       __asm__ __volatile__("sfence\n"::);
-
-       kernel_fpu_end();
-}
-
-static void fast_copy_page(void *to, void *from)
-{
-       int i;
-
-       kernel_fpu_begin_mask(KFPU_387);
-
-       /*
-        * maybe the prefetch stuff can go before the expensive fnsave...
-        * but that is for later. -AV
-        */
-       __asm__ __volatile__(
-               "1: prefetch (%0)\n"
-               "   prefetch 64(%0)\n"
-               "   prefetch 128(%0)\n"
-               "   prefetch 192(%0)\n"
-               "   prefetch 256(%0)\n"
-               "2:  \n"
-               ".section .fixup, \"ax\"\n"
-               "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
-               "   jmp 2b\n"
-               ".previous\n"
-                       _ASM_EXTABLE(1b, 3b) : : "r" (from));
-
-       for (i = 0; i < (4096-320)/64; i++) {
-               __asm__ __volatile__ (
-               "1: prefetch 320(%0)\n"
-               "2: movq (%0), %%mm0\n"
-               "   movntq %%mm0, (%1)\n"
-               "   movq 8(%0), %%mm1\n"
-               "   movntq %%mm1, 8(%1)\n"
-               "   movq 16(%0), %%mm2\n"
-               "   movntq %%mm2, 16(%1)\n"
-               "   movq 24(%0), %%mm3\n"
-               "   movntq %%mm3, 24(%1)\n"
-               "   movq 32(%0), %%mm4\n"
-               "   movntq %%mm4, 32(%1)\n"
-               "   movq 40(%0), %%mm5\n"
-               "   movntq %%mm5, 40(%1)\n"
-               "   movq 48(%0), %%mm6\n"
-               "   movntq %%mm6, 48(%1)\n"
-               "   movq 56(%0), %%mm7\n"
-               "   movntq %%mm7, 56(%1)\n"
-               ".section .fixup, \"ax\"\n"
-               "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
-               "   jmp 2b\n"
-               ".previous\n"
-               _ASM_EXTABLE(1b, 3b) : : "r" (from), "r" (to) : "memory");
-
-               from += 64;
-               to += 64;
-       }
-
-       for (i = (4096-320)/64; i < 4096/64; i++) {
-               __asm__ __volatile__ (
-               "2: movq (%0), %%mm0\n"
-               "   movntq %%mm0, (%1)\n"
-               "   movq 8(%0), %%mm1\n"
-               "   movntq %%mm1, 8(%1)\n"
-               "   movq 16(%0), %%mm2\n"
-               "   movntq %%mm2, 16(%1)\n"
-               "   movq 24(%0), %%mm3\n"
-               "   movntq %%mm3, 24(%1)\n"
-               "   movq 32(%0), %%mm4\n"
-               "   movntq %%mm4, 32(%1)\n"
-               "   movq 40(%0), %%mm5\n"
-               "   movntq %%mm5, 40(%1)\n"
-               "   movq 48(%0), %%mm6\n"
-               "   movntq %%mm6, 48(%1)\n"
-               "   movq 56(%0), %%mm7\n"
-               "   movntq %%mm7, 56(%1)\n"
-                       : : "r" (from), "r" (to) : "memory");
-               from += 64;
-               to += 64;
-       }
-       /*
-        * Since movntq is weakly-ordered, a "sfence" is needed to become
-        * ordered again:
-        */
-       __asm__ __volatile__("sfence \n"::);
-       kernel_fpu_end();
-}
-
-#else /* CONFIG_MK7 */
-
-/*
- *     Generic MMX implementation without K7 specific streaming
- */
-static void fast_clear_page(void *page)
-{
-       int i;
-
-       kernel_fpu_begin_mask(KFPU_387);
-
-       __asm__ __volatile__ (
-               "  pxor %%mm0, %%mm0\n" : :
-       );
-
-       for (i = 0; i < 4096/128; i++) {
-               __asm__ __volatile__ (
-               "  movq %%mm0, (%0)\n"
-               "  movq %%mm0, 8(%0)\n"
-               "  movq %%mm0, 16(%0)\n"
-               "  movq %%mm0, 24(%0)\n"
-               "  movq %%mm0, 32(%0)\n"
-               "  movq %%mm0, 40(%0)\n"
-               "  movq %%mm0, 48(%0)\n"
-               "  movq %%mm0, 56(%0)\n"
-               "  movq %%mm0, 64(%0)\n"
-               "  movq %%mm0, 72(%0)\n"
-               "  movq %%mm0, 80(%0)\n"
-               "  movq %%mm0, 88(%0)\n"
-               "  movq %%mm0, 96(%0)\n"
-               "  movq %%mm0, 104(%0)\n"
-               "  movq %%mm0, 112(%0)\n"
-               "  movq %%mm0, 120(%0)\n"
-                       : : "r" (page) : "memory");
-               page += 128;
-       }
-
-       kernel_fpu_end();
-}
-
-static void fast_copy_page(void *to, void *from)
-{
-       int i;
-
-       kernel_fpu_begin_mask(KFPU_387);
-
-       __asm__ __volatile__ (
-               "1: prefetch (%0)\n"
-               "   prefetch 64(%0)\n"
-               "   prefetch 128(%0)\n"
-               "   prefetch 192(%0)\n"
-               "   prefetch 256(%0)\n"
-               "2:  \n"
-               ".section .fixup, \"ax\"\n"
-               "3: movw $0x1AEB, 1b\n" /* jmp on 26 bytes */
-               "   jmp 2b\n"
-               ".previous\n"
-                       _ASM_EXTABLE(1b, 3b) : : "r" (from));
-
-       for (i = 0; i < 4096/64; i++) {
-               __asm__ __volatile__ (
-               "1: prefetch 320(%0)\n"
-               "2: movq (%0), %%mm0\n"
-               "   movq 8(%0), %%mm1\n"
-               "   movq 16(%0), %%mm2\n"
-               "   movq 24(%0), %%mm3\n"
-               "   movq %%mm0, (%1)\n"
-               "   movq %%mm1, 8(%1)\n"
-               "   movq %%mm2, 16(%1)\n"
-               "   movq %%mm3, 24(%1)\n"
-               "   movq 32(%0), %%mm0\n"
-               "   movq 40(%0), %%mm1\n"
-               "   movq 48(%0), %%mm2\n"
-               "   movq 56(%0), %%mm3\n"
-               "   movq %%mm0, 32(%1)\n"
-               "   movq %%mm1, 40(%1)\n"
-               "   movq %%mm2, 48(%1)\n"
-               "   movq %%mm3, 56(%1)\n"
-               ".section .fixup, \"ax\"\n"
-               "3: movw $0x05EB, 1b\n" /* jmp on 5 bytes */
-               "   jmp 2b\n"
-               ".previous\n"
-                       _ASM_EXTABLE(1b, 3b)
-                       : : "r" (from), "r" (to) : "memory");
-
-               from += 64;
-               to += 64;
-       }
-       kernel_fpu_end();
-}
-
-#endif /* !CONFIG_MK7 */
-
-/*
- * Favour MMX for page clear and copy:
- */
-static void slow_zero_page(void *page)
-{
-       int d0, d1;
-
-       __asm__ __volatile__(
-               "cld\n\t"
-               "rep ; stosl"
-
-                       : "=&c" (d0), "=&D" (d1)
-                       :"a" (0), "1" (page), "0" (1024)
-                       :"memory");
-}
-
-void mmx_clear_page(void *page)
-{
-       if (unlikely(in_interrupt()))
-               slow_zero_page(page);
-       else
-               fast_clear_page(page);
-}
-EXPORT_SYMBOL(mmx_clear_page);
-
-static void slow_copy_page(void *to, void *from)
-{
-       int d0, d1, d2;
-
-       __asm__ __volatile__(
-               "cld\n\t"
-               "rep ; movsl"
-               : "=&c" (d0), "=&D" (d1), "=&S" (d2)
-               : "0" (1024), "1" ((long) to), "2" ((long) from)
-               : "memory");
-}
-
-void mmx_copy_page(void *to, void *from)
-{
-       if (unlikely(in_interrupt()))
-               slow_copy_page(to, from);
-       else
-               fast_copy_page(to, from);
-}
-EXPORT_SYMBOL(mmx_copy_page);
index a2b9caa..ebd259f 100644 (file)
@@ -35,7 +35,7 @@ SYM_FUNC_START(\op\()_safe_regs)
        movl    %edi, 28(%r10)
        popq %r12
        popq %rbx
-       ret
+       RET
 3:
        movl    $-EIO, %r11d
        jmp     2b
@@ -77,7 +77,7 @@ SYM_FUNC_START(\op\()_safe_regs)
        popl %esi
        popl %ebp
        popl %ebx
-       ret
+       RET
 3:
        movl    $-EIO, 4(%esp)
        jmp     2b
index 0ea344c..ecb2049 100644 (file)
@@ -52,7 +52,7 @@ SYM_INNER_LABEL(__put_user_nocheck_1, SYM_L_GLOBAL)
 1:     movb %al,(%_ASM_CX)
        xor %ecx,%ecx
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__put_user_1)
 EXPORT_SYMBOL(__put_user_1)
 EXPORT_SYMBOL(__put_user_nocheck_1)
@@ -66,7 +66,7 @@ SYM_INNER_LABEL(__put_user_nocheck_2, SYM_L_GLOBAL)
 2:     movw %ax,(%_ASM_CX)
        xor %ecx,%ecx
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__put_user_2)
 EXPORT_SYMBOL(__put_user_2)
 EXPORT_SYMBOL(__put_user_nocheck_2)
@@ -80,7 +80,7 @@ SYM_INNER_LABEL(__put_user_nocheck_4, SYM_L_GLOBAL)
 3:     movl %eax,(%_ASM_CX)
        xor %ecx,%ecx
        ASM_CLAC
-       ret
+       RET
 SYM_FUNC_END(__put_user_4)
 EXPORT_SYMBOL(__put_user_4)
 EXPORT_SYMBOL(__put_user_nocheck_4)
index cf0b39f..89b3fb2 100644 (file)
@@ -23,7 +23,7 @@
 .Ldo_rop_\@:
        mov     %\reg, (%_ASM_SP)
        UNWIND_HINT_FUNC
-       ret
+       RET
 .endm
 
 .macro THUNK reg
@@ -34,7 +34,7 @@ SYM_INNER_LABEL(__x86_indirect_thunk_\reg, SYM_L_GLOBAL)
 
        ALTERNATIVE_2 __stringify(ANNOTATE_RETPOLINE_SAFE; jmp *%\reg), \
                      __stringify(RETPOLINE \reg), X86_FEATURE_RETPOLINE, \
-                     __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *%\reg), X86_FEATURE_RETPOLINE_AMD
+                     __stringify(lfence; ANNOTATE_RETPOLINE_SAFE; jmp *%\reg; int3), X86_FEATURE_RETPOLINE_AMD
 
 .endm
 
index 7d29077..422257c 100644 (file)
@@ -8,7 +8,6 @@
  */
 #include <linux/export.h>
 #include <linux/uaccess.h>
-#include <asm/mmx.h>
 #include <asm/asm.h>
 
 #ifdef CONFIG_X86_INTEL_USERCOPY
@@ -43,11 +42,7 @@ do {                                                                 \
                "       movl %2,%0\n"                                   \
                "1:     rep; stosb\n"                                   \
                "2: " ASM_CLAC "\n"                                     \
-               ".section .fixup,\"ax\"\n"                              \
-               "3:     lea 0(%2,%0,4),%0\n"                            \
-               "       jmp 2b\n"                                       \
-               ".previous\n"                                           \
-               _ASM_EXTABLE_UA(0b, 3b)                                 \
+               _ASM_EXTABLE_TYPE_REG(0b, 2b, EX_TYPE_UCOPY_LEN4, %2)   \
                _ASM_EXTABLE_UA(1b, 2b)                                 \
                : "=&c"(size), "=&D" (__d0)                             \
                : "r"(size & 3), "0"(size / 4), "1"(addr), "a"(0));     \
@@ -149,10 +144,6 @@ __copy_user_intel(void __user *to, const void *from, unsigned long size)
                       "36:    movl %%eax, %0\n"
                       "37:    rep; movsb\n"
                       "100:\n"
-                      ".section .fixup,\"ax\"\n"
-                      "101:   lea 0(%%eax,%0,4),%0\n"
-                      "       jmp 100b\n"
-                      ".previous\n"
                       _ASM_EXTABLE_UA(1b, 100b)
                       _ASM_EXTABLE_UA(2b, 100b)
                       _ASM_EXTABLE_UA(3b, 100b)
@@ -190,7 +181,7 @@ __copy_user_intel(void __user *to, const void *from, unsigned long size)
                       _ASM_EXTABLE_UA(35b, 100b)
                       _ASM_EXTABLE_UA(36b, 100b)
                       _ASM_EXTABLE_UA(37b, 100b)
-                      _ASM_EXTABLE_UA(99b, 101b)
+                      _ASM_EXTABLE_TYPE_REG(99b, 100b, EX_TYPE_UCOPY_LEN4, %%eax)
                       : "=&c"(size), "=&D" (d0), "=&S" (d1)
                       :  "1"(to), "2"(from), "0"(size)
                       : "eax", "edx", "memory");
@@ -255,30 +246,26 @@ static unsigned long __copy_user_intel_nocache(void *to,
               "        movl %%eax,%0\n"
               "7:      rep; movsb\n"
               "8:\n"
-              ".section .fixup,\"ax\"\n"
-              "9:      lea 0(%%eax,%0,4),%0\n"
-              "16:     jmp 8b\n"
-              ".previous\n"
-              _ASM_EXTABLE_UA(0b, 16b)
-              _ASM_EXTABLE_UA(1b, 16b)
-              _ASM_EXTABLE_UA(2b, 16b)
-              _ASM_EXTABLE_UA(21b, 16b)
-              _ASM_EXTABLE_UA(3b, 16b)
-              _ASM_EXTABLE_UA(31b, 16b)
-              _ASM_EXTABLE_UA(4b, 16b)
-              _ASM_EXTABLE_UA(41b, 16b)
-              _ASM_EXTABLE_UA(10b, 16b)
-              _ASM_EXTABLE_UA(51b, 16b)
-              _ASM_EXTABLE_UA(11b, 16b)
-              _ASM_EXTABLE_UA(61b, 16b)
-              _ASM_EXTABLE_UA(12b, 16b)
-              _ASM_EXTABLE_UA(71b, 16b)
-              _ASM_EXTABLE_UA(13b, 16b)
-              _ASM_EXTABLE_UA(81b, 16b)
-              _ASM_EXTABLE_UA(14b, 16b)
-              _ASM_EXTABLE_UA(91b, 16b)
-              _ASM_EXTABLE_UA(6b, 9b)
-              _ASM_EXTABLE_UA(7b, 16b)
+              _ASM_EXTABLE_UA(0b, 8b)
+              _ASM_EXTABLE_UA(1b, 8b)
+              _ASM_EXTABLE_UA(2b, 8b)
+              _ASM_EXTABLE_UA(21b, 8b)
+              _ASM_EXTABLE_UA(3b, 8b)
+              _ASM_EXTABLE_UA(31b, 8b)
+              _ASM_EXTABLE_UA(4b, 8b)
+              _ASM_EXTABLE_UA(41b, 8b)
+              _ASM_EXTABLE_UA(10b, 8b)
+              _ASM_EXTABLE_UA(51b, 8b)
+              _ASM_EXTABLE_UA(11b, 8b)
+              _ASM_EXTABLE_UA(61b, 8b)
+              _ASM_EXTABLE_UA(12b, 8b)
+              _ASM_EXTABLE_UA(71b, 8b)
+              _ASM_EXTABLE_UA(13b, 8b)
+              _ASM_EXTABLE_UA(81b, 8b)
+              _ASM_EXTABLE_UA(14b, 8b)
+              _ASM_EXTABLE_UA(91b, 8b)
+              _ASM_EXTABLE_TYPE_REG(6b, 8b, EX_TYPE_UCOPY_LEN4, %%eax)
+              _ASM_EXTABLE_UA(7b, 8b)
               : "=&c"(size), "=&D" (d0), "=&S" (d1)
               :  "1"(to), "2"(from), "0"(size)
               : "eax", "edx", "memory");
@@ -315,14 +302,8 @@ do {                                                                       \
                "       movl %3,%0\n"                                   \
                "1:     rep; movsb\n"                                   \
                "2:\n"                                                  \
-               ".section .fixup,\"ax\"\n"                              \
-               "5:     addl %3,%0\n"                                   \
-               "       jmp 2b\n"                                       \
-               "3:     lea 0(%3,%0,4),%0\n"                            \
-               "       jmp 2b\n"                                       \
-               ".previous\n"                                           \
-               _ASM_EXTABLE_UA(4b, 5b)                                 \
-               _ASM_EXTABLE_UA(0b, 3b)                                 \
+               _ASM_EXTABLE_TYPE_REG(4b, 2b, EX_TYPE_UCOPY_LEN1, %3)   \
+               _ASM_EXTABLE_TYPE_REG(0b, 2b, EX_TYPE_UCOPY_LEN4, %3)   \
                _ASM_EXTABLE_UA(1b, 2b)                                 \
                : "=&c"(size), "=&D" (__d0), "=&S" (__d1), "=r"(__d2)   \
                : "3"(size), "0"(size), "1"(to), "2"(from)              \
index 508c81e..0402a74 100644 (file)
@@ -35,12 +35,10 @@ unsigned long __clear_user(void __user *addr, unsigned long size)
                "       incq   %[dst]\n"
                "       decl %%ecx ; jnz  1b\n"
                "2:\n"
-               ".section .fixup,\"ax\"\n"
-               "3:     lea 0(%[size1],%[size8],8),%[size8]\n"
-               "       jmp 2b\n"
-               ".previous\n"
-               _ASM_EXTABLE_UA(0b, 3b)
+
+               _ASM_EXTABLE_TYPE_REG(0b, 2b, EX_TYPE_UCOPY_LEN8, %[size1])
                _ASM_EXTABLE_UA(1b, 2b)
+
                : [size8] "=&c"(size), [dst] "=&D" (__d0)
                : [size1] "r"(size & 7), "[size8]" (size / 8), "[dst]"(addr));
        clac();
index 951da2a..8c270ab 100644 (file)
@@ -341,7 +341,7 @@ L_exit:
        popl    %esi
 
        leave
-       ret
+       RET
 
 
 #ifdef PARANOID
index d047d18..637439b 100644 (file)
@@ -44,5 +44,5 @@ SYM_FUNC_START(FPU_div_small)
        popl    %esi
 
        leave
-       ret
+       RET
 SYM_FUNC_END(FPU_div_small)
index 4afc7b1..54a031b 100644 (file)
@@ -62,7 +62,7 @@ SYM_FUNC_START(mul32_Xsig)
 
        popl %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(mul32_Xsig)
 
 
@@ -115,7 +115,7 @@ SYM_FUNC_START(mul64_Xsig)
 
        popl %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(mul64_Xsig)
 
 
@@ -175,5 +175,5 @@ SYM_FUNC_START(mul_Xsig_Xsig)
 
        popl %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(mul_Xsig_Xsig)
index 702315e..35fd723 100644 (file)
@@ -133,5 +133,5 @@ L_accum_done:
        popl    %edi
        popl    %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(polynomial_Xsig)
index cad1d60..594936e 100644 (file)
@@ -72,7 +72,7 @@ L_exit_valid:
 L_exit:
        popl    %ebx
        leave
-       ret
+       RET
 
 
 L_zero:
@@ -138,7 +138,7 @@ L_exit_nuo_valid:
 
        popl    %ebx
        leave
-       ret
+       RET
 
 L_exit_nuo_zero:
        movl    TAG_Zero,%eax
@@ -146,5 +146,5 @@ L_exit_nuo_zero:
 
        popl    %ebx
        leave
-       ret
+       RET
 SYM_FUNC_END(FPU_normalize_nuo)
index 4a9fc3c..0bb2a09 100644 (file)
@@ -437,7 +437,7 @@ fpu_Arith_exit:
        popl    %edi
        popl    %esi
        leave
-       ret
+       RET
 
 
 /*
index 9c9e2c8..0724728 100644 (file)
@@ -164,6 +164,6 @@ L_exit:
        popl    %edi
        popl    %esi
        leave
-       ret
+       RET
 #endif /* PARANOID */
 SYM_FUNC_END(FPU_u_add)
index e2fb5c2..b5a41e2 100644 (file)
@@ -468,7 +468,7 @@ L_exit:
        popl    %esi
 
        leave
-       ret
+       RET
 #endif /* PARANOID */ 
 
 SYM_FUNC_END(FPU_u_div)
index 0c779c8..e2588b2 100644 (file)
@@ -144,7 +144,7 @@ L_exit:
        popl    %edi
        popl    %esi
        leave
-       ret
+       RET
 #endif /* PARANOID */ 
 
 SYM_FUNC_END(FPU_u_mul)
index e9bb7c2..4c900c2 100644 (file)
@@ -270,5 +270,5 @@ L_exit:
        popl    %edi
        popl    %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(FPU_u_sub)
index d9d7de8..126c404 100644 (file)
@@ -78,7 +78,7 @@ L_exit:
        popl    %esi
        popl    %ebx
        leave
-       ret
+       RET
 SYM_FUNC_END(round_Xsig)
 
 
@@ -138,5 +138,5 @@ L_n_exit:
        popl    %esi
        popl    %ebx
        leave
-       ret
+       RET
 SYM_FUNC_END(norm_Xsig)
index 726af98..f726bf6 100644 (file)
@@ -45,7 +45,7 @@ SYM_FUNC_START(shr_Xsig)
        popl    %ebx
        popl    %esi
        leave
-       ret
+       RET
 
 L_more_than_31:
        cmpl    $64,%ecx
@@ -61,7 +61,7 @@ L_more_than_31:
        movl    $0,8(%esi)
        popl    %esi
        leave
-       ret
+       RET
 
 L_more_than_63:
        cmpl    $96,%ecx
@@ -76,7 +76,7 @@ L_more_than_63:
        movl    %edx,8(%esi)
        popl    %esi
        leave
-       ret
+       RET
 
 L_more_than_95:
        xorl    %eax,%eax
@@ -85,5 +85,5 @@ L_more_than_95:
        movl    %eax,8(%esi)
        popl    %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(shr_Xsig)
index 4fc8917..f608a28 100644 (file)
@@ -55,7 +55,7 @@ SYM_FUNC_START(FPU_shrx)
        popl    %ebx
        popl    %esi
        leave
-       ret
+       RET
 
 L_more_than_31:
        cmpl    $64,%ecx
@@ -70,7 +70,7 @@ L_more_than_31:
        movl    $0,4(%esi)
        popl    %esi
        leave
-       ret
+       RET
 
 L_more_than_63:
        cmpl    $96,%ecx
@@ -84,7 +84,7 @@ L_more_than_63:
        movl    %edx,4(%esi)
        popl    %esi
        leave
-       ret
+       RET
 
 L_more_than_95:
        xorl    %eax,%eax
@@ -92,7 +92,7 @@ L_more_than_95:
        movl    %eax,4(%esi)
        popl    %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(FPU_shrx)
 
 
@@ -146,7 +146,7 @@ SYM_FUNC_START(FPU_shrxs)
        popl    %ebx
        popl    %esi
        leave
-       ret
+       RET
 
 /* Shift by [0..31] bits */
 Ls_less_than_32:
@@ -163,7 +163,7 @@ Ls_less_than_32:
        popl    %ebx
        popl    %esi
        leave
-       ret
+       RET
 
 /* Shift by [64..95] bits */
 Ls_more_than_63:
@@ -189,7 +189,7 @@ Ls_more_than_63:
        popl    %ebx
        popl    %esi
        leave
-       ret
+       RET
 
 Ls_more_than_95:
 /* Shift by [96..inf) bits */
@@ -203,5 +203,5 @@ Ls_more_than_95:
        popl    %ebx
        popl    %esi
        leave
-       ret
+       RET
 SYM_FUNC_END(FPU_shrxs)
index 5cd2a88..dba2197 100644 (file)
@@ -2,12 +2,26 @@
 #include <linux/extable.h>
 #include <linux/uaccess.h>
 #include <linux/sched/debug.h>
+#include <linux/bitfield.h>
 #include <xen/xen.h>
 
 #include <asm/fpu/api.h>
 #include <asm/sev.h>
 #include <asm/traps.h>
 #include <asm/kdebug.h>
+#include <asm/insn-eval.h>
+#include <asm/sgx.h>
+
+static inline unsigned long *pt_regs_nr(struct pt_regs *regs, int nr)
+{
+       int reg_offset = pt_regs_offset(regs, nr);
+       static unsigned long __dummy;
+
+       if (WARN_ON_ONCE(reg_offset < 0))
+               return &__dummy;
+
+       return (unsigned long *)((unsigned long)regs + reg_offset);
+}
 
 static inline unsigned long
 ex_fixup_addr(const struct exception_table_entry *x)
@@ -15,10 +29,15 @@ ex_fixup_addr(const struct exception_table_entry *x)
        return (unsigned long)&x->fixup + x->fixup;
 }
 
-static bool ex_handler_default(const struct exception_table_entry *fixup,
+static bool ex_handler_default(const struct exception_table_entry *e,
                               struct pt_regs *regs)
 {
-       regs->ip = ex_fixup_addr(fixup);
+       if (e->data & EX_FLAG_CLEAR_AX)
+               regs->ax = 0;
+       if (e->data & EX_FLAG_CLEAR_DX)
+               regs->dx = 0;
+
+       regs->ip = ex_fixup_addr(e);
        return true;
 }
 
@@ -29,6 +48,13 @@ static bool ex_handler_fault(const struct exception_table_entry *fixup,
        return ex_handler_default(fixup, regs);
 }
 
+static bool ex_handler_sgx(const struct exception_table_entry *fixup,
+                          struct pt_regs *regs, int trapnr)
+{
+       regs->ax = trapnr | SGX_ENCLS_FAULT_FLAG;
+       return ex_handler_default(fixup, regs);
+}
+
 /*
  * Handler for when we fail to restore a task's FPU state.  We should never get
  * here because the FPU state of a task using the FPU (task->thread.fpu.state)
@@ -65,28 +91,29 @@ static bool ex_handler_copy(const struct exception_table_entry *fixup,
        return ex_handler_fault(fixup, regs, trapnr);
 }
 
-static bool ex_handler_rdmsr_unsafe(const struct exception_table_entry *fixup,
-                                   struct pt_regs *regs)
+static bool ex_handler_msr(const struct exception_table_entry *fixup,
+                          struct pt_regs *regs, bool wrmsr, bool safe, int reg)
 {
-       if (pr_warn_once("unchecked MSR access error: RDMSR from 0x%x at rIP: 0x%lx (%pS)\n",
+       if (!safe && wrmsr &&
+           pr_warn_once("unchecked MSR access error: WRMSR to 0x%x (tried to write 0x%08x%08x) at rIP: 0x%lx (%pS)\n",
+                        (unsigned int)regs->cx, (unsigned int)regs->dx,
+                        (unsigned int)regs->ax,  regs->ip, (void *)regs->ip))
+               show_stack_regs(regs);
+
+       if (!safe && !wrmsr &&
+           pr_warn_once("unchecked MSR access error: RDMSR from 0x%x at rIP: 0x%lx (%pS)\n",
                         (unsigned int)regs->cx, regs->ip, (void *)regs->ip))
                show_stack_regs(regs);
 
-       /* Pretend that the read succeeded and returned 0. */
-       regs->ax = 0;
-       regs->dx = 0;
-       return ex_handler_default(fixup, regs);
-}
+       if (!wrmsr) {
+               /* Pretend that the read succeeded and returned 0. */
+               regs->ax = 0;
+               regs->dx = 0;
+       }
 
-static bool ex_handler_wrmsr_unsafe(const struct exception_table_entry *fixup,
-                                   struct pt_regs *regs)
-{
-       if (pr_warn_once("unchecked MSR access error: WRMSR to 0x%x (tried to write 0x%08x%08x) at rIP: 0x%lx (%pS)\n",
-                        (unsigned int)regs->cx, (unsigned int)regs->dx,
-                        (unsigned int)regs->ax,  regs->ip, (void *)regs->ip))
-               show_stack_regs(regs);
+       if (safe)
+               *pt_regs_nr(regs, reg) = -EIO;
 
-       /* Pretend that the write succeeded. */
        return ex_handler_default(fixup, regs);
 }
 
@@ -99,17 +126,32 @@ static bool ex_handler_clear_fs(const struct exception_table_entry *fixup,
        return ex_handler_default(fixup, regs);
 }
 
+static bool ex_handler_imm_reg(const struct exception_table_entry *fixup,
+                              struct pt_regs *regs, int reg, int imm)
+{
+       *pt_regs_nr(regs, reg) = (long)imm;
+       return ex_handler_default(fixup, regs);
+}
+
+static bool ex_handler_ucopy_len(const struct exception_table_entry *fixup,
+                                 struct pt_regs *regs, int trapnr, int reg, int imm)
+{
+       regs->cx = imm * regs->cx + *pt_regs_nr(regs, reg);
+       return ex_handler_uaccess(fixup, regs, trapnr);
+}
+
 int ex_get_fixup_type(unsigned long ip)
 {
        const struct exception_table_entry *e = search_exception_tables(ip);
 
-       return e ? e->type : EX_TYPE_NONE;
+       return e ? FIELD_GET(EX_DATA_TYPE_MASK, e->data) : EX_TYPE_NONE;
 }
 
 int fixup_exception(struct pt_regs *regs, int trapnr, unsigned long error_code,
                    unsigned long fault_addr)
 {
        const struct exception_table_entry *e;
+       int type, reg, imm;
 
 #ifdef CONFIG_PNPBIOS
        if (unlikely(SEGMENT_IS_PNP_CODE(regs->cs))) {
@@ -129,7 +171,11 @@ int fixup_exception(struct pt_regs *regs, int trapnr, unsigned long error_code,
        if (!e)
                return 0;
 
-       switch (e->type) {
+       type = FIELD_GET(EX_DATA_TYPE_MASK, e->data);
+       reg  = FIELD_GET(EX_DATA_REG_MASK,  e->data);
+       imm  = FIELD_GET(EX_DATA_IMM_MASK,  e->data);
+
+       switch (type) {
        case EX_TYPE_DEFAULT:
        case EX_TYPE_DEFAULT_MCE_SAFE:
                return ex_handler_default(e, regs);
@@ -144,18 +190,31 @@ int fixup_exception(struct pt_regs *regs, int trapnr, unsigned long error_code,
                return ex_handler_clear_fs(e, regs);
        case EX_TYPE_FPU_RESTORE:
                return ex_handler_fprestore(e, regs);
-       case EX_TYPE_RDMSR:
-               return ex_handler_rdmsr_unsafe(e, regs);
-       case EX_TYPE_WRMSR:
-               return ex_handler_wrmsr_unsafe(e, regs);
        case EX_TYPE_BPF:
                return ex_handler_bpf(e, regs);
-       case EX_TYPE_RDMSR_IN_MCE:
-               ex_handler_msr_mce(regs, false);
-               break;
+       case EX_TYPE_WRMSR:
+               return ex_handler_msr(e, regs, true, false, reg);
+       case EX_TYPE_RDMSR:
+               return ex_handler_msr(e, regs, false, false, reg);
+       case EX_TYPE_WRMSR_SAFE:
+               return ex_handler_msr(e, regs, true, true, reg);
+       case EX_TYPE_RDMSR_SAFE:
+               return ex_handler_msr(e, regs, false, true, reg);
        case EX_TYPE_WRMSR_IN_MCE:
                ex_handler_msr_mce(regs, true);
                break;
+       case EX_TYPE_RDMSR_IN_MCE:
+               ex_handler_msr_mce(regs, false);
+               break;
+       case EX_TYPE_POP_REG:
+               regs->sp += sizeof(long);
+               fallthrough;
+       case EX_TYPE_IMM_REG:
+               return ex_handler_imm_reg(e, regs, reg, imm);
+       case EX_TYPE_FAULT_SGX:
+               return ex_handler_sgx(e, regs, trapnr);
+       case EX_TYPE_UCOPY_LEN:
+               return ex_handler_ucopy_len(e, regs, trapnr, reg, imm);
        }
        BUG();
 }
index 17d292b..3d1dba0 100644 (file)
@@ -65,7 +65,7 @@ SYM_FUNC_START(sme_encrypt_execute)
        movq    %rbp, %rsp              /* Restore original stack pointer */
        pop     %rbp
 
-       ret
+       RET
 SYM_FUNC_END(sme_encrypt_execute)
 
 SYM_FUNC_START(__enc_copy)
@@ -151,6 +151,6 @@ SYM_FUNC_START(__enc_copy)
        pop     %r12
        pop     %r15
 
-       ret
+       RET
 .L__enc_copy_end:
 SYM_FUNC_END(__enc_copy)
index ce1f86f..2b1e266 100644 (file)
@@ -1326,7 +1326,7 @@ st:                       if (is_imm8(insn->off))
                                }
                                ex->insn = delta;
 
-                               ex->type = EX_TYPE_BPF;
+                               ex->data = EX_TYPE_BPF;
 
                                if (dst_reg > BPF_REG_9) {
                                        pr_err("verifier error\n");
index 09ec84f..f3cfdb1 100644 (file)
@@ -56,5 +56,5 @@ SYM_FUNC_START(efi_call_svam)
 
        movl    16(%esp), %ebx
        leave
-       ret
+       RET
 SYM_FUNC_END(efi_call_svam)
index 90380a1..2206b8b 100644 (file)
@@ -23,5 +23,5 @@ SYM_FUNC_START(__efi_call)
        mov %rsi, %rcx
        CALL_NOSPEC rdi
        leave
-       ret
+       RET
 SYM_FUNC_END(__efi_call)
index 5b7c6e0..25799d7 100644 (file)
@@ -73,7 +73,7 @@ SYM_CODE_START(__efi64_thunk)
 1:     movq    0x20(%rsp), %rsp
        pop     %rbx
        pop     %rbp
-       retq
+       RET
 
        .code32
 2:     pushl   $__KERNEL_CS
index 75f4faf..3a5abff 100644 (file)
@@ -77,7 +77,7 @@ save_registers:
        pushfl
        popl saved_context_eflags
 
-       ret
+       RET
 
 restore_registers:
        movl saved_context_ebp, %ebp
@@ -88,7 +88,7 @@ restore_registers:
        pushl saved_context_eflags
        popfl
 
-       ret
+       RET
 
 SYM_CODE_START(do_olpc_suspend_lowlevel)
        call    save_processor_state
@@ -109,7 +109,7 @@ ret_point:
 
        call    restore_registers
        call    restore_processor_state
-       ret
+       RET
 SYM_CODE_END(do_olpc_suspend_lowlevel)
 
 .data
index 8786653..5606a15 100644 (file)
@@ -32,7 +32,7 @@ SYM_FUNC_START(swsusp_arch_suspend)
        FRAME_BEGIN
        call swsusp_save
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(swsusp_arch_suspend)
 
 SYM_CODE_START(restore_image)
@@ -108,5 +108,5 @@ SYM_FUNC_START(restore_registers)
        /* tell the hibernation core that we've just restored the memory */
        movl    %eax, in_suspend
 
-       ret
+       RET
 SYM_FUNC_END(restore_registers)
index d9bed59..0a0539e 100644 (file)
@@ -66,7 +66,7 @@ SYM_FUNC_START(restore_registers)
        /* tell the hibernation core that we've just restored the memory */
        movq    %rax, in_suspend(%rip)
 
-       ret
+       RET
 SYM_FUNC_END(restore_registers)
 
 SYM_FUNC_START(swsusp_arch_suspend)
@@ -96,7 +96,7 @@ SYM_FUNC_START(swsusp_arch_suspend)
        FRAME_BEGIN
        call swsusp_save
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(swsusp_arch_suspend)
 
 SYM_FUNC_START(restore_image)
index 13f118d..aed782a 100644 (file)
@@ -110,7 +110,7 @@ csum_partial:
 7:     
        popl %ebx
        popl %esi
-       ret
+       RET
 
 #else
 
@@ -208,7 +208,7 @@ csum_partial:
 80: 
        popl %ebx
        popl %esi
-       ret
+       RET
                                
 #endif
        EXPORT_SYMBOL(csum_partial)
index 62eaf8c..2d991dd 100644 (file)
@@ -34,7 +34,7 @@ kernel_setjmp:
        movl %esi,12(%edx)
        movl %edi,16(%edx)
        movl %ecx,20(%edx)              # Return address
-       ret
+       RET
 
        .size kernel_setjmp,.-kernel_setjmp
 
index 1b5d40d..b46acb6 100644 (file)
@@ -33,7 +33,7 @@ kernel_setjmp:
        movq %r14,40(%rdi)
        movq %r15,48(%rdi)
        movq %rsi,56(%rdi)              # Return address
-       ret
+       RET
 
        .size kernel_setjmp,.-kernel_setjmp
 
index 444d824..e730e62 100644 (file)
@@ -29,7 +29,7 @@
  */
 SYM_FUNC_START(xen_irq_disable_direct)
        movb $1, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask
-       ret
+       RET
 SYM_FUNC_END(xen_irq_disable_direct)
 
 /*
@@ -58,7 +58,7 @@ SYM_FUNC_START(check_events)
        pop %rcx
        pop %rax
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(check_events)
 
 /*
@@ -84,7 +84,7 @@ SYM_FUNC_START(xen_irq_enable_direct)
        call check_events
 1:
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(xen_irq_enable_direct)
 
 /*
@@ -100,7 +100,7 @@ SYM_FUNC_START(xen_save_fl_direct)
        testb $0xff, PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_mask
        setz %ah
        addb %ah, %ah
-       ret
+       RET
 SYM_FUNC_END(xen_save_fl_direct)
 
 SYM_FUNC_START(xen_read_cr2)
@@ -108,14 +108,14 @@ SYM_FUNC_START(xen_read_cr2)
        _ASM_MOV PER_CPU_VAR(xen_vcpu), %_ASM_AX
        _ASM_MOV XEN_vcpu_info_arch_cr2(%_ASM_AX), %_ASM_AX
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(xen_read_cr2);
 
 SYM_FUNC_START(xen_read_cr2_direct)
        FRAME_BEGIN
        _ASM_MOV PER_CPU_VAR(xen_vcpu_info) + XEN_vcpu_info_arch_cr2, %_ASM_AX
        FRAME_END
-       ret
+       RET
 SYM_FUNC_END(xen_read_cr2_direct);
 .popsection
 
index 6a64496..11d2865 100644 (file)
@@ -26,7 +26,7 @@ SYM_CODE_START(hypercall_page)
        .rept (PAGE_SIZE / 32)
                UNWIND_HINT_FUNC
                .skip 31, 0x90
-               ret
+               RET
        .endr
 
 #define HYPERCALL(n) \
index 4e035ac..6093fa6 100644 (file)
 
 #define __bf_shf(x) (__builtin_ffsll(x) - 1)
 
+#define __scalar_type_to_unsigned_cases(type)                          \
+               unsigned type:  (unsigned type)0,                       \
+               signed type:    (unsigned type)0
+
+#define __unsigned_scalar_typeof(x) typeof(                            \
+               _Generic((x),                                           \
+                       char:   (unsigned char)0,                       \
+                       __scalar_type_to_unsigned_cases(char),          \
+                       __scalar_type_to_unsigned_cases(short),         \
+                       __scalar_type_to_unsigned_cases(int),           \
+                       __scalar_type_to_unsigned_cases(long),          \
+                       __scalar_type_to_unsigned_cases(long long),     \
+                       default: (x)))
+
+#define __bf_cast_unsigned(type, x)    ((__unsigned_scalar_typeof(type))(x))
+
 #define __BF_FIELD_CHECK(_mask, _reg, _val, _pfx)                      \
        ({                                                              \
                BUILD_BUG_ON_MSG(!__builtin_constant_p(_mask),          \
@@ -49,7 +65,8 @@
                BUILD_BUG_ON_MSG(__builtin_constant_p(_val) ?           \
                                 ~((_mask) >> __bf_shf(_mask)) & (_val) : 0, \
                                 _pfx "value too large for the field"); \
-               BUILD_BUG_ON_MSG((_mask) > (typeof(_reg))~0ull,         \
+               BUILD_BUG_ON_MSG(__bf_cast_unsigned(_mask, _mask) >     \
+                                __bf_cast_unsigned(_reg, ~0ull),       \
                                 _pfx "type of reg too small for mask"); \
                __BUILD_BUG_ON_NOT_POWER_OF_2((_mask) +                 \
                                              (1ULL << __bf_shf(_mask))); \
index 2877cb0..2c7c318 100644 (file)
@@ -34,7 +34,7 @@ asm (
 "      call my_direct_func1\n"
 "      leave\n"
 "      .size           my_tramp1, .-my_tramp1\n"
-"      ret\n"
+       ASM_RET
 "      .type           my_tramp2, @function\n"
 "      .globl          my_tramp2\n"
 "   my_tramp2:"
@@ -42,7 +42,7 @@ asm (
 "      movq %rsp, %rbp\n"
 "      call my_direct_func2\n"
 "      leave\n"
-"      ret\n"
+       ASM_RET
 "      .size           my_tramp2, .-my_tramp2\n"
 "      .popsection\n"
 );
index b97e5ed..c93fb0e 100644 (file)
@@ -34,7 +34,7 @@ asm (
 "      popq %rsi\n"
 "      popq %rdi\n"
 "      leave\n"
-"      ret\n"
+       ASM_RET
 "      .size           my_tramp, .-my_tramp\n"
 "      .popsection\n"
 );
index c918b13..8b551e5 100644 (file)
@@ -27,7 +27,7 @@ asm (
 "      call my_direct_func\n"
 "      popq %rdi\n"
 "      leave\n"
-"      ret\n"
+       ASM_RET
 "      .size           my_tramp, .-my_tramp\n"
 "      .popsection\n"
 );
index 78656b5..a4b89b7 100644 (file)
@@ -234,7 +234,8 @@ objtool_args =                                                              \
        $(if $(CONFIG_GCOV_KERNEL)$(CONFIG_LTO_CLANG), --no-unreachable)\
        $(if $(CONFIG_RETPOLINE), --retpoline)                          \
        $(if $(CONFIG_X86_SMAP), --uaccess)                             \
-       $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)
+       $(if $(CONFIG_FTRACE_MCOUNT_USE_OBJTOOL), --mcount)             \
+       $(if $(CONFIG_SLS), --sls)
 
 cmd_objtool = $(if $(objtool-enabled), ; $(objtool) $(objtool_args) $@)
 cmd_gen_objtooldep = $(if $(objtool-enabled), { echo ; echo '$@: $$(wildcard $(objtool))' ; } >> $(dot-target).cmd)
index 5cdd9bc..9716f28 100755 (executable)
@@ -139,6 +139,9 @@ objtool_link()
                if [ -n "${CONFIG_X86_SMAP}" ]; then
                        objtoolopt="${objtoolopt} --uaccess"
                fi
+               if [ -n "${CONFIG_SLS}" ]; then
+                       objtoolopt="${objtoolopt} --sls"
+               fi
                info OBJTOOL ${1}
                tools/objtool/objtool ${objtoolcmd} ${objtoolopt} ${1}
        fi
index b2d504f..aff7747 100644 (file)
 # define NEED_CMOV     0
 #endif
 
-#ifdef CONFIG_X86_USE_3DNOW
-# define NEED_3DNOW    (1<<(X86_FEATURE_3DNOW & 31))
-#else
 # define NEED_3DNOW    0
-#endif
 
 #if defined(CONFIG_X86_P6_NOP) || defined(CONFIG_X86_64)
 # define NEED_NOPL     (1<<(X86_FEATURE_NOPL & 31))
index 4d6d7fc..c10ef78 100644 (file)
@@ -531,6 +531,11 @@ int arch_decode_instruction(struct objtool_file *file, const struct section *sec
                }
                break;
 
+       case 0xcc:
+               /* int3 */
+               *type = INSN_TRAP;
+               break;
+
        case 0xe3:
                /* jecxz/jrcxz */
                *type = INSN_JUMP_CONDITIONAL;
@@ -697,10 +702,10 @@ const char *arch_ret_insn(int len)
 {
        static const char ret[5][5] = {
                { BYTE_RET },
-               { BYTE_RET, BYTES_NOP1 },
-               { BYTE_RET, BYTES_NOP2 },
-               { BYTE_RET, BYTES_NOP3 },
-               { BYTE_RET, BYTES_NOP4 },
+               { BYTE_RET, 0xcc },
+               { BYTE_RET, 0xcc, BYTES_NOP1 },
+               { BYTE_RET, 0xcc, BYTES_NOP2 },
+               { BYTE_RET, 0xcc, BYTES_NOP3 },
        };
 
        if (len < 1 || len > 5) {
index 8b38b5d..38070f2 100644 (file)
@@ -20,7 +20,7 @@
 #include <objtool/objtool.h>
 
 bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats,
-     validate_dup, vmlinux, mcount, noinstr, backup;
+     validate_dup, vmlinux, mcount, noinstr, backup, sls;
 
 static const char * const check_usage[] = {
        "objtool check [<options>] file.o",
@@ -45,6 +45,7 @@ const struct option check_options[] = {
        OPT_BOOLEAN('l', "vmlinux", &vmlinux, "vmlinux.o validation"),
        OPT_BOOLEAN('M', "mcount", &mcount, "generate __mcount_loc"),
        OPT_BOOLEAN('B', "backup", &backup, "create .orig files before modification"),
+       OPT_BOOLEAN('S', "sls", &sls, "validate straight-line-speculation"),
        OPT_END(),
 };
 
index a9a1f72..8c1931e 100644 (file)
@@ -3113,6 +3113,12 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
                switch (insn->type) {
 
                case INSN_RETURN:
+                       if (next_insn && next_insn->type == INSN_TRAP) {
+                               next_insn->ignore = true;
+                       } else if (sls && !insn->retpoline_safe) {
+                               WARN_FUNC("missing int3 after ret",
+                                         insn->sec, insn->offset);
+                       }
                        return validate_return(func, insn, &state);
 
                case INSN_CALL:
@@ -3156,6 +3162,14 @@ static int validate_branch(struct objtool_file *file, struct symbol *func,
                        break;
 
                case INSN_JUMP_DYNAMIC:
+                       if (next_insn && next_insn->type == INSN_TRAP) {
+                               next_insn->ignore = true;
+                       } else if (sls && !insn->retpoline_safe) {
+                               WARN_FUNC("missing int3 after indirect jump",
+                                         insn->sec, insn->offset);
+                       }
+
+                       /* fallthrough */
                case INSN_JUMP_DYNAMIC_CONDITIONAL:
                        if (is_sibling_call(insn)) {
                                ret = validate_sibling_call(file, insn, &state);
@@ -3325,14 +3339,10 @@ static bool ignore_unreachable_insn(struct objtool_file *file, struct instructio
                return true;
 
        /*
-        * Ignore any unused exceptions.  This can happen when a whitelisted
-        * function has an exception table entry.
-        *
-        * Also ignore alternative replacement instructions.  This can happen
+        * Ignore alternative replacement instructions.  This can happen
         * when a whitelisted function uses one of the ALTERNATIVE macros.
         */
-       if (!strcmp(insn->sec->name, ".fixup") ||
-           !strcmp(insn->sec->name, ".altinstr_replacement") ||
+       if (!strcmp(insn->sec->name, ".altinstr_replacement") ||
            !strcmp(insn->sec->name, ".altinstr_aux"))
                return true;
 
index 589ff58..76bae30 100644 (file)
@@ -26,6 +26,7 @@ enum insn_type {
        INSN_CLAC,
        INSN_STD,
        INSN_CLD,
+       INSN_TRAP,
        INSN_OTHER,
 };
 
index 15ac0b7..89ba869 100644 (file)
@@ -9,7 +9,7 @@
 
 extern const struct option check_options[];
 extern bool no_fp, no_unreachable, retpoline, module, backtrace, uaccess, stats,
-            validate_dup, vmlinux, mcount, noinstr, backup;
+            validate_dup, vmlinux, mcount, noinstr, backup, sls;
 
 extern int cmd_parse_options(int argc, const char **argv, const char * const usage[]);