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