ALTERNATIVE
ALTERNATIVE("b %l[l_no]", "nop", %[cpucap])
ALTERNATIVE("nop", "b %l[l_yes]", %[cpucap])
asm volatile(ALTERNATIVE("isb\n mrs %0, cntpct_el0",
asm volatile(ALTERNATIVE("isb\n mrs %0, cntvct_el0",
asm volatile(ALTERNATIVE("isb\n mrs %0, cntpct_el0",
asm volatile(ALTERNATIVE("isb\n mrs %0, cntvct_el0",
#define spec_bar() asm volatile(ALTERNATIVE("dsb nsh\nisb\n", \
asm volatile(ALTERNATIVE("ldrb %w0, [%1]",
asm volatile(ALTERNATIVE("ldrh %w0, [%1]",
asm volatile(ALTERNATIVE("ldr %w0, [%1]",
asm volatile(ALTERNATIVE("ldr %0, [%1]",
asm volatile(ALTERNATIVE(__mrs_s("%0", r##nvh), \
asm volatile(ALTERNATIVE(__msr_s(r##nvh, "%x0"), \
asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_SPECULATIVE_AT));
ALTERNATIVE(llsc, __LSE_PREAMBLE lse, ARM64_HAS_LSE_ATOMICS)
asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(0),
asm volatile(ALTERNATIVE("nop", SET_PSTATE_TCO(1),
asm volatile(ALTERNATIVE("msr tpidr_el1, %0",
asm(ALTERNATIVE("mrs %0, tpidr_el1",
ALTERNATIVE( \
asm(ALTERNATIVE("nop", "dmb sy", ARM64_WORKAROUND_1508412)); \
asm(ALTERNATIVE("nop", "dmb sy", ARM64_WORKAROUND_1508412)); \
asm(ALTERNATIVE("nop", SET_PSTATE_PAN(0), ARM64_HAS_PAN));
asm(ALTERNATIVE("nop", SET_PSTATE_PAN(1), ARM64_HAS_PAN));
asm(ALTERNATIVE("dc cvau, %0", "nop", ARM64_HAS_CACHE_IDC)
asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_SPECULATIVE_AT));
asm(ALTERNATIVE("nop", "dmb sy", ARM64_WORKAROUND_1508412));
asm(ALTERNATIVE("isb", "nop", ARM64_WORKAROUND_SPECULATIVE_AT));
asm(ALTERNATIVE("isb", "nop", ARM64_WORKAROUND_SPECULATIVE_AT));
asm(ALTERNATIVE("nop", "isb", ARM64_WORKAROUND_SPECULATIVE_AT));
asm(ALTERNATIVE("nop; nop; nop",
.macro ALTERNATIVE oldinstr, newinstr, feature
(asm volatile (ALTERNATIVE(oldinstr, newinstr, feature) : : : "memory"))
ALTERNATIVE(ALT_COND_NO_SMP, INSN_NOP) \
ALTERNATIVE(ALT_COND_NO_SMP, INSN_PxTLB) \
ALTERNATIVE(ALT_COND_NO_SMP, INSN_PxTLB) \
ALTERNATIVE(ALT_COND_NO_SPLIT_TLB, INSN_NOP) \
ALTERNATIVE(ALT_COND_NO_DCACHE, INSN_NOP) \
ALTERNATIVE(ALT_COND_NO_IOC_FDC, INSN_NOP) \
ALTERNATIVE(ALT_COND_NO_DCACHE, INSN_NOP) \
ALTERNATIVE(ALT_COND_NO_IOC_FDC, INSN_NOP) :::"memory")
asm goto(ALTERNATIVE("j %l[l_no]", "nop", %[vendor], %[ext], 1)
asm goto(ALTERNATIVE("nop", "j %l[l_yes]", %[vendor], %[ext], 1)
asm volatile(ALTERNATIVE( \
ALTERNATIVE(__stringify(RISCV_PTR do_trap_insn_fault), \
ALTERNATIVE(__stringify(RISCV_PTR do_page_fault), \
asm(ALTERNATIVE("sfence.vma x0, %0", "sfence.vma", SIFIVE_VENDOR_ID, \
asm(ALTERNATIVE("sfence.vma %0", "sfence.vma", SIFIVE_VENDOR_ID, \
asm(ALTERNATIVE("sfence.vma %0, %1", "sfence.vma", SIFIVE_VENDOR_ID, \
asm(ALTERNATIVE( \
asm volatile(ALTERNATIVE( \
ALTERNATIVE(__nops(1), PREFETCH_R(x, 0), 0, \
ALTERNATIVE(__nops(1), PREFETCH_W(x, 0), 0, \
ALTERNATIVE( \
ALTERNATIVE( \
asm volatile (ALTERNATIVE("nop", "csrw " __stringify(CSR_ENVCFG) ", %0",
asm_inline volatile(ALTERNATIVE(oldinstr, altinstr, feature) : : : "memory")
asm_inline volatile (ALTERNATIVE(oldinstr, newinstr, feature) \
asm_inline volatile(ALTERNATIVE(oldinstr, altinstr, feature) \
.macro ALTERNATIVE oldinstr, newinstr, feature
ALTERNATIVE(" lg %[ptr],%[offzero](%%r0)\n",
ALTERNATIVE("brcl 15,%l[l_no]", "brcl 0,0", ALT_FACILITY(%[nr]))
ALTERNATIVE(" lghi %[lc],0",
ALTERNATIVE "lghi \reg,0", \
ALTERNATIVE "stmg \start, \end, \savearea", \
ALTERNATIVE("brcl 15,%l[l_no]", "brcl 0,0", ALT_FEATURE(%[nr]))
ALTERNATIVE("alsi %[offzero](%%r0),%[val]\n",
ALTERNATIVE("llgt %[count],%[offzero](%%r0)\n",
ALTERNATIVE("asi %[offzero](%%r0),%[val]\n",
ALTERNATIVE(" nop\n",
ALTERNATIVE(" ly %[cpu],%[offzero](%%r0)\n",
ALTERNATIVE("nop", ".insn rre,0xb2fa0000,7,0", ALT_FACILITY(49)) /* NIAI 7 */
ALTERNATIVE(" ly %[lockval],%[offzero](%%r0)\n",
ALTERNATIVE("nop", ".insn rre,0xb2fa0000,8,0", ALT_FACILITY(49)) /* NIAI 8 */
ALTERNATIVE("nop", ".insn rre,0xb2fa0000,8,0", ALT_FACILITY(49)) /* NIAI 8 */
ALTERNATIVE("nop", ".insn rre,0xb2fa0000,4,0", ALT_FACILITY(49)) /* NIAI 4 */
ALTERNATIVE "", "SET_NOFLUSH_BIT \reg", X86_FEATURE_PCID
ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_PTI
ALTERNATIVE "jmp .Lwrcr3_\@", "", X86_FEATURE_PCID
ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_PTI
ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_PTI
ALTERNATIVE "jmp .Ldone_\@", "", X86_FEATURE_PTI
ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_PTI
ALTERNATIVE "jmp .Lwrcr3_\@", "", X86_FEATURE_PCID
ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_KERNEL_IBRS
ALTERNATIVE "jmp .Lend_\@", "", X86_FEATURE_KERNEL_IBRS
ALTERNATIVE "", "lfence", X86_FEATURE_FENCE_SWAPGS_USER
ALTERNATIVE "", "lfence", X86_FEATURE_FENCE_SWAPGS_KERNEL
ALTERNATIVE(ALTERNATIVE(oldinstr, newinstr1, ft_flags1), newinstr2, ft_flags2)
ALTERNATIVE(ALTERNATIVE_2(oldinstr, newinstr1, ft_flags1, newinstr2, ft_flags2), \
asm_inline volatile(ALTERNATIVE(oldinstr, newinstr, ft_flags) : : : "memory")
asm_inline volatile(ALTERNATIVE(oldinstr, newinstr, ft_flags) \
asm_inline volatile(ALTERNATIVE(oldinstr, newinstr, ft_flags) \
asm_inline volatile(ALTERNATIVE("call %c[old]", "call %c[new]", ft_flags) \
.macro ALTERNATIVE oldinstr, newinstr, ft_flags
asm_inline (ALTERNATIVE("call __sw_hweight32",
asm_inline (ALTERNATIVE("call __sw_hweight64",
#define mb() asm volatile(ALTERNATIVE("lock addl $0,-4(%%esp)", "mfence", \
#define rmb() asm volatile(ALTERNATIVE("lock addl $0,-4(%%esp)", "lfence", \
#define wmb() asm volatile(ALTERNATIVE("lock addl $0,-4(%%esp)", "sfence", \
ALTERNATIVE(_lock_loc \
ALTERNATIVE(_lock_loc \
ALTERNATIVE("vmcall", "vmmcall", X86_FEATURE_VMMCALL)
asm volatile("1: " ALTERNATIVE("ds wrmsr", ASM_WRMSRNS, X86_FEATURE_WRMSRNS)
ALTERNATIVE "", \
ALTERNATIVE "", __CLEAR_CPU_BUFFERS, X86_FEATURE_CLEAR_CPU_BUF
ALTERNATIVE "", "call clear_bhb_loop", X86_FEATURE_CLEAR_BHB_LOOP
ALTERNATIVE "", "call clear_bhb_loop", X86_FEATURE_CLEAR_BHB_VMEXIT
ALTERNATIVE("", \
asm volatile(ALTERNATIVE("", "wrmsr", %c[feature])
asm_inline volatile(ALTERNATIVE("", "call write_ibpb", X86_FEATURE_IBPB)
asm volatile(ALTERNATIVE(PARAVIRT_CALL, ALT_CALL_INSTR, \
ALTERNATIVE("call this_cpu_cmpxchg8b_emu", \
ALTERNATIVE("call this_cpu_cmpxchg8b_emu", \
ALTERNATIVE("call this_cpu_cmpxchg16b_emu", \
ALTERNATIVE("call this_cpu_cmpxchg16b_emu", \
asm volatile(ALTERNATIVE("", "div %2\n\t", X86_BUG_DIV0)
ALTERNATIVE("", "stac", X86_FEATURE_SMAP)
ALTERNATIVE("", ANNOTATE_IGNORE_ALTERNATIVE "\n\t" "clac", X86_FEATURE_SMAP)
ALTERNATIVE("", ANNOTATE_IGNORE_ALTERNATIVE "\n\t" "stac", X86_FEATURE_SMAP)
ALTERNATIVE "", "clac", X86_FEATURE_SMAP
ALTERNATIVE "", "stac", X86_FEATURE_SMAP
ALTERNATIVE(ANNOTATE_IGNORE_ALTERNATIVE "\n\t"
ALTERNATIVE(ANNOTATE_IGNORE_ALTERNATIVE "\n\t"
ALTERNATIVE("", "clac", X86_FEATURE_SMAP)
ALTERNATIVE("rep movsb",
ALTERNATIVE("rep stosb",
asm_inline (ALTERNATIVE("", "and " __percpu_arg([mask]) ", %[addr]",
# define __sys_instr ALTERNATIVE("ds;ds;ds;int $0x80", \
ALTERNATIVE("", "lea %[mem], %%" _ASM_ARG1 "; call __alt_reloc_selftest;", X86_FEATURE_ALWAYS)
asm volatile("1: " ALTERNATIVE(XRSTOR, \
asm volatile(ALTERNATIVE( \
asm(ALTERNATIVE("nop", "dmb sy", ARM64_WORKAROUND_1508412)); \
asm(ALTERNATIVE("nop", "dmb sy", ARM64_WORKAROUND_1508412)); \
.macro ALTERNATIVE oldinstr, newinstr, feature