cachepc-linux

Fork of AMDESE/linux with modifications for CachePC side-channel attack
git clone https://git.sinitax.com/sinitax/cachepc-linux
Log | Files | Refs | README | LICENSE | sfeed.txt

jump_label.h (1396B)


      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 */