···66 bool "Xen guest support"77 select PARAVIRT88 depends on X86_3299- depends on X86_CMPXCHG && X86_TSC && !(X86_VISWS || X86_VOYAGER)99+ depends on X86_CMPXCHG && X86_TSC && X86_PAE && !(X86_VISWS || X86_VOYAGER)1010 help1111 This is the Linux Xen port. Enabling this will allow the1212 kernel to boot in a paravirtualized environment under the
+18-33
arch/x86/xen/enlighten.c
···785785static __init void xen_pagetable_setup_start(pgd_t *base)786786{787787 pgd_t *xen_pgd = (pgd_t *)xen_start_info->pt_base;788788+ int i;788789789790 /* special set_pte for pagetable initialization */790791 pv_mmu_ops.set_pte = xen_set_pte_init;791792792793 init_mm.pgd = base;793794 /*794794- * copy top-level of Xen-supplied pagetable into place. For795795- * !PAE we can use this as-is, but for PAE it is a stand-in796796- * while we copy the pmd pages.795795+ * copy top-level of Xen-supplied pagetable into place. This796796+ * is a stand-in while we copy the pmd pages.797797 */798798 memcpy(base, xen_pgd, PTRS_PER_PGD * sizeof(pgd_t));799799800800- if (PTRS_PER_PMD > 1) {801801- int i;802802- /*803803- * For PAE, need to allocate new pmds, rather than804804- * share Xen's, since Xen doesn't like pmd's being805805- * shared between address spaces.806806- */807807- for (i = 0; i < PTRS_PER_PGD; i++) {808808- if (pgd_val_ma(xen_pgd[i]) & _PAGE_PRESENT) {809809- pmd_t *pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE);800800+ /*801801+ * For PAE, need to allocate new pmds, rather than802802+ * share Xen's, since Xen doesn't like pmd's being803803+ * shared between address spaces.804804+ */805805+ for (i = 0; i < PTRS_PER_PGD; i++) {806806+ if (pgd_val_ma(xen_pgd[i]) & _PAGE_PRESENT) {807807+ pmd_t *pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE);810808811811- memcpy(pmd, (void *)pgd_page_vaddr(xen_pgd[i]),812812- PAGE_SIZE);809809+ memcpy(pmd, (void *)pgd_page_vaddr(xen_pgd[i]),810810+ PAGE_SIZE);813811814814- make_lowmem_page_readonly(pmd);812812+ make_lowmem_page_readonly(pmd);815813816816- set_pgd(&base[i], __pgd(1 + __pa(pmd)));817817- } else818818- pgd_clear(&base[i]);819819- }814814+ set_pgd(&base[i], __pgd(1 + __pa(pmd)));815815+ } else816816+ pgd_clear(&base[i]);820817 }821818822819 /* make sure zero_page is mapped RO so we can use it in pagetables */···870873871874 /* Actually pin the pagetable down, but we can't set PG_pinned872875 yet because the page structures don't exist yet. */873873- {874874- unsigned level;875875-876876-#ifdef CONFIG_X86_PAE877877- level = MMUEXT_PIN_L3_TABLE;878878-#else879879- level = MMUEXT_PIN_L2_TABLE;880880-#endif881881-882882- pin_pagetable_pfn(level, PFN_DOWN(__pa(base)));883883- }876876+ pin_pagetable_pfn(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(base)));884877}885878886879/* This is called once we have the cpu_possible_map */···10801093 .make_pte = xen_make_pte,10811094 .make_pgd = xen_make_pgd,1082109510831083-#ifdef CONFIG_X86_PAE10841096 .set_pte_atomic = xen_set_pte_atomic,10851097 .set_pte_present = xen_set_pte_at,10861098 .set_pud = xen_set_pud,···1088110210891103 .make_pmd = xen_make_pmd,10901104 .pmd_val = xen_pmd_val,10911091-#endif /* PAE */1092110510931106 .activate_mm = xen_activate_mm,10941107 .dup_mmap = xen_dup_mmap,
+2-17
arch/x86/xen/mmu.c
···228228{229229 return pte_mfn_to_pfn(pmd.pmd);230230}231231-#ifdef CONFIG_X86_PAE231231+232232void xen_set_pud(pud_t *ptr, pud_t val)233233{234234 struct multicall_space mcs;···276276 pmd = pte_pfn_to_mfn(pmd);277277 return native_make_pmd(pmd);278278}279279-#else /* !PAE */280280-void xen_set_pte(pte_t *ptep, pte_t pte)281281-{282282- *ptep = pte;283283-}284284-#endif /* CONFIG_X86_PAE */285279286280/*287281 (Yet another) pagetable walker. This one is intended for pinning a···428434 read-only, and can be pinned. */429435void xen_pgd_pin(pgd_t *pgd)430436{431431- unsigned level;432432-433437 xen_mc_batch();434438435439 if (pgd_walk(pgd, pin_page, TASK_SIZE)) {···437445 xen_mc_batch();438446 }439447440440-#ifdef CONFIG_X86_PAE441441- level = MMUEXT_PIN_L3_TABLE;442442-#else443443- level = MMUEXT_PIN_L2_TABLE;444444-#endif445445-446446- xen_do_pin(level, PFN_DOWN(__pa(pgd)));447447-448448+ xen_do_pin(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(pgd)));448449 xen_mc_issue(0);449450}450451
+6-18
arch/x86/xen/mmu.h
···3737void xen_pgd_pin(pgd_t *pgd);3838//void xen_pgd_unpin(pgd_t *pgd);39394040-#ifdef CONFIG_X86_PAE4141-unsigned long long xen_pte_val(pte_t);4242-unsigned long long xen_pmd_val(pmd_t);4343-unsigned long long xen_pgd_val(pgd_t);4040+pteval_t xen_pte_val(pte_t);4141+pmdval_t xen_pmd_val(pmd_t);4242+pgdval_t xen_pgd_val(pgd_t);44434545-pte_t xen_make_pte(unsigned long long);4646-pmd_t xen_make_pmd(unsigned long long);4747-pgd_t xen_make_pgd(unsigned long long);4444+pte_t xen_make_pte(pteval_t);4545+pmd_t xen_make_pmd(pmdval_t);4646+pgd_t xen_make_pgd(pgdval_t);48474948void xen_set_pte_at(struct mm_struct *mm, unsigned long addr,5049 pte_t *ptep, pte_t pteval);···5152void xen_set_pud(pud_t *ptr, pud_t val);5253void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep);5354void xen_pmd_clear(pmd_t *pmdp);5454-5555-5656-#else5757-unsigned long xen_pte_val(pte_t);5858-unsigned long xen_pmd_val(pmd_t);5959-unsigned long xen_pgd_val(pgd_t);6060-6161-pte_t xen_make_pte(unsigned long);6262-pmd_t xen_make_pmd(unsigned long);6363-pgd_t xen_make_pgd(unsigned long);6464-#endif65556656#endif /* _XEN_MMU_H */