root/arch/x86/include/asm/mmu_context.h

/* [<][>][^][v][top][bottom][index][help] */

INCLUDED FROM


DEFINITIONS

This source file includes following definitions.
  1. paravirt_activate_mm
  2. load_mm_cr4_irqsoff
  3. load_mm_cr4_irqsoff
  4. ldt_slot_va
  5. init_new_context_ldt
  6. init_new_context_ldt
  7. ldt_dup_context
  8. destroy_context_ldt
  9. ldt_arch_exit_mmap
  10. load_mm_ldt
  11. switch_ldt
  12. init_new_context
  13. destroy_context
  14. arch_dup_pkeys
  15. arch_dup_mmap
  16. arch_exit_mmap
  17. is_64bit_mm
  18. is_64bit_mm
  19. arch_bprm_mm_init
  20. arch_unmap
  21. vma_is_foreign
  22. arch_vma_access_permitted
  23. __get_current_cr3_fast
  24. use_temporary_mm
  25. unuse_temporary_mm

   1 /* SPDX-License-Identifier: GPL-2.0 */
   2 #ifndef _ASM_X86_MMU_CONTEXT_H
   3 #define _ASM_X86_MMU_CONTEXT_H
   4 
   5 #include <asm/desc.h>
   6 #include <linux/atomic.h>
   7 #include <linux/mm_types.h>
   8 #include <linux/pkeys.h>
   9 
  10 #include <trace/events/tlb.h>
  11 
  12 #include <asm/pgalloc.h>
  13 #include <asm/tlbflush.h>
  14 #include <asm/paravirt.h>
  15 #include <asm/mpx.h>
  16 #include <asm/debugreg.h>
  17 
  18 extern atomic64_t last_mm_ctx_id;
  19 
  20 #ifndef CONFIG_PARAVIRT_XXL
  21 static inline void paravirt_activate_mm(struct mm_struct *prev,
  22                                         struct mm_struct *next)
  23 {
  24 }
  25 #endif  /* !CONFIG_PARAVIRT_XXL */
  26 
  27 #ifdef CONFIG_PERF_EVENTS
  28 
  29 DECLARE_STATIC_KEY_FALSE(rdpmc_always_available_key);
  30 
  31 static inline void load_mm_cr4_irqsoff(struct mm_struct *mm)
  32 {
  33         if (static_branch_unlikely(&rdpmc_always_available_key) ||
  34             atomic_read(&mm->context.perf_rdpmc_allowed))
  35                 cr4_set_bits_irqsoff(X86_CR4_PCE);
  36         else
  37                 cr4_clear_bits_irqsoff(X86_CR4_PCE);
  38 }
  39 #else
  40 static inline void load_mm_cr4_irqsoff(struct mm_struct *mm) {}
  41 #endif
  42 
  43 #ifdef CONFIG_MODIFY_LDT_SYSCALL
  44 /*
  45  * ldt_structs can be allocated, used, and freed, but they are never
  46  * modified while live.
  47  */
  48 struct ldt_struct {
  49         /*
  50          * Xen requires page-aligned LDTs with special permissions.  This is
  51          * needed to prevent us from installing evil descriptors such as
  52          * call gates.  On native, we could merge the ldt_struct and LDT
  53          * allocations, but it's not worth trying to optimize.
  54          */
  55         struct desc_struct      *entries;
  56         unsigned int            nr_entries;
  57 
  58         /*
  59          * If PTI is in use, then the entries array is not mapped while we're
  60          * in user mode.  The whole array will be aliased at the addressed
  61          * given by ldt_slot_va(slot).  We use two slots so that we can allocate
  62          * and map, and enable a new LDT without invalidating the mapping
  63          * of an older, still-in-use LDT.
  64          *
  65          * slot will be -1 if this LDT doesn't have an alias mapping.
  66          */
  67         int                     slot;
  68 };
  69 
  70 /* This is a multiple of PAGE_SIZE. */
  71 #define LDT_SLOT_STRIDE (LDT_ENTRIES * LDT_ENTRY_SIZE)
  72 
  73 static inline void *ldt_slot_va(int slot)
  74 {
  75         return (void *)(LDT_BASE_ADDR + LDT_SLOT_STRIDE * slot);
  76 }
  77 
  78 /*
  79  * Used for LDT copy/destruction.
  80  */
  81 static inline void init_new_context_ldt(struct mm_struct *mm)
  82 {
  83         mm->context.ldt = NULL;
  84         init_rwsem(&mm->context.ldt_usr_sem);
  85 }
  86 int ldt_dup_context(struct mm_struct *oldmm, struct mm_struct *mm);
  87 void destroy_context_ldt(struct mm_struct *mm);
  88 void ldt_arch_exit_mmap(struct mm_struct *mm);
  89 #else   /* CONFIG_MODIFY_LDT_SYSCALL */
  90 static inline void init_new_context_ldt(struct mm_struct *mm) { }
  91 static inline int ldt_dup_context(struct mm_struct *oldmm,
  92                                   struct mm_struct *mm)
  93 {
  94         return 0;
  95 }
  96 static inline void destroy_context_ldt(struct mm_struct *mm) { }
  97 static inline void ldt_arch_exit_mmap(struct mm_struct *mm) { }
  98 #endif
  99 
 100 static inline void load_mm_ldt(struct mm_struct *mm)
 101 {
 102 #ifdef CONFIG_MODIFY_LDT_SYSCALL
 103         struct ldt_struct *ldt;
 104 
 105         /* READ_ONCE synchronizes with smp_store_release */
 106         ldt = READ_ONCE(mm->context.ldt);
 107 
 108         /*
 109          * Any change to mm->context.ldt is followed by an IPI to all
 110          * CPUs with the mm active.  The LDT will not be freed until
 111          * after the IPI is handled by all such CPUs.  This means that,
 112          * if the ldt_struct changes before we return, the values we see
 113          * will be safe, and the new values will be loaded before we run
 114          * any user code.
 115          *
 116          * NB: don't try to convert this to use RCU without extreme care.
 117          * We would still need IRQs off, because we don't want to change
 118          * the local LDT after an IPI loaded a newer value than the one
 119          * that we can see.
 120          */
 121 
 122         if (unlikely(ldt)) {
 123                 if (static_cpu_has(X86_FEATURE_PTI)) {
 124                         if (WARN_ON_ONCE((unsigned long)ldt->slot > 1)) {
 125                                 /*
 126                                  * Whoops -- either the new LDT isn't mapped
 127                                  * (if slot == -1) or is mapped into a bogus
 128                                  * slot (if slot > 1).
 129                                  */
 130                                 clear_LDT();
 131                                 return;
 132                         }
 133 
 134                         /*
 135                          * If page table isolation is enabled, ldt->entries
 136                          * will not be mapped in the userspace pagetables.
 137                          * Tell the CPU to access the LDT through the alias
 138                          * at ldt_slot_va(ldt->slot).
 139                          */
 140                         set_ldt(ldt_slot_va(ldt->slot), ldt->nr_entries);
 141                 } else {
 142                         set_ldt(ldt->entries, ldt->nr_entries);
 143                 }
 144         } else {
 145                 clear_LDT();
 146         }
 147 #else
 148         clear_LDT();
 149 #endif
 150 }
 151 
 152 static inline void switch_ldt(struct mm_struct *prev, struct mm_struct *next)
 153 {
 154 #ifdef CONFIG_MODIFY_LDT_SYSCALL
 155         /*
 156          * Load the LDT if either the old or new mm had an LDT.
 157          *
 158          * An mm will never go from having an LDT to not having an LDT.  Two
 159          * mms never share an LDT, so we don't gain anything by checking to
 160          * see whether the LDT changed.  There's also no guarantee that
 161          * prev->context.ldt actually matches LDTR, but, if LDTR is non-NULL,
 162          * then prev->context.ldt will also be non-NULL.
 163          *
 164          * If we really cared, we could optimize the case where prev == next
 165          * and we're exiting lazy mode.  Most of the time, if this happens,
 166          * we don't actually need to reload LDTR, but modify_ldt() is mostly
 167          * used by legacy code and emulators where we don't need this level of
 168          * performance.
 169          *
 170          * This uses | instead of || because it generates better code.
 171          */
 172         if (unlikely((unsigned long)prev->context.ldt |
 173                      (unsigned long)next->context.ldt))
 174                 load_mm_ldt(next);
 175 #endif
 176 
 177         DEBUG_LOCKS_WARN_ON(preemptible());
 178 }
 179 
 180 void enter_lazy_tlb(struct mm_struct *mm, struct task_struct *tsk);
 181 
 182 /*
 183  * Init a new mm.  Used on mm copies, like at fork()
 184  * and on mm's that are brand-new, like at execve().
 185  */
 186 static inline int init_new_context(struct task_struct *tsk,
 187                                    struct mm_struct *mm)
 188 {
 189         mutex_init(&mm->context.lock);
 190 
 191         mm->context.ctx_id = atomic64_inc_return(&last_mm_ctx_id);
 192         atomic64_set(&mm->context.tlb_gen, 0);
 193 
 194 #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
 195         if (cpu_feature_enabled(X86_FEATURE_OSPKE)) {
 196                 /* pkey 0 is the default and allocated implicitly */
 197                 mm->context.pkey_allocation_map = 0x1;
 198                 /* -1 means unallocated or invalid */
 199                 mm->context.execute_only_pkey = -1;
 200         }
 201 #endif
 202         init_new_context_ldt(mm);
 203         return 0;
 204 }
 205 static inline void destroy_context(struct mm_struct *mm)
 206 {
 207         destroy_context_ldt(mm);
 208 }
 209 
 210 extern void switch_mm(struct mm_struct *prev, struct mm_struct *next,
 211                       struct task_struct *tsk);
 212 
 213 extern void switch_mm_irqs_off(struct mm_struct *prev, struct mm_struct *next,
 214                                struct task_struct *tsk);
 215 #define switch_mm_irqs_off switch_mm_irqs_off
 216 
 217 #define activate_mm(prev, next)                 \
 218 do {                                            \
 219         paravirt_activate_mm((prev), (next));   \
 220         switch_mm((prev), (next), NULL);        \
 221 } while (0);
 222 
 223 #ifdef CONFIG_X86_32
 224 #define deactivate_mm(tsk, mm)                  \
 225 do {                                            \
 226         lazy_load_gs(0);                        \
 227 } while (0)
 228 #else
 229 #define deactivate_mm(tsk, mm)                  \
 230 do {                                            \
 231         load_gs_index(0);                       \
 232         loadsegment(fs, 0);                     \
 233 } while (0)
 234 #endif
 235 
 236 static inline void arch_dup_pkeys(struct mm_struct *oldmm,
 237                                   struct mm_struct *mm)
 238 {
 239 #ifdef CONFIG_X86_INTEL_MEMORY_PROTECTION_KEYS
 240         if (!cpu_feature_enabled(X86_FEATURE_OSPKE))
 241                 return;
 242 
 243         /* Duplicate the oldmm pkey state in mm: */
 244         mm->context.pkey_allocation_map = oldmm->context.pkey_allocation_map;
 245         mm->context.execute_only_pkey   = oldmm->context.execute_only_pkey;
 246 #endif
 247 }
 248 
 249 static inline int arch_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm)
 250 {
 251         arch_dup_pkeys(oldmm, mm);
 252         paravirt_arch_dup_mmap(oldmm, mm);
 253         return ldt_dup_context(oldmm, mm);
 254 }
 255 
 256 static inline void arch_exit_mmap(struct mm_struct *mm)
 257 {
 258         paravirt_arch_exit_mmap(mm);
 259         ldt_arch_exit_mmap(mm);
 260 }
 261 
 262 #ifdef CONFIG_X86_64
 263 static inline bool is_64bit_mm(struct mm_struct *mm)
 264 {
 265         return  !IS_ENABLED(CONFIG_IA32_EMULATION) ||
 266                 !(mm->context.ia32_compat == TIF_IA32);
 267 }
 268 #else
 269 static inline bool is_64bit_mm(struct mm_struct *mm)
 270 {
 271         return false;
 272 }
 273 #endif
 274 
 275 static inline void arch_bprm_mm_init(struct mm_struct *mm,
 276                 struct vm_area_struct *vma)
 277 {
 278         mpx_mm_init(mm);
 279 }
 280 
 281 static inline void arch_unmap(struct mm_struct *mm, unsigned long start,
 282                               unsigned long end)
 283 {
 284         /*
 285          * mpx_notify_unmap() goes and reads a rarely-hot
 286          * cacheline in the mm_struct.  That can be expensive
 287          * enough to be seen in profiles.
 288          *
 289          * The mpx_notify_unmap() call and its contents have been
 290          * observed to affect munmap() performance on hardware
 291          * where MPX is not present.
 292          *
 293          * The unlikely() optimizes for the fast case: no MPX
 294          * in the CPU, or no MPX use in the process.  Even if
 295          * we get this wrong (in the unlikely event that MPX
 296          * is widely enabled on some system) the overhead of
 297          * MPX itself (reading bounds tables) is expected to
 298          * overwhelm the overhead of getting this unlikely()
 299          * consistently wrong.
 300          */
 301         if (unlikely(cpu_feature_enabled(X86_FEATURE_MPX)))
 302                 mpx_notify_unmap(mm, start, end);
 303 }
 304 
 305 /*
 306  * We only want to enforce protection keys on the current process
 307  * because we effectively have no access to PKRU for other
 308  * processes or any way to tell *which * PKRU in a threaded
 309  * process we could use.
 310  *
 311  * So do not enforce things if the VMA is not from the current
 312  * mm, or if we are in a kernel thread.
 313  */
 314 static inline bool vma_is_foreign(struct vm_area_struct *vma)
 315 {
 316         if (!current->mm)
 317                 return true;
 318         /*
 319          * Should PKRU be enforced on the access to this VMA?  If
 320          * the VMA is from another process, then PKRU has no
 321          * relevance and should not be enforced.
 322          */
 323         if (current->mm != vma->vm_mm)
 324                 return true;
 325 
 326         return false;
 327 }
 328 
 329 static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
 330                 bool write, bool execute, bool foreign)
 331 {
 332         /* pkeys never affect instruction fetches */
 333         if (execute)
 334                 return true;
 335         /* allow access if the VMA is not one from this process */
 336         if (foreign || vma_is_foreign(vma))
 337                 return true;
 338         return __pkru_allows_pkey(vma_pkey(vma), write);
 339 }
 340 
 341 /*
 342  * This can be used from process context to figure out what the value of
 343  * CR3 is without needing to do a (slow) __read_cr3().
 344  *
 345  * It's intended to be used for code like KVM that sneakily changes CR3
 346  * and needs to restore it.  It needs to be used very carefully.
 347  */
 348 static inline unsigned long __get_current_cr3_fast(void)
 349 {
 350         unsigned long cr3 = build_cr3(this_cpu_read(cpu_tlbstate.loaded_mm)->pgd,
 351                 this_cpu_read(cpu_tlbstate.loaded_mm_asid));
 352 
 353         /* For now, be very restrictive about when this can be called. */
 354         VM_WARN_ON(in_nmi() || preemptible());
 355 
 356         VM_BUG_ON(cr3 != __read_cr3());
 357         return cr3;
 358 }
 359 
 360 typedef struct {
 361         struct mm_struct *mm;
 362 } temp_mm_state_t;
 363 
 364 /*
 365  * Using a temporary mm allows to set temporary mappings that are not accessible
 366  * by other CPUs. Such mappings are needed to perform sensitive memory writes
 367  * that override the kernel memory protections (e.g., W^X), without exposing the
 368  * temporary page-table mappings that are required for these write operations to
 369  * other CPUs. Using a temporary mm also allows to avoid TLB shootdowns when the
 370  * mapping is torn down.
 371  *
 372  * Context: The temporary mm needs to be used exclusively by a single core. To
 373  *          harden security IRQs must be disabled while the temporary mm is
 374  *          loaded, thereby preventing interrupt handler bugs from overriding
 375  *          the kernel memory protection.
 376  */
 377 static inline temp_mm_state_t use_temporary_mm(struct mm_struct *mm)
 378 {
 379         temp_mm_state_t temp_state;
 380 
 381         lockdep_assert_irqs_disabled();
 382         temp_state.mm = this_cpu_read(cpu_tlbstate.loaded_mm);
 383         switch_mm_irqs_off(NULL, mm, current);
 384 
 385         /*
 386          * If breakpoints are enabled, disable them while the temporary mm is
 387          * used. Userspace might set up watchpoints on addresses that are used
 388          * in the temporary mm, which would lead to wrong signals being sent or
 389          * crashes.
 390          *
 391          * Note that breakpoints are not disabled selectively, which also causes
 392          * kernel breakpoints (e.g., perf's) to be disabled. This might be
 393          * undesirable, but still seems reasonable as the code that runs in the
 394          * temporary mm should be short.
 395          */
 396         if (hw_breakpoint_active())
 397                 hw_breakpoint_disable();
 398 
 399         return temp_state;
 400 }
 401 
 402 static inline void unuse_temporary_mm(temp_mm_state_t prev_state)
 403 {
 404         lockdep_assert_irqs_disabled();
 405         switch_mm_irqs_off(NULL, prev_state.mm, current);
 406 
 407         /*
 408          * Restore the breakpoints if they were disabled before the temporary mm
 409          * was loaded.
 410          */
 411         if (hw_breakpoint_active())
 412                 hw_breakpoint_restore();
 413 }
 414 
 415 #endif /* _ASM_X86_MMU_CONTEXT_H */

/* [<][>][^][v][top][bottom][index][help] */