18c2ecf20Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 28c2ecf20Sopenharmony_ci#ifndef _ASM_SPARC_JUMP_LABEL_H 38c2ecf20Sopenharmony_ci#define _ASM_SPARC_JUMP_LABEL_H 48c2ecf20Sopenharmony_ci 58c2ecf20Sopenharmony_ci#ifndef __ASSEMBLY__ 68c2ecf20Sopenharmony_ci 78c2ecf20Sopenharmony_ci#include <linux/types.h> 88c2ecf20Sopenharmony_ci 98c2ecf20Sopenharmony_ci#define JUMP_LABEL_NOP_SIZE 4 108c2ecf20Sopenharmony_ci 118c2ecf20Sopenharmony_cistatic __always_inline bool arch_static_branch(struct static_key *key, bool branch) 128c2ecf20Sopenharmony_ci{ 138c2ecf20Sopenharmony_ci asm_volatile_goto("1:\n\t" 148c2ecf20Sopenharmony_ci "nop\n\t" 158c2ecf20Sopenharmony_ci "nop\n\t" 168c2ecf20Sopenharmony_ci ".pushsection __jump_table, \"aw\"\n\t" 178c2ecf20Sopenharmony_ci ".align 4\n\t" 188c2ecf20Sopenharmony_ci ".word 1b, %l[l_yes], %c0\n\t" 198c2ecf20Sopenharmony_ci ".popsection \n\t" 208c2ecf20Sopenharmony_ci : : "i" (&((char *)key)[branch]) : : l_yes); 218c2ecf20Sopenharmony_ci 228c2ecf20Sopenharmony_ci return false; 238c2ecf20Sopenharmony_cil_yes: 248c2ecf20Sopenharmony_ci return true; 258c2ecf20Sopenharmony_ci} 268c2ecf20Sopenharmony_ci 278c2ecf20Sopenharmony_cistatic __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch) 288c2ecf20Sopenharmony_ci{ 298c2ecf20Sopenharmony_ci asm_volatile_goto("1:\n\t" 308c2ecf20Sopenharmony_ci "b %l[l_yes]\n\t" 318c2ecf20Sopenharmony_ci "nop\n\t" 328c2ecf20Sopenharmony_ci ".pushsection __jump_table, \"aw\"\n\t" 338c2ecf20Sopenharmony_ci ".align 4\n\t" 348c2ecf20Sopenharmony_ci ".word 1b, %l[l_yes], %c0\n\t" 358c2ecf20Sopenharmony_ci ".popsection \n\t" 368c2ecf20Sopenharmony_ci : : "i" (&((char *)key)[branch]) : : l_yes); 378c2ecf20Sopenharmony_ci 388c2ecf20Sopenharmony_ci return false; 398c2ecf20Sopenharmony_cil_yes: 408c2ecf20Sopenharmony_ci return true; 418c2ecf20Sopenharmony_ci} 428c2ecf20Sopenharmony_ci 438c2ecf20Sopenharmony_citypedef u32 jump_label_t; 448c2ecf20Sopenharmony_ci 458c2ecf20Sopenharmony_cistruct jump_entry { 468c2ecf20Sopenharmony_ci jump_label_t code; 478c2ecf20Sopenharmony_ci jump_label_t target; 488c2ecf20Sopenharmony_ci jump_label_t key; 498c2ecf20Sopenharmony_ci}; 508c2ecf20Sopenharmony_ci 518c2ecf20Sopenharmony_ci#endif /* __ASSEMBLY__ */ 528c2ecf20Sopenharmony_ci#endif 53