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 (1351B)


      1/* SPDX-License-Identifier: GPL-2.0-or-later */
      2#ifndef _ASM_POWERPC_JUMP_LABEL_H
      3#define _ASM_POWERPC_JUMP_LABEL_H
      4
      5/*
      6 * Copyright 2010 Michael Ellerman, IBM Corp.
      7 */
      8
      9#ifndef __ASSEMBLY__
     10#include <linux/types.h>
     11
     12#include <asm/feature-fixups.h>
     13#include <asm/asm-const.h>
     14
     15#define JUMP_ENTRY_TYPE		stringify_in_c(FTR_ENTRY_LONG)
     16#define JUMP_LABEL_NOP_SIZE	4
     17
     18static __always_inline bool arch_static_branch(struct static_key *key, bool branch)
     19{
     20	asm_volatile_goto("1:\n\t"
     21		 "nop # arch_static_branch\n\t"
     22		 ".pushsection __jump_table,  \"aw\"\n\t"
     23		 ".long 1b - ., %l[l_yes] - .\n\t"
     24		 JUMP_ENTRY_TYPE "%c0 - .\n\t"
     25		 ".popsection \n\t"
     26		 : :  "i" (&((char *)key)[branch]) : : l_yes);
     27
     28	return false;
     29l_yes:
     30	return true;
     31}
     32
     33static __always_inline bool arch_static_branch_jump(struct static_key *key, bool branch)
     34{
     35	asm_volatile_goto("1:\n\t"
     36		 "b %l[l_yes] # arch_static_branch_jump\n\t"
     37		 ".pushsection __jump_table,  \"aw\"\n\t"
     38		 ".long 1b - ., %l[l_yes] - .\n\t"
     39		 JUMP_ENTRY_TYPE "%c0 - .\n\t"
     40		 ".popsection \n\t"
     41		 : :  "i" (&((char *)key)[branch]) : : l_yes);
     42
     43	return false;
     44l_yes:
     45	return true;
     46}
     47
     48#else
     49#define ARCH_STATIC_BRANCH(LABEL, KEY)		\
     501098:	nop;					\
     51	.pushsection __jump_table, "aw";	\
     52	.long 1098b - ., LABEL - .;		\
     53	FTR_ENTRY_LONG KEY - .;			\
     54	.popsection
     55#endif
     56
     57#endif /* _ASM_POWERPC_JUMP_LABEL_H */