|
@@ -51,7 +51,7 @@ static int ident_pud_init(struct x86_mapping_info *info, pud_t *pud_page,
|
|
|
if (!pmd)
|
|
|
return -ENOMEM;
|
|
|
ident_pmd_init(info, pmd, addr, next);
|
|
|
- set_pud(pud, __pud(__pa(pmd) | _KERNPG_TABLE));
|
|
|
+ set_pud(pud, __pud(__pa(pmd) | info->kernpg_flag));
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -79,7 +79,7 @@ static int ident_p4d_init(struct x86_mapping_info *info, p4d_t *p4d_page,
|
|
|
if (!pud)
|
|
|
return -ENOMEM;
|
|
|
ident_pud_init(info, pud, addr, next);
|
|
|
- set_p4d(p4d, __p4d(__pa(pud) | _KERNPG_TABLE));
|
|
|
+ set_p4d(p4d, __p4d(__pa(pud) | info->kernpg_flag));
|
|
|
}
|
|
|
|
|
|
return 0;
|
|
@@ -93,6 +93,10 @@ int kernel_ident_mapping_init(struct x86_mapping_info *info, pgd_t *pgd_page,
|
|
|
unsigned long next;
|
|
|
int result;
|
|
|
|
|
|
+ /* Set the default pagetable flags if not supplied */
|
|
|
+ if (!info->kernpg_flag)
|
|
|
+ info->kernpg_flag = _KERNPG_TABLE;
|
|
|
+
|
|
|
for (; addr < end; addr = next) {
|
|
|
pgd_t *pgd = pgd_page + pgd_index(addr);
|
|
|
p4d_t *p4d;
|
|
@@ -116,14 +120,14 @@ int kernel_ident_mapping_init(struct x86_mapping_info *info, pgd_t *pgd_page,
|
|
|
if (result)
|
|
|
return result;
|
|
|
if (IS_ENABLED(CONFIG_X86_5LEVEL)) {
|
|
|
- set_pgd(pgd, __pgd(__pa(p4d) | _KERNPG_TABLE));
|
|
|
+ set_pgd(pgd, __pgd(__pa(p4d) | info->kernpg_flag));
|
|
|
} else {
|
|
|
/*
|
|
|
* With p4d folded, pgd is equal to p4d.
|
|
|
* The pgd entry has to point to the pud page table in this case.
|
|
|
*/
|
|
|
pud_t *pud = pud_offset(p4d, 0);
|
|
|
- set_pgd(pgd, __pgd(__pa(pud) | _KERNPG_TABLE));
|
|
|
+ set_pgd(pgd, __pgd(__pa(pud) | info->kernpg_flag));
|
|
|
}
|
|
|
}
|
|
|
|