diff options
| author | Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com> | 2010-09-03 09:55:16 -0400 |
|---|---|---|
| committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2010-10-22 16:25:44 -0400 |
| commit | 98511f3532eb7fce274f37d94f29790922799e15 (patch) | |
| tree | 7e44d06535592436115bca0317b14022d9da91c1 | |
| parent | f731e3ef02b4744f4d7ca2f63539b900e47db31f (diff) | |
xen: map a dummy page for local apic and ioapic in xen_set_fixmap
Signed-off-by: Jeremy Fitzhardinge <jeremy.fitzhardinge@citrix.com>
Signed-off-by: Stefano Stabellini <stefano.stabellini@eu.citrix.com>
Reviewed-by: Konrad Rzeszutek Wilk <konrad.wilk@oracle.com>
| -rw-r--r-- | arch/x86/xen/mmu.c | 23 |
1 files changed, 20 insertions, 3 deletions
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index 42086ac406af..ffc5e24a53ba 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
| @@ -1861,6 +1861,8 @@ __init pgd_t *xen_setup_kernel_pagetable(pgd_t *pgd, | |||
| 1861 | } | 1861 | } |
| 1862 | #endif /* CONFIG_X86_64 */ | 1862 | #endif /* CONFIG_X86_64 */ |
| 1863 | 1863 | ||
| 1864 | static unsigned char dummy_mapping[PAGE_SIZE] __page_aligned_bss; | ||
| 1865 | |||
| 1864 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | 1866 | static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) |
| 1865 | { | 1867 | { |
| 1866 | pte_t pte; | 1868 | pte_t pte; |
| @@ -1881,15 +1883,28 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
| 1881 | #else | 1883 | #else |
| 1882 | case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE: | 1884 | case VSYSCALL_LAST_PAGE ... VSYSCALL_FIRST_PAGE: |
| 1883 | #endif | 1885 | #endif |
| 1884 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 1885 | case FIX_APIC_BASE: /* maps dummy local APIC */ | ||
| 1886 | #endif | ||
| 1887 | case FIX_TEXT_POKE0: | 1886 | case FIX_TEXT_POKE0: |
| 1888 | case FIX_TEXT_POKE1: | 1887 | case FIX_TEXT_POKE1: |
| 1889 | /* All local page mappings */ | 1888 | /* All local page mappings */ |
| 1890 | pte = pfn_pte(phys, prot); | 1889 | pte = pfn_pte(phys, prot); |
| 1891 | break; | 1890 | break; |
| 1892 | 1891 | ||
| 1892 | #ifdef CONFIG_X86_LOCAL_APIC | ||
| 1893 | case FIX_APIC_BASE: /* maps dummy local APIC */ | ||
| 1894 | pte = pfn_pte(PFN_DOWN(__pa(dummy_mapping)), PAGE_KERNEL); | ||
| 1895 | break; | ||
| 1896 | #endif | ||
| 1897 | |||
| 1898 | #ifdef CONFIG_X86_IO_APIC | ||
| 1899 | case FIX_IO_APIC_BASE_0 ... FIX_IO_APIC_BASE_END: | ||
| 1900 | /* | ||
| 1901 | * We just don't map the IO APIC - all access is via | ||
| 1902 | * hypercalls. Keep the address in the pte for reference. | ||
| 1903 | */ | ||
| 1904 | pte = pfn_pte(PFN_DOWN(__pa(dummy_mapping)), PAGE_KERNEL); | ||
| 1905 | break; | ||
| 1906 | #endif | ||
| 1907 | |||
| 1893 | case FIX_PARAVIRT_BOOTMAP: | 1908 | case FIX_PARAVIRT_BOOTMAP: |
| 1894 | /* This is an MFN, but it isn't an IO mapping from the | 1909 | /* This is an MFN, but it isn't an IO mapping from the |
| 1895 | IO domain */ | 1910 | IO domain */ |
| @@ -2027,6 +2042,8 @@ void __init xen_init_mmu_ops(void) | |||
| 2027 | pv_mmu_ops = xen_mmu_ops; | 2042 | pv_mmu_ops = xen_mmu_ops; |
| 2028 | 2043 | ||
| 2029 | vmap_lazy_unmap = false; | 2044 | vmap_lazy_unmap = false; |
| 2045 | |||
| 2046 | memset(dummy_mapping, 0xff, PAGE_SIZE); | ||
| 2030 | } | 2047 | } |
| 2031 | 2048 | ||
| 2032 | /* Protected by xen_reservation_lock. */ | 2049 | /* Protected by xen_reservation_lock. */ |
