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

guarded_storage.h (1208B)


      1/* SPDX-License-Identifier: GPL-2.0 WITH Linux-syscall-note */
      2#ifndef _GUARDED_STORAGE_H
      3#define _GUARDED_STORAGE_H
      4
      5#include <linux/types.h>
      6
      7struct gs_cb {
      8	__u64 reserved;
      9	__u64 gsd;
     10	__u64 gssm;
     11	__u64 gs_epl_a;
     12};
     13
     14struct gs_epl {
     15	__u8 pad1;
     16	union {
     17		__u8 gs_eam;
     18		struct {
     19			__u8	: 6;
     20			__u8 e	: 1;
     21			__u8 b	: 1;
     22		};
     23	};
     24	union {
     25		__u8 gs_eci;
     26		struct {
     27			__u8 tx	: 1;
     28			__u8 cx	: 1;
     29			__u8	: 5;
     30			__u8 in	: 1;
     31		};
     32	};
     33	union {
     34		__u8 gs_eai;
     35		struct {
     36			__u8	: 1;
     37			__u8 t	: 1;
     38			__u8 as	: 2;
     39			__u8 ar	: 4;
     40		};
     41	};
     42	__u32 pad2;
     43	__u64 gs_eha;
     44	__u64 gs_eia;
     45	__u64 gs_eoa;
     46	__u64 gs_eir;
     47	__u64 gs_era;
     48};
     49
     50#define GS_ENABLE	0
     51#define	GS_DISABLE	1
     52#define GS_SET_BC_CB	2
     53#define GS_CLEAR_BC_CB	3
     54#define GS_BROADCAST	4
     55
     56static inline void load_gs_cb(struct gs_cb *gs_cb)
     57{
     58	asm volatile(".insn rxy,0xe3000000004d,0,%0" : : "Q" (*gs_cb));
     59}
     60
     61static inline void store_gs_cb(struct gs_cb *gs_cb)
     62{
     63	asm volatile(".insn rxy,0xe30000000049,0,%0" : : "Q" (*gs_cb));
     64}
     65
     66static inline void save_gs_cb(struct gs_cb *gs_cb)
     67{
     68	if (gs_cb)
     69		store_gs_cb(gs_cb);
     70}
     71
     72static inline void restore_gs_cb(struct gs_cb *gs_cb)
     73{
     74	if (gs_cb)
     75		load_gs_cb(gs_cb);
     76}
     77
     78#endif /* _GUARDED_STORAGE_H */