File Index
Files and directories
Sign in
FILE

jump_label.h

File preview with syntax highlighting.

linux-6.19.14/arch/openrisc/include/asm/jump_label.h C
 1/* SPDX-License-Identifier: GPL-2.0-only */
 2/*
 3 * Copyright (C) 2025 Chen Miao
 4 *
 5 * Based on arch/arm/include/asm/jump_label.h
 6 */
 7#ifndef __ASM_OPENRISC_JUMP_LABEL_H
 8#define __ASM_OPENRISC_JUMP_LABEL_H
 9
10#ifndef __ASSEMBLER__
11
12#include <linux/types.h>
13#include <asm/insn-def.h>
14
15#define HAVE_JUMP_LABEL_BATCH
16
17#define JUMP_LABEL_NOP_SIZE OPENRISC_INSN_SIZE
18
19/**
20 * JUMP_TABLE_ENTRY - Create a jump table entry
21 * @key: Jump key identifier (typically a symbol address)
22 * @label: Target label address
23 *
24 * This macro creates a jump table entry in the dedicated kernel section (__jump_table).
25 * Each entry contains the following information:
26 * 		Offset from current instruction to jump instruction (1b - .)
27 * 		Offset from current instruction to target label (label - .)
28 * 		Offset from current instruction to key identifier (key - .)
29 */
30#define JUMP_TABLE_ENTRY(key, label)			\
31	".pushsection	__jump_table, \"aw\"	\n\t"	\
32	".align 	4 			\n\t"	\
33	".long 		1b - ., " label " - .	\n\t"	\
34	".long 		" key " - . 		\n\t"	\
35	".popsection				\n\t"
36
37#define ARCH_STATIC_BRANCH_ASM(key, label)		\
38	".align		4			\n\t"	\
39	"1: l.nop				\n\t"	\
40	"    l.nop				\n\t"	\
41	JUMP_TABLE_ENTRY(key, label)
42
43static __always_inline bool arch_static_branch(struct static_key *const key,
44					       const bool branch)
45{
46	asm goto (ARCH_STATIC_BRANCH_ASM("%0", "%l[l_yes]")
47		  ::"i"(&((char *)key)[branch])::l_yes);
48
49	return false;
50l_yes:
51	return true;
52}
53
54#define ARCH_STATIC_BRANCH_JUMP_ASM(key, label)		\
55	".align		4			\n\t"	\
56	"1: l.j	" label "			\n\t"	\
57	"    l.nop				\n\t"	\
58	JUMP_TABLE_ENTRY(key, label)
59
60static __always_inline bool
61arch_static_branch_jump(struct static_key *const key, const bool branch)
62{
63	asm goto (ARCH_STATIC_BRANCH_JUMP_ASM("%0", "%l[l_yes]")
64		  ::"i"(&((char *)key)[branch])::l_yes);
65
66	return false;
67l_yes:
68	return true;
69}
70
71#endif /* __ASSEMBLER__ */
72#endif /* __ASM_OPENRISC_JUMP_LABEL_H */
~/ Read-only file preview.