19702785aSThomas Gleixner #ifndef _XEN_MMU_H 29702785aSThomas Gleixner 39702785aSThomas Gleixner #include <linux/linkage.h> 49702785aSThomas Gleixner #include <asm/page.h> 59702785aSThomas Gleixner 6f6433706SMark McLoughlin enum pt_level { 7f6433706SMark McLoughlin PT_PGD, 8f6433706SMark McLoughlin PT_PUD, 9f6433706SMark McLoughlin PT_PMD, 10f6433706SMark McLoughlin PT_PTE 11f6433706SMark McLoughlin }; 12f6433706SMark McLoughlin 139702785aSThomas Gleixner /* 149702785aSThomas Gleixner * Page-directory addresses above 4GB do not fit into architectural %cr3. 159702785aSThomas Gleixner * When accessing %cr3, or equivalent field in vcpu_guest_context, guests 169702785aSThomas Gleixner * must use the following accessor macros to pack/unpack valid MFNs. 179702785aSThomas Gleixner * 189702785aSThomas Gleixner * Note that Xen is using the fact that the pagetable base is always 199702785aSThomas Gleixner * page-aligned, and putting the 12 MSB of the address into the 12 LSB 209702785aSThomas Gleixner * of cr3. 219702785aSThomas Gleixner */ 229702785aSThomas Gleixner #define xen_pfn_to_cr3(pfn) (((unsigned)(pfn) << 12) | ((unsigned)(pfn) >> 20)) 239702785aSThomas Gleixner #define xen_cr3_to_pfn(cr3) (((unsigned)(cr3) >> 12) | ((unsigned)(cr3) << 20)) 249702785aSThomas Gleixner 259702785aSThomas Gleixner 269702785aSThomas Gleixner void set_pte_mfn(unsigned long vaddr, unsigned long pfn, pgprot_t flags); 279702785aSThomas Gleixner 289702785aSThomas Gleixner 299702785aSThomas Gleixner void xen_activate_mm(struct mm_struct *prev, struct mm_struct *next); 309702785aSThomas Gleixner void xen_dup_mmap(struct mm_struct *oldmm, struct mm_struct *mm); 319702785aSThomas Gleixner void xen_exit_mmap(struct mm_struct *mm); 329702785aSThomas Gleixner 339702785aSThomas Gleixner void xen_pgd_pin(pgd_t *pgd); 349702785aSThomas Gleixner //void xen_pgd_unpin(pgd_t *pgd); 359702785aSThomas Gleixner 363843fc25SJeremy Fitzhardinge pteval_t xen_pte_val(pte_t); 373843fc25SJeremy Fitzhardinge pmdval_t xen_pmd_val(pmd_t); 383843fc25SJeremy Fitzhardinge pgdval_t xen_pgd_val(pgd_t); 399702785aSThomas Gleixner 403843fc25SJeremy Fitzhardinge pte_t xen_make_pte(pteval_t); 413843fc25SJeremy Fitzhardinge pmd_t xen_make_pmd(pmdval_t); 423843fc25SJeremy Fitzhardinge pgd_t xen_make_pgd(pgdval_t); 439702785aSThomas Gleixner 44e2426cf8SJeremy Fitzhardinge void xen_set_pte(pte_t *ptep, pte_t pteval); 459702785aSThomas Gleixner void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, 469702785aSThomas Gleixner pte_t *ptep, pte_t pteval); 479702785aSThomas Gleixner void xen_set_pte_atomic(pte_t *ptep, pte_t pte); 48e2426cf8SJeremy Fitzhardinge void xen_set_pmd(pmd_t *pmdp, pmd_t pmdval); 499702785aSThomas Gleixner void xen_set_pud(pud_t *ptr, pud_t val); 50e2426cf8SJeremy Fitzhardinge void xen_set_pmd_hyper(pmd_t *pmdp, pmd_t pmdval); 51e2426cf8SJeremy Fitzhardinge void xen_set_pud_hyper(pud_t *ptr, pud_t val); 529702785aSThomas Gleixner void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); 539702785aSThomas Gleixner void xen_pmd_clear(pmd_t *pmdp); 549702785aSThomas Gleixner 55e57778a1SJeremy Fitzhardinge pte_t xen_ptep_modify_prot_start(struct mm_struct *mm, unsigned long addr, pte_t *ptep); 56e57778a1SJeremy Fitzhardinge void xen_ptep_modify_prot_commit(struct mm_struct *mm, unsigned long addr, 57e57778a1SJeremy Fitzhardinge pte_t *ptep, pte_t pte); 58e57778a1SJeremy Fitzhardinge 599702785aSThomas Gleixner #endif /* _XEN_MMU_H */ 60