diff options
| -rw-r--r-- | arch/x86/xen/Kconfig | 2 | ||||
| -rw-r--r-- | arch/x86/xen/enlighten.c | 51 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.c | 19 | ||||
| -rw-r--r-- | arch/x86/xen/mmu.h | 24 | ||||
| -rw-r--r-- | arch/x86/xen/xen-head.S | 4 | ||||
| -rw-r--r-- | include/asm-x86/xen/page.h | 4 |
6 files changed, 27 insertions, 77 deletions
diff --git a/arch/x86/xen/Kconfig b/arch/x86/xen/Kconfig index 2e641be2737e..525b108411bd 100644 --- a/arch/x86/xen/Kconfig +++ b/arch/x86/xen/Kconfig | |||
| @@ -6,7 +6,7 @@ config XEN | |||
| 6 | bool "Xen guest support" | 6 | bool "Xen guest support" |
| 7 | select PARAVIRT | 7 | select PARAVIRT |
| 8 | depends on X86_32 | 8 | depends on X86_32 |
| 9 | depends on X86_CMPXCHG && X86_TSC && !(X86_VISWS || X86_VOYAGER) | 9 | depends on X86_CMPXCHG && X86_TSC && X86_PAE && !(X86_VISWS || X86_VOYAGER) |
| 10 | help | 10 | help |
| 11 | This is the Linux Xen port. Enabling this will allow the | 11 | This is the Linux Xen port. Enabling this will allow the |
| 12 | kernel to boot in a paravirtualized environment under the | 12 | kernel to boot in a paravirtualized environment under the |
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index c048de34d6a1..f09c1c69c37a 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
| @@ -785,38 +785,35 @@ static __init void xen_set_pte_init(pte_t *ptep, pte_t pte) | |||
| 785 | static __init void xen_pagetable_setup_start(pgd_t *base) | 785 | static __init void xen_pagetable_setup_start(pgd_t *base) |
| 786 | { | 786 | { |
| 787 | pgd_t *xen_pgd = (pgd_t *)xen_start_info->pt_base; | 787 | pgd_t *xen_pgd = (pgd_t *)xen_start_info->pt_base; |
| 788 | int i; | ||
| 788 | 789 | ||
| 789 | /* special set_pte for pagetable initialization */ | 790 | /* special set_pte for pagetable initialization */ |
| 790 | pv_mmu_ops.set_pte = xen_set_pte_init; | 791 | pv_mmu_ops.set_pte = xen_set_pte_init; |
| 791 | 792 | ||
| 792 | init_mm.pgd = base; | 793 | init_mm.pgd = base; |
| 793 | /* | 794 | /* |
| 794 | * copy top-level of Xen-supplied pagetable into place. For | 795 | * copy top-level of Xen-supplied pagetable into place. This |
| 795 | * !PAE we can use this as-is, but for PAE it is a stand-in | 796 | * is a stand-in while we copy the pmd pages. |
| 796 | * while we copy the pmd pages. | ||
| 797 | */ | 797 | */ |
| 798 | memcpy(base, xen_pgd, PTRS_PER_PGD * sizeof(pgd_t)); | 798 | memcpy(base, xen_pgd, PTRS_PER_PGD * sizeof(pgd_t)); |
| 799 | 799 | ||
| 800 | if (PTRS_PER_PMD > 1) { | 800 | /* |
| 801 | int i; | 801 | * For PAE, need to allocate new pmds, rather than |
| 802 | /* | 802 | * share Xen's, since Xen doesn't like pmd's being |
| 803 | * For PAE, need to allocate new pmds, rather than | 803 | * shared between address spaces. |
| 804 | * share Xen's, since Xen doesn't like pmd's being | 804 | */ |
| 805 | * shared between address spaces. | 805 | for (i = 0; i < PTRS_PER_PGD; i++) { |
| 806 | */ | 806 | if (pgd_val_ma(xen_pgd[i]) & _PAGE_PRESENT) { |
| 807 | for (i = 0; i < PTRS_PER_PGD; i++) { | 807 | pmd_t *pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE); |
| 808 | if (pgd_val_ma(xen_pgd[i]) & _PAGE_PRESENT) { | ||
| 809 | pmd_t *pmd = (pmd_t *)alloc_bootmem_low_pages(PAGE_SIZE); | ||
| 810 | 808 | ||
| 811 | memcpy(pmd, (void *)pgd_page_vaddr(xen_pgd[i]), | 809 | memcpy(pmd, (void *)pgd_page_vaddr(xen_pgd[i]), |
| 812 | PAGE_SIZE); | 810 | PAGE_SIZE); |
| 813 | 811 | ||
| 814 | make_lowmem_page_readonly(pmd); | 812 | make_lowmem_page_readonly(pmd); |
| 815 | 813 | ||
| 816 | set_pgd(&base[i], __pgd(1 + __pa(pmd))); | 814 | set_pgd(&base[i], __pgd(1 + __pa(pmd))); |
| 817 | } else | 815 | } else |
| 818 | pgd_clear(&base[i]); | 816 | pgd_clear(&base[i]); |
| 819 | } | ||
| 820 | } | 817 | } |
| 821 | 818 | ||
| 822 | /* make sure zero_page is mapped RO so we can use it in pagetables */ | 819 | /* make sure zero_page is mapped RO so we can use it in pagetables */ |
| @@ -873,17 +870,7 @@ static __init void xen_pagetable_setup_done(pgd_t *base) | |||
| 873 | 870 | ||
| 874 | /* Actually pin the pagetable down, but we can't set PG_pinned | 871 | /* Actually pin the pagetable down, but we can't set PG_pinned |
| 875 | yet because the page structures don't exist yet. */ | 872 | yet because the page structures don't exist yet. */ |
| 876 | { | 873 | pin_pagetable_pfn(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(base))); |
| 877 | unsigned level; | ||
| 878 | |||
| 879 | #ifdef CONFIG_X86_PAE | ||
| 880 | level = MMUEXT_PIN_L3_TABLE; | ||
| 881 | #else | ||
| 882 | level = MMUEXT_PIN_L2_TABLE; | ||
| 883 | #endif | ||
| 884 | |||
| 885 | pin_pagetable_pfn(level, PFN_DOWN(__pa(base))); | ||
| 886 | } | ||
| 887 | } | 874 | } |
| 888 | 875 | ||
| 889 | /* This is called once we have the cpu_possible_map */ | 876 | /* This is called once we have the cpu_possible_map */ |
| @@ -1093,7 +1080,6 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { | |||
| 1093 | .make_pte = xen_make_pte, | 1080 | .make_pte = xen_make_pte, |
| 1094 | .make_pgd = xen_make_pgd, | 1081 | .make_pgd = xen_make_pgd, |
| 1095 | 1082 | ||
| 1096 | #ifdef CONFIG_X86_PAE | ||
| 1097 | .set_pte_atomic = xen_set_pte_atomic, | 1083 | .set_pte_atomic = xen_set_pte_atomic, |
| 1098 | .set_pte_present = xen_set_pte_at, | 1084 | .set_pte_present = xen_set_pte_at, |
| 1099 | .set_pud = xen_set_pud, | 1085 | .set_pud = xen_set_pud, |
| @@ -1102,7 +1088,6 @@ static const struct pv_mmu_ops xen_mmu_ops __initdata = { | |||
| 1102 | 1088 | ||
| 1103 | .make_pmd = xen_make_pmd, | 1089 | .make_pmd = xen_make_pmd, |
| 1104 | .pmd_val = xen_pmd_val, | 1090 | .pmd_val = xen_pmd_val, |
| 1105 | #endif /* PAE */ | ||
| 1106 | 1091 | ||
| 1107 | .activate_mm = xen_activate_mm, | 1092 | .activate_mm = xen_activate_mm, |
| 1108 | .dup_mmap = xen_dup_mmap, | 1093 | .dup_mmap = xen_dup_mmap, |
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 265601d5a6ae..df40bf74ea75 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -228,7 +228,7 @@ pmdval_t xen_pmd_val(pmd_t pmd) | |||
| 228 | { | 228 | { |
| 229 | return pte_mfn_to_pfn(pmd.pmd); | 229 | return pte_mfn_to_pfn(pmd.pmd); |
| 230 | } | 230 | } |
| 231 | #ifdef CONFIG_X86_PAE | 231 | |
| 232 | void xen_set_pud(pud_t *ptr, pud_t val) | 232 | void xen_set_pud(pud_t *ptr, pud_t val) |
| 233 | { | 233 | { |
| 234 | struct multicall_space mcs; | 234 | struct multicall_space mcs; |
| @@ -276,12 +276,6 @@ pmd_t xen_make_pmd(pmdval_t pmd) | |||
| 276 | pmd = pte_pfn_to_mfn(pmd); | 276 | pmd = pte_pfn_to_mfn(pmd); |
| 277 | return native_make_pmd(pmd); | 277 | return native_make_pmd(pmd); |
| 278 | } | 278 | } |
| 279 | #else /* !PAE */ | ||
| 280 | void xen_set_pte(pte_t *ptep, pte_t pte) | ||
| 281 | { | ||
| 282 | *ptep = pte; | ||
| 283 | } | ||
| 284 | #endif /* CONFIG_X86_PAE */ | ||
| 285 | 279 | ||
| 286 | /* | 280 | /* |
| 287 | (Yet another) pagetable walker. This one is intended for pinning a | 281 | (Yet another) pagetable walker. This one is intended for pinning a |
| @@ -434,8 +428,6 @@ static int pin_page(struct page *page, enum pt_level level) | |||
| 434 | read-only, and can be pinned. */ | 428 | read-only, and can be pinned. */ |
| 435 | void xen_pgd_pin(pgd_t *pgd) | 429 | void xen_pgd_pin(pgd_t *pgd) |
| 436 | { | 430 | { |
| 437 | unsigned level; | ||
| 438 | |||
| 439 | xen_mc_batch(); | 431 | xen_mc_batch(); |
| 440 | 432 | ||
| 441 | if (pgd_walk(pgd, pin_page, TASK_SIZE)) { | 433 | if (pgd_walk(pgd, pin_page, TASK_SIZE)) { |
| @@ -445,14 +437,7 @@ void xen_pgd_pin(pgd_t *pgd) | |||
| 445 | xen_mc_batch(); | 437 | xen_mc_batch(); |
| 446 | } | 438 | } |
| 447 | 439 | ||
| 448 | #ifdef CONFIG_X86_PAE | 440 | xen_do_pin(MMUEXT_PIN_L3_TABLE, PFN_DOWN(__pa(pgd))); |
| 449 | level = MMUEXT_PIN_L3_TABLE; | ||
| 450 | #else | ||
| 451 | level = MMUEXT_PIN_L2_TABLE; | ||
| 452 | #endif | ||
| 453 | |||
| 454 | xen_do_pin(level, PFN_DOWN(__pa(pgd))); | ||
| 455 | |||
| 456 | xen_mc_issue(0); | 441 | xen_mc_issue(0); |
| 457 | } | 442 | } |
| 458 | 443 | ||
diff --git a/arch/x86/xen/mmu.h b/arch/x86/xen/mmu.h index b5e189b1519d..5fe961caffd4 100644 --- a/arch/x86/xen/mmu.h +++ b/arch/x86/xen/mmu.h | |||
| @@ -37,14 +37,13 @@ void xen_exit_mmap(struct mm_struct *mm); | |||
| 37 | void xen_pgd_pin(pgd_t *pgd); | 37 | void xen_pgd_pin(pgd_t *pgd); |
| 38 | //void xen_pgd_unpin(pgd_t *pgd); | 38 | //void xen_pgd_unpin(pgd_t *pgd); |
| 39 | 39 | ||
| 40 | #ifdef CONFIG_X86_PAE | 40 | pteval_t xen_pte_val(pte_t); |
| 41 | unsigned long long xen_pte_val(pte_t); | 41 | pmdval_t xen_pmd_val(pmd_t); |
| 42 | unsigned long long xen_pmd_val(pmd_t); | 42 | pgdval_t xen_pgd_val(pgd_t); |
| 43 | unsigned long long xen_pgd_val(pgd_t); | ||
| 44 | 43 | ||
| 45 | pte_t xen_make_pte(unsigned long long); | 44 | pte_t xen_make_pte(pteval_t); |
| 46 | pmd_t xen_make_pmd(unsigned long long); | 45 | pmd_t xen_make_pmd(pmdval_t); |
| 47 | pgd_t xen_make_pgd(unsigned long long); | 46 | pgd_t xen_make_pgd(pgdval_t); |
| 48 | 47 | ||
| 49 | void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, | 48 | void xen_set_pte_at(struct mm_struct *mm, unsigned long addr, |
| 50 | pte_t *ptep, pte_t pteval); | 49 | pte_t *ptep, pte_t pteval); |
| @@ -53,15 +52,4 @@ void xen_set_pud(pud_t *ptr, pud_t val); | |||
| 53 | void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); | 52 | void xen_pte_clear(struct mm_struct *mm, unsigned long addr, pte_t *ptep); |
| 54 | void xen_pmd_clear(pmd_t *pmdp); | 53 | void xen_pmd_clear(pmd_t *pmdp); |
| 55 | 54 | ||
| 56 | |||
| 57 | #else | ||
| 58 | unsigned long xen_pte_val(pte_t); | ||
| 59 | unsigned long xen_pmd_val(pmd_t); | ||
| 60 | unsigned long xen_pgd_val(pgd_t); | ||
| 61 | |||
| 62 | pte_t xen_make_pte(unsigned long); | ||
| 63 | pmd_t xen_make_pmd(unsigned long); | ||
| 64 | pgd_t xen_make_pgd(unsigned long); | ||
| 65 | #endif | ||
| 66 | |||
| 67 | #endif /* _XEN_MMU_H */ | 55 | #endif /* _XEN_MMU_H */ |
diff --git a/arch/x86/xen/xen-head.S b/arch/x86/xen/xen-head.S index 3175e973fd0d..6ec3b4f7719b 100644 --- a/arch/x86/xen/xen-head.S +++ b/arch/x86/xen/xen-head.S | |||
| @@ -30,11 +30,7 @@ ENTRY(hypercall_page) | |||
| 30 | ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .long startup_xen) | 30 | ELFNOTE(Xen, XEN_ELFNOTE_ENTRY, .long startup_xen) |
| 31 | ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long hypercall_page) | 31 | ELFNOTE(Xen, XEN_ELFNOTE_HYPERCALL_PAGE, .long hypercall_page) |
| 32 | ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz "!writable_page_tables|pae_pgdir_above_4gb") | 32 | ELFNOTE(Xen, XEN_ELFNOTE_FEATURES, .asciz "!writable_page_tables|pae_pgdir_above_4gb") |
| 33 | #ifdef CONFIG_X86_PAE | ||
| 34 | ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz "yes") | 33 | ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz "yes") |
| 35 | #else | ||
| 36 | ELFNOTE(Xen, XEN_ELFNOTE_PAE_MODE, .asciz "no") | ||
| 37 | #endif | ||
| 38 | ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic") | 34 | ELFNOTE(Xen, XEN_ELFNOTE_LOADER, .asciz "generic") |
| 39 | 35 | ||
| 40 | #endif /*CONFIG_XEN */ | 36 | #endif /*CONFIG_XEN */ |
diff --git a/include/asm-x86/xen/page.h b/include/asm-x86/xen/page.h index baf3a4dce28c..e11f24038b1d 100644 --- a/include/asm-x86/xen/page.h +++ b/include/asm-x86/xen/page.h | |||
| @@ -150,13 +150,9 @@ static inline pte_t __pte_ma(pteval_t x) | |||
| 150 | return (pte_t) { .pte = x }; | 150 | return (pte_t) { .pte = x }; |
| 151 | } | 151 | } |
| 152 | 152 | ||
| 153 | #ifdef CONFIG_X86_PAE | ||
| 154 | #define pmd_val_ma(v) ((v).pmd) | 153 | #define pmd_val_ma(v) ((v).pmd) |
| 155 | #define pud_val_ma(v) ((v).pgd.pgd) | 154 | #define pud_val_ma(v) ((v).pgd.pgd) |
| 156 | #define __pmd_ma(x) ((pmd_t) { (x) } ) | 155 | #define __pmd_ma(x) ((pmd_t) { (x) } ) |
| 157 | #else /* !X86_PAE */ | ||
| 158 | #define pmd_val_ma(v) ((v).pud.pgd.pgd) | ||
| 159 | #endif /* CONFIG_X86_PAE */ | ||
| 160 | 156 | ||
| 161 | #define pgd_val_ma(x) ((x).pgd) | 157 | #define pgd_val_ma(x) ((x).pgd) |
| 162 | 158 | ||
