函数源码

Linux Kernel

v5.5.9

Brick Technologies Co., Ltd

Source File:arch\x86\include\asm\mmu_context.h Create Date:2022-07-27 06:55:01
首页 Copyright©Brick

365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
/*
 * Using a temporary mm allows to set temporary mappings that are not accessible
 * by other CPUs. Such mappings are needed to perform sensitive memory writes
 * that override the kernel memory protections (e.g., W^X), without exposing the
 * temporary page-table mappings that are required for these write operations to
 * other CPUs. Using a temporary mm also allows to avoid TLB shootdowns when the
 * mapping is torn down.
 *
 * Context: The temporary mm needs to be used exclusively by a single core. To
 *          harden security IRQs must be disabled while the temporary mm is
 *          loaded, thereby preventing interrupt handler bugs from overriding
 *          the kernel memory protection.
 */
static inline temp_mm_state_t use_temporary_mm(struct mm_struct *mm)
{
    temp_mm_state_t temp_state;
 
    lockdep_assert_irqs_disabled();
    temp_state.mm = this_cpu_read(cpu_tlbstate.loaded_mm);
    switch_mm_irqs_off(NULL, mm, current);
 
    /*
     * If breakpoints are enabled, disable them while the temporary mm is
     * used. Userspace might set up watchpoints on addresses that are used
     * in the temporary mm, which would lead to wrong signals being sent or
     * crashes.
     *
     * Note that breakpoints are not disabled selectively, which also causes
     * kernel breakpoints (e.g., perf's) to be disabled. This might be
     * undesirable, but still seems reasonable as the code that runs in the
     * temporary mm should be short.
     */
    if (hw_breakpoint_active())
        hw_breakpoint_disable();
 
    return temp_state;
}