@@ -578,6 +578,14 @@ static inline pmd_t pmd_mkdevmap(pmd_t pmd)
578
578
return pte_pmd (set_pte_bit (pmd_pte (pmd ), __pgprot (PTE_DEVMAP )));
579
579
}
580
580
581
+ #ifdef CONFIG_ARCH_SUPPORTS_PMD_PFNMAP
582
+ #define pmd_special (pte ) (!!((pmd_val(pte) & PTE_SPECIAL)))
583
+ static inline pmd_t pmd_mkspecial (pmd_t pmd )
584
+ {
585
+ return set_pmd_bit (pmd , __pgprot (PTE_SPECIAL ));
586
+ }
587
+ #endif
588
+
581
589
#define __pmd_to_phys (pmd ) __pte_to_phys(pmd_pte(pmd))
582
590
#define __phys_to_pmd_val (phys ) __phys_to_pte_val(phys)
583
591
#define pmd_pfn (pmd ) ((__pmd_to_phys(pmd) & PMD_MASK) >> PAGE_SHIFT)
@@ -595,6 +603,27 @@ static inline pmd_t pmd_mkdevmap(pmd_t pmd)
595
603
#define pud_pfn (pud ) ((__pud_to_phys(pud) & PUD_MASK) >> PAGE_SHIFT)
596
604
#define pfn_pud (pfn ,prot ) __pud(__phys_to_pud_val((phys_addr_t)(pfn) << PAGE_SHIFT) | pgprot_val(prot))
597
605
606
+ #ifdef CONFIG_ARCH_SUPPORTS_PUD_PFNMAP
607
+ #define pud_special (pte ) pte_special(pud_pte(pud))
608
+ #define pud_mkspecial (pte ) pte_pud(pte_mkspecial(pud_pte(pud)))
609
+ #endif
610
+
611
+ #define pmd_pgprot pmd_pgprot
612
+ static inline pgprot_t pmd_pgprot (pmd_t pmd )
613
+ {
614
+ unsigned long pfn = pmd_pfn (pmd );
615
+
616
+ return __pgprot (pmd_val (pfn_pmd (pfn , __pgprot (0 ))) ^ pmd_val (pmd ));
617
+ }
618
+
619
+ #define pud_pgprot pud_pgprot
620
+ static inline pgprot_t pud_pgprot (pud_t pud )
621
+ {
622
+ unsigned long pfn = pud_pfn (pud );
623
+
624
+ return __pgprot (pud_val (pfn_pud (pfn , __pgprot (0 ))) ^ pud_val (pud ));
625
+ }
626
+
598
627
static inline void __set_pte_at (struct mm_struct * mm ,
599
628
unsigned long __always_unused addr ,
600
629
pte_t * ptep , pte_t pte , unsigned int nr )
0 commit comments