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); |
