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 /arch/x86 | |
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>
Diffstat (limited to 'arch/x86')
-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. */ |