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