Linux kernel mirror (for testing)
git.kernel.org/pub/scm/linux/kernel/git/torvalds/linux.git
kernel
os
linux
1/* SPDX-License-Identifier: GPL-2.0-only */
2/*
3 * Copyright (C) 2013 Huawei Ltd.
4 * Author: Jiang Liu <liuj97@gmail.com>
5 *
6 * Based on arch/arm/include/asm/jump_label.h
7 */
8#ifndef __ASM_JUMP_LABEL_H
9#define __ASM_JUMP_LABEL_H
10
11#ifndef __ASSEMBLY__
12
13#include <linux/types.h>
14#include <asm/insn.h>
15
16#define HAVE_JUMP_LABEL_BATCH
17#define JUMP_LABEL_NOP_SIZE AARCH64_INSN_SIZE
18
19#define JUMP_TABLE_ENTRY(key, label) \
20 ".pushsection __jump_table, \"aw\"\n\t" \
21 ".align 3\n\t" \
22 ".long 1b - ., %l["#label"] - .\n\t" \
23 ".quad %c0 - .\n\t" \
24 ".popsection\n\t" \
25 : : "i"(key) : : label
26
27static __always_inline bool arch_static_branch(struct static_key * const key,
28 const bool branch)
29{
30 char *k = &((char *)key)[branch];
31
32 asm goto(
33 "1: nop \n\t"
34 JUMP_TABLE_ENTRY(k, l_yes)
35 );
36
37 return false;
38l_yes:
39 return true;
40}
41
42static __always_inline bool arch_static_branch_jump(struct static_key * const key,
43 const bool branch)
44{
45 char *k = &((char *)key)[branch];
46 asm goto(
47 "1: b %l[l_yes] \n\t"
48 JUMP_TABLE_ENTRY(k, l_yes)
49 );
50 return false;
51l_yes:
52 return true;
53}
54
55#endif /* __ASSEMBLY__ */
56#endif /* __ASM_JUMP_LABEL_H */