|
@@ -429,8 +429,27 @@ extern pgprot_t phys_mem_access_prot(struct file *file, unsigned long pfn,
|
|
|
PUD_TYPE_TABLE)
|
|
|
#endif
|
|
|
|
|
|
+extern pgd_t init_pg_dir[PTRS_PER_PGD];
|
|
|
+extern pgd_t init_pg_end[];
|
|
|
+extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
|
|
+extern pgd_t idmap_pg_dir[PTRS_PER_PGD];
|
|
|
+extern pgd_t tramp_pg_dir[PTRS_PER_PGD];
|
|
|
+
|
|
|
+extern void set_swapper_pgd(pgd_t *pgdp, pgd_t pgd);
|
|
|
+
|
|
|
+static inline bool in_swapper_pgdir(void *addr)
|
|
|
+{
|
|
|
+ return ((unsigned long)addr & PAGE_MASK) ==
|
|
|
+ ((unsigned long)swapper_pg_dir & PAGE_MASK);
|
|
|
+}
|
|
|
+
|
|
|
static inline void set_pmd(pmd_t *pmdp, pmd_t pmd)
|
|
|
{
|
|
|
+ if (__is_defined(__PAGETABLE_PMD_FOLDED) && in_swapper_pgdir(pmdp)) {
|
|
|
+ set_swapper_pgd((pgd_t *)pmdp, __pgd(pmd_val(pmd)));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
WRITE_ONCE(*pmdp, pmd);
|
|
|
|
|
|
if (pmd_valid(pmd))
|
|
@@ -484,6 +503,11 @@ static inline phys_addr_t pmd_page_paddr(pmd_t pmd)
|
|
|
|
|
|
static inline void set_pud(pud_t *pudp, pud_t pud)
|
|
|
{
|
|
|
+ if (__is_defined(__PAGETABLE_PUD_FOLDED) && in_swapper_pgdir(pudp)) {
|
|
|
+ set_swapper_pgd((pgd_t *)pudp, __pgd(pud_val(pud)));
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
WRITE_ONCE(*pudp, pud);
|
|
|
|
|
|
if (pud_valid(pud))
|
|
@@ -538,6 +562,11 @@ static inline phys_addr_t pud_page_paddr(pud_t pud)
|
|
|
|
|
|
static inline void set_pgd(pgd_t *pgdp, pgd_t pgd)
|
|
|
{
|
|
|
+ if (in_swapper_pgdir(pgdp)) {
|
|
|
+ set_swapper_pgd(pgdp, pgd);
|
|
|
+ return;
|
|
|
+ }
|
|
|
+
|
|
|
WRITE_ONCE(*pgdp, pgd);
|
|
|
dsb(ishst);
|
|
|
}
|
|
@@ -718,12 +747,6 @@ static inline pmd_t pmdp_establish(struct vm_area_struct *vma,
|
|
|
}
|
|
|
#endif
|
|
|
|
|
|
-extern pgd_t init_pg_dir[PTRS_PER_PGD];
|
|
|
-extern pgd_t init_pg_end[];
|
|
|
-extern pgd_t swapper_pg_dir[PTRS_PER_PGD];
|
|
|
-extern pgd_t idmap_pg_dir[PTRS_PER_PGD];
|
|
|
-extern pgd_t tramp_pg_dir[PTRS_PER_PGD];
|
|
|
-
|
|
|
/*
|
|
|
* Encode and decode a swap entry:
|
|
|
* bits 0-1: present (must be zero)
|