|
@@ -357,6 +357,16 @@ static inline void paravirt_release_pud(unsigned long pfn)
|
|
|
PVOP_VCALL1(pv_mmu_ops.release_pud, pfn);
|
|
|
}
|
|
|
|
|
|
+static inline void paravirt_alloc_p4d(struct mm_struct *mm, unsigned long pfn)
|
|
|
+{
|
|
|
+ PVOP_VCALL2(pv_mmu_ops.alloc_p4d, mm, pfn);
|
|
|
+}
|
|
|
+
|
|
|
+static inline void paravirt_release_p4d(unsigned long pfn)
|
|
|
+{
|
|
|
+ PVOP_VCALL1(pv_mmu_ops.release_p4d, pfn);
|
|
|
+}
|
|
|
+
|
|
|
static inline void pte_update(struct mm_struct *mm, unsigned long addr,
|
|
|
pte_t *ptep)
|
|
|
{
|
|
@@ -582,25 +592,25 @@ static inline void set_p4d(p4d_t *p4dp, p4d_t p4d)
|
|
|
val);
|
|
|
}
|
|
|
|
|
|
-static inline void p4d_clear(p4d_t *p4dp)
|
|
|
+#if CONFIG_PGTABLE_LEVELS >= 5
|
|
|
+
|
|
|
+static inline p4d_t __p4d(p4dval_t val)
|
|
|
{
|
|
|
- set_p4d(p4dp, __p4d(0));
|
|
|
-}
|
|
|
+ p4dval_t ret = PVOP_CALLEE1(p4dval_t, pv_mmu_ops.make_p4d, val);
|
|
|
|
|
|
-#if CONFIG_PGTABLE_LEVELS >= 5
|
|
|
+ return (p4d_t) { ret };
|
|
|
+}
|
|
|
|
|
|
-#error FIXME
|
|
|
+static inline p4dval_t p4d_val(p4d_t p4d)
|
|
|
+{
|
|
|
+ return PVOP_CALLEE1(p4dval_t, pv_mmu_ops.p4d_val, p4d.p4d);
|
|
|
+}
|
|
|
|
|
|
static inline void set_pgd(pgd_t *pgdp, pgd_t pgd)
|
|
|
{
|
|
|
pgdval_t val = native_pgd_val(pgd);
|
|
|
|
|
|
- if (sizeof(pgdval_t) > sizeof(long))
|
|
|
- PVOP_VCALL3(pv_mmu_ops.set_pgd, pgdp,
|
|
|
- val, (u64)val >> 32);
|
|
|
- else
|
|
|
- PVOP_VCALL2(pv_mmu_ops.set_pgd, pgdp,
|
|
|
- val);
|
|
|
+ PVOP_VCALL2(pv_mmu_ops.set_pgd, pgdp, val);
|
|
|
}
|
|
|
|
|
|
static inline void pgd_clear(pgd_t *pgdp)
|
|
@@ -610,6 +620,11 @@ static inline void pgd_clear(pgd_t *pgdp)
|
|
|
|
|
|
#endif /* CONFIG_PGTABLE_LEVELS == 5 */
|
|
|
|
|
|
+static inline void p4d_clear(p4d_t *p4dp)
|
|
|
+{
|
|
|
+ set_p4d(p4dp, __p4d(0));
|
|
|
+}
|
|
|
+
|
|
|
#endif /* CONFIG_PGTABLE_LEVELS == 4 */
|
|
|
|
|
|
#endif /* CONFIG_PGTABLE_LEVELS >= 3 */
|