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

mmu.h (1544B)


      1/* SPDX-License-Identifier: GPL-2.0 */
      2#ifndef __MMU_H
      3#define __MMU_H
      4
      5#include <linux/cpumask.h>
      6#include <linux/errno.h>
      7#include <asm/asm-extable.h>
      8
      9typedef struct {
     10	spinlock_t lock;
     11	cpumask_t cpu_attach_mask;
     12	atomic_t flush_count;
     13	unsigned int flush_mm;
     14	struct list_head pgtable_list;
     15	struct list_head gmap_list;
     16	unsigned long gmap_asce;
     17	unsigned long asce;
     18	unsigned long asce_limit;
     19	unsigned long vdso_base;
     20	/* The mmu context belongs to a secure guest. */
     21	atomic_t is_protected;
     22	/*
     23	 * The following bitfields need a down_write on the mm
     24	 * semaphore when they are written to. As they are only
     25	 * written once, they can be read without a lock.
     26	 *
     27	 * The mmu context allocates 4K page tables.
     28	 */
     29	unsigned int alloc_pgste:1;
     30	/* The mmu context uses extended page tables. */
     31	unsigned int has_pgste:1;
     32	/* The mmu context uses storage keys. */
     33	unsigned int uses_skeys:1;
     34	/* The mmu context uses CMM. */
     35	unsigned int uses_cmm:1;
     36	/* The gmaps associated with this context are allowed to use huge pages. */
     37	unsigned int allow_gmap_hpage_1m:1;
     38} mm_context_t;
     39
     40#define INIT_MM_CONTEXT(name)						   \
     41	.context.lock =	__SPIN_LOCK_UNLOCKED(name.context.lock),	   \
     42	.context.pgtable_list = LIST_HEAD_INIT(name.context.pgtable_list), \
     43	.context.gmap_list = LIST_HEAD_INIT(name.context.gmap_list),
     44
     45static inline int tprot(unsigned long addr)
     46{
     47	int rc = -EFAULT;
     48
     49	asm volatile(
     50		"	tprot	0(%1),0\n"
     51		"0:	ipm	%0\n"
     52		"	srl	%0,28\n"
     53		"1:\n"
     54		EX_TABLE(0b,1b)
     55		: "+d" (rc) : "a" (addr) : "cc");
     56	return rc;
     57}
     58
     59#endif