]> git.ipfire.org Git - thirdparty/linux.git/commitdiff
x86/alternatives: Move temporary_mm helpers into C
authorThomas Gleixner <tglx@linutronix.de>
Tue, 21 Apr 2020 09:20:31 +0000 (11:20 +0200)
committerBorislav Petkov <bp@suse.de>
Fri, 24 Apr 2020 17:12:56 +0000 (19:12 +0200)
The only user of these inlines is the text poke code and this must not be
exposed to the world.

No functional change.

Signed-off-by: Thomas Gleixner <tglx@linutronix.de>
Signed-off-by: Borislav Petkov <bp@suse.de>
Reviewed-by: Alexandre Chartre <alexandre.chartre@oracle.com>
Acked-by: Peter Zijlstra (Intel) <peterz@infradead.org>
Link: https://lkml.kernel.org/r/20200421092559.139069561@linutronix.de
arch/x86/include/asm/mmu_context.h
arch/x86/kernel/alternative.c

index 2985d06660aa1a45953a10d502f1f770b9482f58..47562147e70b887902dd9ade36c4ab1bed9f3f6b 100644 (file)
@@ -215,59 +215,4 @@ static inline bool arch_vma_access_permitted(struct vm_area_struct *vma,
 
 unsigned long __get_current_cr3_fast(void);
 
-typedef struct {
-       struct mm_struct *mm;
-} temp_mm_state_t;
-
-/*
- * 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;
-}
-
-static inline void unuse_temporary_mm(temp_mm_state_t prev_state)
-{
-       lockdep_assert_irqs_disabled();
-       switch_mm_irqs_off(NULL, prev_state.mm, current);
-
-       /*
-        * Restore the breakpoints if they were disabled before the temporary mm
-        * was loaded.
-        */
-       if (hw_breakpoint_active())
-               hw_breakpoint_restore();
-}
-
 #endif /* _ASM_X86_MMU_CONTEXT_H */
index 7867dfb3963ec13c01240ec5278cfa964b426fab..cd617979b7fcf74ffe5cfcb7af5727afa3a07ecb 100644 (file)
@@ -783,6 +783,61 @@ void __init_or_module text_poke_early(void *addr, const void *opcode,
        }
 }
 
+typedef struct {
+       struct mm_struct *mm;
+} temp_mm_state_t;
+
+/*
+ * 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;
+}
+
+static inline void unuse_temporary_mm(temp_mm_state_t prev_state)
+{
+       lockdep_assert_irqs_disabled();
+       switch_mm_irqs_off(NULL, prev_state.mm, current);
+
+       /*
+        * Restore the breakpoints if they were disabled before the temporary mm
+        * was loaded.
+        */
+       if (hw_breakpoint_active())
+               hw_breakpoint_restore();
+}
+
 __ro_after_init struct mm_struct *poking_mm;
 __ro_after_init unsigned long poking_addr;