162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0-or-later */ 262306a36Sopenharmony_ci#ifndef _ASM_POWERPC_JUMP_LABEL_H 362306a36Sopenharmony_ci#define _ASM_POWERPC_JUMP_LABEL_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci/* 662306a36Sopenharmony_ci * Copyright 2010 Michael Ellerman, IBM Corp. 762306a36Sopenharmony_ci */ 862306a36Sopenharmony_ci 962306a36Sopenharmony_ci#ifndef __ASSEMBLY__ 1062306a36Sopenharmony_ci#include <linux/types.h> 1162306a36Sopenharmony_ci 1262306a36Sopenharmony_ci#include <asm/feature-fixups.h> 1362306a36Sopenharmony_ci#include <asm/asm-const.h> 1462306a36Sopenharmony_ci 1562306a36Sopenharmony_ci#define JUMP_ENTRY_TYPE stringify_in_c(FTR_ENTRY_LONG) 1662306a36Sopenharmony_ci#define JUMP_LABEL_NOP_SIZE 4 1762306a36Sopenharmony_ci 1862306a36Sopenharmony_cistatic __always_inline bool arch_static_branch(struct static_key *key, bool branch) 1962306a36Sopenharmony_ci{ 2062306a36Sopenharmony_ci asm goto("1:\n\t" 2162306a36Sopenharmony_ci "nop # arch_static_branch\n\t" 2262306a36Sopenharmony_ci ".pushsection __jump_table, \"aw\"\n\t" 2362306a36Sopenharmony_ci ".long 1b - ., %l[l_yes] - .\n\t" 2462306a36Sopenharmony_ci JUMP_ENTRY_TYPE "%c0 - .\n\t" 2562306a36Sopenharmony_ci ".popsection \n\t" 2662306a36Sopenharmony_ci : : "i" (&((char *)key)[branch]) : : l_yes); 2762306a36Sopenharmony_ci 2862306a36Sopenharmony_ci return false; 2962306a36Sopenharmony_cil_yes: 3062306a36Sopenharmony_ci return true; 3162306a36Sopenharmony_ci} 3262306a36Sopenharmony_ci 3362306a36Sopenharmony_cistatic __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch) 3462306a36Sopenharmony_ci{ 3562306a36Sopenharmony_ci asm goto("1:\n\t" 3662306a36Sopenharmony_ci "b %l[l_yes] # arch_static_branch_jump\n\t" 3762306a36Sopenharmony_ci ".pushsection __jump_table, \"aw\"\n\t" 3862306a36Sopenharmony_ci ".long 1b - ., %l[l_yes] - .\n\t" 3962306a36Sopenharmony_ci JUMP_ENTRY_TYPE "%c0 - .\n\t" 4062306a36Sopenharmony_ci ".popsection \n\t" 4162306a36Sopenharmony_ci : : "i" (&((char *)key)[branch]) : : l_yes); 4262306a36Sopenharmony_ci 4362306a36Sopenharmony_ci return false; 4462306a36Sopenharmony_cil_yes: 4562306a36Sopenharmony_ci return true; 4662306a36Sopenharmony_ci} 4762306a36Sopenharmony_ci 4862306a36Sopenharmony_ci#else 4962306a36Sopenharmony_ci#define ARCH_STATIC_BRANCH(LABEL, KEY) \ 5062306a36Sopenharmony_ci1098: nop; \ 5162306a36Sopenharmony_ci .pushsection __jump_table, "aw"; \ 5262306a36Sopenharmony_ci .long 1098b - ., LABEL - .; \ 5362306a36Sopenharmony_ci FTR_ENTRY_LONG KEY - .; \ 5462306a36Sopenharmony_ci .popsection 5562306a36Sopenharmony_ci#endif 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci#endif /* _ASM_POWERPC_JUMP_LABEL_H */ 58