diff options
Diffstat (limited to 'include/asm-x86/paravirt.h')
-rw-r--r-- | include/asm-x86/paravirt.h | 43 |
1 files changed, 43 insertions, 0 deletions
diff --git a/include/asm-x86/paravirt.h b/include/asm-x86/paravirt.h index 0f13b945e240..e9ada314dfc1 100644 --- a/include/asm-x86/paravirt.h +++ b/include/asm-x86/paravirt.h | |||
@@ -238,7 +238,13 @@ struct pv_mmu_ops { | |||
238 | void (*pte_update_defer)(struct mm_struct *mm, | 238 | void (*pte_update_defer)(struct mm_struct *mm, |
239 | unsigned long addr, pte_t *ptep); | 239 | unsigned long addr, pte_t *ptep); |
240 | 240 | ||
241 | pte_t (*ptep_modify_prot_start)(struct mm_struct *mm, unsigned long addr, | ||
242 | pte_t *ptep); | ||
243 | void (*ptep_modify_prot_commit)(struct mm_struct *mm, unsigned long addr, | ||
244 | pte_t *ptep, pte_t pte); | ||
245 | |||
241 | pteval_t (*pte_val)(pte_t); | 246 | pteval_t (*pte_val)(pte_t); |
247 | pteval_t (*pte_flags)(pte_t); | ||
242 | pte_t (*make_pte)(pteval_t pte); | 248 | pte_t (*make_pte)(pteval_t pte); |
243 | 249 | ||
244 | pgdval_t (*pgd_val)(pgd_t); | 250 | pgdval_t (*pgd_val)(pgd_t); |
@@ -996,6 +1002,20 @@ static inline pteval_t pte_val(pte_t pte) | |||
996 | return ret; | 1002 | return ret; |
997 | } | 1003 | } |
998 | 1004 | ||
1005 | static inline pteval_t pte_flags(pte_t pte) | ||
1006 | { | ||
1007 | pteval_t ret; | ||
1008 | |||
1009 | if (sizeof(pteval_t) > sizeof(long)) | ||
1010 | ret = PVOP_CALL2(pteval_t, pv_mmu_ops.pte_flags, | ||
1011 | pte.pte, (u64)pte.pte >> 32); | ||
1012 | else | ||
1013 | ret = PVOP_CALL1(pteval_t, pv_mmu_ops.pte_flags, | ||
1014 | pte.pte); | ||
1015 | |||
1016 | return ret; | ||
1017 | } | ||
1018 | |||
999 | static inline pgd_t __pgd(pgdval_t val) | 1019 | static inline pgd_t __pgd(pgdval_t val) |
1000 | { | 1020 | { |
1001 | pgdval_t ret; | 1021 | pgdval_t ret; |
@@ -1024,6 +1044,29 @@ static inline pgdval_t pgd_val(pgd_t pgd) | |||
1024 | return ret; | 1044 | return ret; |
1025 | } | 1045 | } |
1026 | 1046 | ||
1047 | #define __HAVE_ARCH_PTEP_MODIFY_PROT_TRANSACTION | ||
1048 | static inline pte_t ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, | ||
1049 | pte_t *ptep) | ||
1050 | { | ||
1051 | pteval_t ret; | ||
1052 | |||
1053 | ret = PVOP_CALL3(pteval_t, pv_mmu_ops.ptep_modify_prot_start, | ||
1054 | mm, addr, ptep); | ||
1055 | |||
1056 | return (pte_t) { .pte = ret }; | ||
1057 | } | ||
1058 | |||
1059 | static inline void ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, | ||
1060 | pte_t *ptep, pte_t pte) | ||
1061 | { | ||
1062 | if (sizeof(pteval_t) > sizeof(long)) | ||
1063 | /* 5 arg words */ | ||
1064 | pv_mmu_ops.ptep_modify_prot_commit(mm, addr, ptep, pte); | ||
1065 | else | ||
1066 | PVOP_VCALL4(pv_mmu_ops.ptep_modify_prot_commit, | ||
1067 | mm, addr, ptep, pte.pte); | ||
1068 | } | ||
1069 | |||
1027 | static inline void set_pte(pte_t *ptep, pte_t pte) | 1070 | static inline void set_pte(pte_t *ptep, pte_t pte) |
1028 | { | 1071 | { |
1029 | if (sizeof(pteval_t) > sizeof(long)) | 1072 | if (sizeof(pteval_t) > sizeof(long)) |