OSDN Git Service

Merge tag 'x86_shstk_for_6.6-rc1' of git://git.kernel.org/pub/scm/linux/kernel/git...
[tomoyo/tomoyo-test1.git] / arch / x86 / mm / pgtable.c
index d3a93e8..9deadf5 100644 (file)
@@ -881,3 +881,43 @@ int pmd_free_pte_page(pmd_t *pmd, unsigned long addr)
 
 #endif /* CONFIG_X86_64 */
 #endif /* CONFIG_HAVE_ARCH_HUGE_VMAP */
+
+pte_t pte_mkwrite(pte_t pte, struct vm_area_struct *vma)
+{
+       if (vma->vm_flags & VM_SHADOW_STACK)
+               return pte_mkwrite_shstk(pte);
+
+       pte = pte_mkwrite_novma(pte);
+
+       return pte_clear_saveddirty(pte);
+}
+
+pmd_t pmd_mkwrite(pmd_t pmd, struct vm_area_struct *vma)
+{
+       if (vma->vm_flags & VM_SHADOW_STACK)
+               return pmd_mkwrite_shstk(pmd);
+
+       pmd = pmd_mkwrite_novma(pmd);
+
+       return pmd_clear_saveddirty(pmd);
+}
+
+void arch_check_zapped_pte(struct vm_area_struct *vma, pte_t pte)
+{
+       /*
+        * Hardware before shadow stack can (rarely) set Dirty=1
+        * on a Write=0 PTE. So the below condition
+        * only indicates a software bug when shadow stack is
+        * supported by the HW. This checking is covered in
+        * pte_shstk().
+        */
+       VM_WARN_ON_ONCE(!(vma->vm_flags & VM_SHADOW_STACK) &&
+                       pte_shstk(pte));
+}
+
+void arch_check_zapped_pmd(struct vm_area_struct *vma, pmd_t pmd)
+{
+       /* See note in arch_check_zapped_pte() */
+       VM_WARN_ON_ONCE(!(vma->vm_flags & VM_SHADOW_STACK) &&
+                       pmd_shstk(pmd));
+}