|
@@ -538,6 +538,22 @@ static void xen_set_p4d(p4d_t *ptr, p4d_t val)
|
|
|
|
|
|
xen_mc_issue(PARAVIRT_LAZY_MMU);
|
|
|
}
|
|
|
+
|
|
|
+#if CONFIG_PGTABLE_LEVELS >= 5
|
|
|
+__visible p4dval_t xen_p4d_val(p4d_t p4d)
|
|
|
+{
|
|
|
+ return pte_mfn_to_pfn(p4d.p4d);
|
|
|
+}
|
|
|
+PV_CALLEE_SAVE_REGS_THUNK(xen_p4d_val);
|
|
|
+
|
|
|
+__visible p4d_t xen_make_p4d(p4dval_t p4d)
|
|
|
+{
|
|
|
+ p4d = pte_pfn_to_mfn(p4d);
|
|
|
+
|
|
|
+ return native_make_p4d(p4d);
|
|
|
+}
|
|
|
+PV_CALLEE_SAVE_REGS_THUNK(xen_make_p4d);
|
|
|
+#endif /* CONFIG_PGTABLE_LEVELS >= 5 */
|
|
|
#endif /* CONFIG_X86_64 */
|
|
|
|
|
|
static int xen_pmd_walk(struct mm_struct *mm, pmd_t *pmd,
|
|
@@ -2411,6 +2427,11 @@ static const struct pv_mmu_ops xen_mmu_ops __initconst = {
|
|
|
|
|
|
.alloc_pud = xen_alloc_pmd_init,
|
|
|
.release_pud = xen_release_pmd_init,
|
|
|
+
|
|
|
+#if CONFIG_PGTABLE_LEVELS >= 5
|
|
|
+ .p4d_val = PV_CALLEE_SAVE(xen_p4d_val),
|
|
|
+ .make_p4d = PV_CALLEE_SAVE(xen_make_p4d),
|
|
|
+#endif
|
|
|
#endif /* CONFIG_X86_64 */
|
|
|
|
|
|
.activate_mm = xen_activate_mm,
|