1*4882a593Smuzhiyun /* SPDX-License-Identifier: GPL-2.0-only */ 2*4882a593Smuzhiyun /* 3*4882a593Smuzhiyun * Copyright (C) 2020 Emil Renner Berthing 4*4882a593Smuzhiyun * 5*4882a593Smuzhiyun * Based on arch/arm64/include/asm/jump_label.h 6*4882a593Smuzhiyun */ 7*4882a593Smuzhiyun #ifndef __ASM_JUMP_LABEL_H 8*4882a593Smuzhiyun #define __ASM_JUMP_LABEL_H 9*4882a593Smuzhiyun 10*4882a593Smuzhiyun #ifndef __ASSEMBLY__ 11*4882a593Smuzhiyun 12*4882a593Smuzhiyun #include <linux/types.h> 13*4882a593Smuzhiyun #include <asm/asm.h> 14*4882a593Smuzhiyun 15*4882a593Smuzhiyun #define JUMP_LABEL_NOP_SIZE 4 16*4882a593Smuzhiyun arch_static_branch(struct static_key * key,bool branch)17*4882a593Smuzhiyunstatic __always_inline bool arch_static_branch(struct static_key *key, 18*4882a593Smuzhiyun bool branch) 19*4882a593Smuzhiyun { 20*4882a593Smuzhiyun asm_volatile_goto( 21*4882a593Smuzhiyun " .option push \n\t" 22*4882a593Smuzhiyun " .option norelax \n\t" 23*4882a593Smuzhiyun " .option norvc \n\t" 24*4882a593Smuzhiyun "1: nop \n\t" 25*4882a593Smuzhiyun " .option pop \n\t" 26*4882a593Smuzhiyun " .pushsection __jump_table, \"aw\" \n\t" 27*4882a593Smuzhiyun " .align " RISCV_LGPTR " \n\t" 28*4882a593Smuzhiyun " .long 1b - ., %l[label] - . \n\t" 29*4882a593Smuzhiyun " " RISCV_PTR " %0 - . \n\t" 30*4882a593Smuzhiyun " .popsection \n\t" 31*4882a593Smuzhiyun : : "i"(&((char *)key)[branch]) : : label); 32*4882a593Smuzhiyun 33*4882a593Smuzhiyun return false; 34*4882a593Smuzhiyun label: 35*4882a593Smuzhiyun return true; 36*4882a593Smuzhiyun } 37*4882a593Smuzhiyun arch_static_branch_jump(struct static_key * key,bool branch)38*4882a593Smuzhiyunstatic __always_inline bool arch_static_branch_jump(struct static_key *key, 39*4882a593Smuzhiyun bool branch) 40*4882a593Smuzhiyun { 41*4882a593Smuzhiyun asm_volatile_goto( 42*4882a593Smuzhiyun " .option push \n\t" 43*4882a593Smuzhiyun " .option norelax \n\t" 44*4882a593Smuzhiyun " .option norvc \n\t" 45*4882a593Smuzhiyun "1: jal zero, %l[label] \n\t" 46*4882a593Smuzhiyun " .option pop \n\t" 47*4882a593Smuzhiyun " .pushsection __jump_table, \"aw\" \n\t" 48*4882a593Smuzhiyun " .align " RISCV_LGPTR " \n\t" 49*4882a593Smuzhiyun " .long 1b - ., %l[label] - . \n\t" 50*4882a593Smuzhiyun " " RISCV_PTR " %0 - . \n\t" 51*4882a593Smuzhiyun " .popsection \n\t" 52*4882a593Smuzhiyun : : "i"(&((char *)key)[branch]) : : label); 53*4882a593Smuzhiyun 54*4882a593Smuzhiyun return false; 55*4882a593Smuzhiyun label: 56*4882a593Smuzhiyun return true; 57*4882a593Smuzhiyun } 58*4882a593Smuzhiyun 59*4882a593Smuzhiyun #endif /* __ASSEMBLY__ */ 60*4882a593Smuzhiyun #endif /* __ASM_JUMP_LABEL_H */ 61