162306a36Sopenharmony_ci/* SPDX-License-Identifier: GPL-2.0 */ 262306a36Sopenharmony_ci#ifndef _ASM_X86_MMU_H 362306a36Sopenharmony_ci#define _ASM_X86_MMU_H 462306a36Sopenharmony_ci 562306a36Sopenharmony_ci#include <linux/spinlock.h> 662306a36Sopenharmony_ci#include <linux/rwsem.h> 762306a36Sopenharmony_ci#include <linux/mutex.h> 862306a36Sopenharmony_ci#include <linux/atomic.h> 962306a36Sopenharmony_ci#include <linux/bits.h> 1062306a36Sopenharmony_ci 1162306a36Sopenharmony_ci/* Uprobes on this MM assume 32-bit code */ 1262306a36Sopenharmony_ci#define MM_CONTEXT_UPROBE_IA32 0 1362306a36Sopenharmony_ci/* vsyscall page is accessible on this MM */ 1462306a36Sopenharmony_ci#define MM_CONTEXT_HAS_VSYSCALL 1 1562306a36Sopenharmony_ci/* Do not allow changing LAM mode */ 1662306a36Sopenharmony_ci#define MM_CONTEXT_LOCK_LAM 2 1762306a36Sopenharmony_ci/* Allow LAM and SVA coexisting */ 1862306a36Sopenharmony_ci#define MM_CONTEXT_FORCE_TAGGED_SVA 3 1962306a36Sopenharmony_ci 2062306a36Sopenharmony_ci/* 2162306a36Sopenharmony_ci * x86 has arch-specific MMU state beyond what lives in mm_struct. 2262306a36Sopenharmony_ci */ 2362306a36Sopenharmony_citypedef struct { 2462306a36Sopenharmony_ci /* 2562306a36Sopenharmony_ci * ctx_id uniquely identifies this mm_struct. A ctx_id will never 2662306a36Sopenharmony_ci * be reused, and zero is not a valid ctx_id. 2762306a36Sopenharmony_ci */ 2862306a36Sopenharmony_ci u64 ctx_id; 2962306a36Sopenharmony_ci 3062306a36Sopenharmony_ci /* 3162306a36Sopenharmony_ci * Any code that needs to do any sort of TLB flushing for this 3262306a36Sopenharmony_ci * mm will first make its changes to the page tables, then 3362306a36Sopenharmony_ci * increment tlb_gen, then flush. This lets the low-level 3462306a36Sopenharmony_ci * flushing code keep track of what needs flushing. 3562306a36Sopenharmony_ci * 3662306a36Sopenharmony_ci * This is not used on Xen PV. 3762306a36Sopenharmony_ci */ 3862306a36Sopenharmony_ci atomic64_t tlb_gen; 3962306a36Sopenharmony_ci 4062306a36Sopenharmony_ci#ifdef CONFIG_MODIFY_LDT_SYSCALL 4162306a36Sopenharmony_ci struct rw_semaphore ldt_usr_sem; 4262306a36Sopenharmony_ci struct ldt_struct *ldt; 4362306a36Sopenharmony_ci#endif 4462306a36Sopenharmony_ci 4562306a36Sopenharmony_ci#ifdef CONFIG_X86_64 4662306a36Sopenharmony_ci unsigned long flags; 4762306a36Sopenharmony_ci#endif 4862306a36Sopenharmony_ci 4962306a36Sopenharmony_ci#ifdef CONFIG_ADDRESS_MASKING 5062306a36Sopenharmony_ci /* Active LAM mode: X86_CR3_LAM_U48 or X86_CR3_LAM_U57 or 0 (disabled) */ 5162306a36Sopenharmony_ci unsigned long lam_cr3_mask; 5262306a36Sopenharmony_ci 5362306a36Sopenharmony_ci /* Significant bits of the virtual address. Excludes tag bits. */ 5462306a36Sopenharmony_ci u64 untag_mask; 5562306a36Sopenharmony_ci#endif 5662306a36Sopenharmony_ci 5762306a36Sopenharmony_ci struct mutex lock; 5862306a36Sopenharmony_ci void __user *vdso; /* vdso base address */ 5962306a36Sopenharmony_ci const struct vdso_image *vdso_image; /* vdso image in use */ 6062306a36Sopenharmony_ci 6162306a36Sopenharmony_ci atomic_t perf_rdpmc_allowed; /* nonzero if rdpmc is allowed */ 6262306a36Sopenharmony_ci#ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS 6362306a36Sopenharmony_ci /* 6462306a36Sopenharmony_ci * One bit per protection key says whether userspace can 6562306a36Sopenharmony_ci * use it or not. protected by mmap_lock. 6662306a36Sopenharmony_ci */ 6762306a36Sopenharmony_ci u16 pkey_allocation_map; 6862306a36Sopenharmony_ci s16 execute_only_pkey; 6962306a36Sopenharmony_ci#endif 7062306a36Sopenharmony_ci} mm_context_t; 7162306a36Sopenharmony_ci 7262306a36Sopenharmony_ci#define INIT_MM_CONTEXT(mm) \ 7362306a36Sopenharmony_ci .context = { \ 7462306a36Sopenharmony_ci .ctx_id = 1, \ 7562306a36Sopenharmony_ci .lock = __MUTEX_INITIALIZER(mm.context.lock), \ 7662306a36Sopenharmony_ci } 7762306a36Sopenharmony_ci 7862306a36Sopenharmony_civoid leave_mm(int cpu); 7962306a36Sopenharmony_ci#define leave_mm leave_mm 8062306a36Sopenharmony_ci 8162306a36Sopenharmony_ci#endif /* _ASM_X86_MMU_H */ 82