diff options
author | Juan Quintela <quintela@redhat.com> | 2010-09-02 10:45:43 -0400 |
---|---|---|
committer | Stefano Stabellini <stefano.stabellini@eu.citrix.com> | 2010-10-22 16:25:47 -0400 |
commit | 4ec5387cc36c6472a2ff2c82e9865abe8cab96c2 (patch) | |
tree | 3694b8348b60b084c42abaf590f3db47d6d97b0e | |
parent | b37a56d6f3c0595d8d65ddd5b7610d11735c4978 (diff) |
xen: add the direct mapping area for ISA bus access
add the direct mapping area for ISA bus access when running as initial
domain
Signed-off-by: Juan Quintela <quintela@redhat.com>
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/enlighten.c | 1 | ||||
-rw-r--r-- | arch/x86/xen/mmu.c | 24 | ||||
-rw-r--r-- | arch/x86/xen/setup.c | 3 |
3 files changed, 28 insertions, 0 deletions
diff --git a/arch/x86/xen/enlighten.c b/arch/x86/xen/enlighten.c index 1ccfa1bf0f89..9efb00446250 100644 --- a/arch/x86/xen/enlighten.c +++ b/arch/x86/xen/enlighten.c | |||
@@ -1186,6 +1186,7 @@ asmlinkage void __init xen_start_kernel(void) | |||
1186 | 1186 | ||
1187 | xen_raw_console_write("mapping kernel into physical memory\n"); | 1187 | xen_raw_console_write("mapping kernel into physical memory\n"); |
1188 | pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); | 1188 | pgd = xen_setup_kernel_pagetable(pgd, xen_start_info->nr_pages); |
1189 | xen_ident_map_ISA(); | ||
1189 | 1190 | ||
1190 | init_mm.pgd = pgd; | 1191 | init_mm.pgd = pgd; |
1191 | 1192 | ||
diff --git a/arch/x86/xen/mmu.c b/arch/x86/xen/mmu.c index ffc5e24a53ba..eed9c7cee4b7 100644 --- a/arch/x86/xen/mmu.c +++ b/arch/x86/xen/mmu.c | |||
@@ -1682,6 +1682,7 @@ static void *m2v(phys_addr_t maddr) | |||
1682 | return __ka(m2p(maddr)); | 1682 | return __ka(m2p(maddr)); |
1683 | } | 1683 | } |
1684 | 1684 | ||
1685 | /* Set the page permissions on an identity-mapped pages */ | ||
1685 | static void set_page_prot(void *addr, pgprot_t prot) | 1686 | static void set_page_prot(void *addr, pgprot_t prot) |
1686 | { | 1687 | { |
1687 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; | 1688 | unsigned long pfn = __pa(addr) >> PAGE_SHIFT; |
@@ -1929,6 +1930,29 @@ static void xen_set_fixmap(unsigned idx, phys_addr_t phys, pgprot_t prot) | |||
1929 | #endif | 1930 | #endif |
1930 | } | 1931 | } |
1931 | 1932 | ||
1933 | __init void xen_ident_map_ISA(void) | ||
1934 | { | ||
1935 | unsigned long pa; | ||
1936 | |||
1937 | /* | ||
1938 | * If we're dom0, then linear map the ISA machine addresses into | ||
1939 | * the kernel's address space. | ||
1940 | */ | ||
1941 | if (!xen_initial_domain()) | ||
1942 | return; | ||
1943 | |||
1944 | xen_raw_printk("Xen: setup ISA identity maps\n"); | ||
1945 | |||
1946 | for (pa = ISA_START_ADDRESS; pa < ISA_END_ADDRESS; pa += PAGE_SIZE) { | ||
1947 | pte_t pte = mfn_pte(PFN_DOWN(pa), PAGE_KERNEL_IO); | ||
1948 | |||
1949 | if (HYPERVISOR_update_va_mapping(PAGE_OFFSET + pa, pte, 0)) | ||
1950 | BUG(); | ||
1951 | } | ||
1952 | |||
1953 | xen_flush_tlb(); | ||
1954 | } | ||
1955 | |||
1932 | static __init void xen_post_allocator_init(void) | 1956 | static __init void xen_post_allocator_init(void) |
1933 | { | 1957 | { |
1934 | pv_mmu_ops.set_pte = xen_set_pte; | 1958 | pv_mmu_ops.set_pte = xen_set_pte; |
diff --git a/arch/x86/xen/setup.c b/arch/x86/xen/setup.c index c413132702f7..62ceb7864017 100644 --- a/arch/x86/xen/setup.c +++ b/arch/x86/xen/setup.c | |||
@@ -119,6 +119,9 @@ char * __init xen_memory_setup(void) | |||
119 | * Even though this is normal, usable memory under Xen, reserve | 119 | * Even though this is normal, usable memory under Xen, reserve |
120 | * ISA memory anyway because too many things think they can poke | 120 | * ISA memory anyway because too many things think they can poke |
121 | * about in there. | 121 | * about in there. |
122 | * | ||
123 | * In a dom0 kernel, this region is identity mapped with the | ||
124 | * hardware ISA area, so it really is out of bounds. | ||
122 | */ | 125 | */ |
123 | e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, | 126 | e820_add_region(ISA_START_ADDRESS, ISA_END_ADDRESS - ISA_START_ADDRESS, |
124 | E820_RESERVED); | 127 | E820_RESERVED); |