linux/arch/s390/include/asm/jump_label.h
<<
>>
Prefs
   1/* SPDX-License-Identifier: GPL-2.0 */
   2#ifndef _ASM_S390_JUMP_LABEL_H
   3#define _ASM_S390_JUMP_LABEL_H
   4
   5#ifndef __ASSEMBLY__
   6
   7#include <linux/types.h>
   8#include <linux/stringify.h>
   9
  10#define JUMP_LABEL_NOP_SIZE 6
  11#define JUMP_LABEL_NOP_OFFSET 2
  12
  13#ifdef CONFIG_CC_IS_CLANG
  14#define JUMP_LABEL_STATIC_KEY_CONSTRAINT "i"
  15#elif __GNUC__ < 9
  16#define JUMP_LABEL_STATIC_KEY_CONSTRAINT "X"
  17#else
  18#define JUMP_LABEL_STATIC_KEY_CONSTRAINT "jdd"
  19#endif
  20
  21/*
  22 * We use a brcl 0,2 instruction for jump labels at compile time so it
  23 * can be easily distinguished from a hotpatch generated instruction.
  24 */
  25static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
  26{
  27        asm_volatile_goto("0:   brcl    0,"__stringify(JUMP_LABEL_NOP_OFFSET)"\n"
  28                          ".pushsection __jump_table,\"aw\"\n"
  29                          ".balign      8\n"
  30                          ".long        0b-.,%l[label]-.\n"
  31                          ".quad        %0+%1-.\n"
  32                          ".popsection\n"
  33                          : : JUMP_LABEL_STATIC_KEY_CONSTRAINT (key), "i" (branch) : : label);
  34        return false;
  35label:
  36        return true;
  37}
  38
  39static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
  40{
  41        asm_volatile_goto("0:   brcl 15,%l[label]\n"
  42                          ".pushsection __jump_table,\"aw\"\n"
  43                          ".balign      8\n"
  44                          ".long        0b-.,%l[label]-.\n"
  45                          ".quad        %0+%1-.\n"
  46                          ".popsection\n"
  47                          : : JUMP_LABEL_STATIC_KEY_CONSTRAINT (key), "i" (branch) : : label);
  48        return false;
  49label:
  50        return true;
  51}
  52
  53#endif  /* __ASSEMBLY__ */
  54#endif
  55