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