diff options
| -rw-r--r-- | arch/x86/include/asm/fixmap.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/fixmap_32.h | 4 | ||||
| -rw-r--r-- | arch/x86/include/asm/highmem.h | 5 | ||||
| -rw-r--r-- | arch/x86/mm/Makefile | 2 | ||||
| -rw-r--r-- | arch/x86/mm/init_32.c | 3 | ||||
| -rw-r--r-- | arch/x86/mm/iomap_32.c | 59 | ||||
| -rw-r--r-- | include/asm-x86/iomap.h | 30 |
7 files changed, 96 insertions, 11 deletions
diff --git a/arch/x86/include/asm/fixmap.h b/arch/x86/include/asm/fixmap.h index 8668a94f850e..23696d44a0af 100644 --- a/arch/x86/include/asm/fixmap.h +++ b/arch/x86/include/asm/fixmap.h | |||
| @@ -9,6 +9,10 @@ | |||
| 9 | 9 | ||
| 10 | extern int fixmaps_set; | 10 | extern int fixmaps_set; |
| 11 | 11 | ||
| 12 | extern pte_t *kmap_pte; | ||
| 13 | extern pgprot_t kmap_prot; | ||
| 14 | extern pte_t *pkmap_page_table; | ||
| 15 | |||
| 12 | void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); | 16 | void __native_set_fixmap(enum fixed_addresses idx, pte_t pte); |
| 13 | void native_set_fixmap(enum fixed_addresses idx, | 17 | void native_set_fixmap(enum fixed_addresses idx, |
| 14 | unsigned long phys, pgprot_t flags); | 18 | unsigned long phys, pgprot_t flags); |
diff --git a/arch/x86/include/asm/fixmap_32.h b/arch/x86/include/asm/fixmap_32.h index 09f29ab5c139..c7115c1d7217 100644 --- a/arch/x86/include/asm/fixmap_32.h +++ b/arch/x86/include/asm/fixmap_32.h | |||
| @@ -28,10 +28,8 @@ extern unsigned long __FIXADDR_TOP; | |||
| 28 | #include <asm/acpi.h> | 28 | #include <asm/acpi.h> |
| 29 | #include <asm/apicdef.h> | 29 | #include <asm/apicdef.h> |
| 30 | #include <asm/page.h> | 30 | #include <asm/page.h> |
| 31 | #ifdef CONFIG_HIGHMEM | ||
| 32 | #include <linux/threads.h> | 31 | #include <linux/threads.h> |
| 33 | #include <asm/kmap_types.h> | 32 | #include <asm/kmap_types.h> |
| 34 | #endif | ||
| 35 | 33 | ||
| 36 | /* | 34 | /* |
| 37 | * Here we define all the compile-time 'special' virtual | 35 | * Here we define all the compile-time 'special' virtual |
| @@ -75,10 +73,8 @@ enum fixed_addresses { | |||
| 75 | #ifdef CONFIG_X86_CYCLONE_TIMER | 73 | #ifdef CONFIG_X86_CYCLONE_TIMER |
| 76 | FIX_CYCLONE_TIMER, /*cyclone timer register*/ | 74 | FIX_CYCLONE_TIMER, /*cyclone timer register*/ |
| 77 | #endif | 75 | #endif |
| 78 | #ifdef CONFIG_HIGHMEM | ||
| 79 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ | 76 | FIX_KMAP_BEGIN, /* reserved pte's for temporary kernel mappings */ |
| 80 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, | 77 | FIX_KMAP_END = FIX_KMAP_BEGIN+(KM_TYPE_NR*NR_CPUS)-1, |
| 81 | #endif | ||
| 82 | #ifdef CONFIG_PCI_MMCONFIG | 78 | #ifdef CONFIG_PCI_MMCONFIG |
| 83 | FIX_PCIE_MCFG, | 79 | FIX_PCIE_MCFG, |
| 84 | #endif | 80 | #endif |
diff --git a/arch/x86/include/asm/highmem.h b/arch/x86/include/asm/highmem.h index a3b3b7c3027b..bf9276bea660 100644 --- a/arch/x86/include/asm/highmem.h +++ b/arch/x86/include/asm/highmem.h | |||
| @@ -25,14 +25,11 @@ | |||
| 25 | #include <asm/kmap_types.h> | 25 | #include <asm/kmap_types.h> |
| 26 | #include <asm/tlbflush.h> | 26 | #include <asm/tlbflush.h> |
| 27 | #include <asm/paravirt.h> | 27 | #include <asm/paravirt.h> |
| 28 | #include <asm/fixmap.h> | ||
| 28 | 29 | ||
| 29 | /* declarations for highmem.c */ | 30 | /* declarations for highmem.c */ |
| 30 | extern unsigned long highstart_pfn, highend_pfn; | 31 | extern unsigned long highstart_pfn, highend_pfn; |
| 31 | 32 | ||
| 32 | extern pte_t *kmap_pte; | ||
| 33 | extern pgprot_t kmap_prot; | ||
| 34 | extern pte_t *pkmap_page_table; | ||
| 35 | |||
| 36 | /* | 33 | /* |
| 37 | * Right now we initialize only a single pte table. It can be extended | 34 | * Right now we initialize only a single pte table. It can be extended |
| 38 | * easily, subsequent pte tables have to be allocated in one physical | 35 | * easily, subsequent pte tables have to be allocated in one physical |
diff --git a/arch/x86/mm/Makefile b/arch/x86/mm/Makefile index 59f89b434b45..fea4565ff576 100644 --- a/arch/x86/mm/Makefile +++ b/arch/x86/mm/Makefile | |||
| @@ -1,7 +1,7 @@ | |||
| 1 | obj-y := init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ | 1 | obj-y := init_$(BITS).o fault.o ioremap.o extable.o pageattr.o mmap.o \ |
| 2 | pat.o pgtable.o gup.o | 2 | pat.o pgtable.o gup.o |
| 3 | 3 | ||
| 4 | obj-$(CONFIG_X86_32) += pgtable_32.o | 4 | obj-$(CONFIG_X86_32) += pgtable_32.o iomap_32.o |
| 5 | 5 | ||
| 6 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o | 6 | obj-$(CONFIG_HUGETLB_PAGE) += hugetlbpage.o |
| 7 | obj-$(CONFIG_X86_PTDUMP) += dump_pagetables.o | 7 | obj-$(CONFIG_X86_PTDUMP) += dump_pagetables.o |
diff --git a/arch/x86/mm/init_32.c b/arch/x86/mm/init_32.c index 8396868e82c5..c483f4242079 100644 --- a/arch/x86/mm/init_32.c +++ b/arch/x86/mm/init_32.c | |||
| @@ -334,7 +334,6 @@ int devmem_is_allowed(unsigned long pagenr) | |||
| 334 | return 0; | 334 | return 0; |
| 335 | } | 335 | } |
| 336 | 336 | ||
| 337 | #ifdef CONFIG_HIGHMEM | ||
| 338 | pte_t *kmap_pte; | 337 | pte_t *kmap_pte; |
| 339 | pgprot_t kmap_prot; | 338 | pgprot_t kmap_prot; |
| 340 | 339 | ||
| @@ -357,6 +356,7 @@ static void __init kmap_init(void) | |||
| 357 | kmap_prot = PAGE_KERNEL; | 356 | kmap_prot = PAGE_KERNEL; |
| 358 | } | 357 | } |
| 359 | 358 | ||
| 359 | #ifdef CONFIG_HIGHMEM | ||
| 360 | static void __init permanent_kmaps_init(pgd_t *pgd_base) | 360 | static void __init permanent_kmaps_init(pgd_t *pgd_base) |
| 361 | { | 361 | { |
| 362 | unsigned long vaddr; | 362 | unsigned long vaddr; |
| @@ -436,7 +436,6 @@ static void __init set_highmem_pages_init(void) | |||
| 436 | #endif /* !CONFIG_NUMA */ | 436 | #endif /* !CONFIG_NUMA */ |
| 437 | 437 | ||
| 438 | #else | 438 | #else |
| 439 | # define kmap_init() do { } while (0) | ||
| 440 | # define permanent_kmaps_init(pgd_base) do { } while (0) | 439 | # define permanent_kmaps_init(pgd_base) do { } while (0) |
| 441 | # define set_highmem_pages_init() do { } while (0) | 440 | # define set_highmem_pages_init() do { } while (0) |
| 442 | #endif /* CONFIG_HIGHMEM */ | 441 | #endif /* CONFIG_HIGHMEM */ |
diff --git a/arch/x86/mm/iomap_32.c b/arch/x86/mm/iomap_32.c new file mode 100644 index 000000000000..d0151d8ce452 --- /dev/null +++ b/arch/x86/mm/iomap_32.c | |||
| @@ -0,0 +1,59 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2008 Ingo Molnar | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, but | ||
| 10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 12 | * General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <asm/iomap.h> | ||
| 20 | #include <linux/module.h> | ||
| 21 | |||
| 22 | /* Map 'pfn' using fixed map 'type' and protections 'prot' | ||
| 23 | */ | ||
| 24 | void * | ||
| 25 | iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot) | ||
| 26 | { | ||
| 27 | enum fixed_addresses idx; | ||
| 28 | unsigned long vaddr; | ||
| 29 | |||
| 30 | pagefault_disable(); | ||
| 31 | |||
| 32 | idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 33 | vaddr = __fix_to_virt(FIX_KMAP_BEGIN + idx); | ||
| 34 | set_pte(kmap_pte-idx, pfn_pte(pfn, prot)); | ||
| 35 | arch_flush_lazy_mmu_mode(); | ||
| 36 | |||
| 37 | return (void*) vaddr; | ||
| 38 | } | ||
| 39 | EXPORT_SYMBOL_GPL(iomap_atomic_prot_pfn); | ||
| 40 | |||
| 41 | void | ||
| 42 | iounmap_atomic(void *kvaddr, enum km_type type) | ||
| 43 | { | ||
| 44 | unsigned long vaddr = (unsigned long) kvaddr & PAGE_MASK; | ||
| 45 | enum fixed_addresses idx = type + KM_TYPE_NR*smp_processor_id(); | ||
| 46 | |||
| 47 | /* | ||
| 48 | * Force other mappings to Oops if they'll try to access this pte | ||
| 49 | * without first remap it. Keeping stale mappings around is a bad idea | ||
| 50 | * also, in case the page changes cacheability attributes or becomes | ||
| 51 | * a protected page in a hypervisor. | ||
| 52 | */ | ||
| 53 | if (vaddr == __fix_to_virt(FIX_KMAP_BEGIN+idx)) | ||
| 54 | kpte_clear_flush(kmap_pte-idx, vaddr); | ||
| 55 | |||
| 56 | arch_flush_lazy_mmu_mode(); | ||
| 57 | pagefault_enable(); | ||
| 58 | } | ||
| 59 | EXPORT_SYMBOL_GPL(iounmap_atomic); | ||
diff --git a/include/asm-x86/iomap.h b/include/asm-x86/iomap.h new file mode 100644 index 000000000000..c1f06289b14b --- /dev/null +++ b/include/asm-x86/iomap.h | |||
| @@ -0,0 +1,30 @@ | |||
| 1 | /* | ||
| 2 | * Copyright © 2008 Ingo Molnar | ||
| 3 | * | ||
| 4 | * This program is free software; you can redistribute it and/or modify | ||
| 5 | * it under the terms of the GNU General Public License as published by | ||
| 6 | * the Free Software Foundation; either version 2 of the License, or | ||
| 7 | * (at your option) any later version. | ||
| 8 | * | ||
| 9 | * This program is distributed in the hope that it will be useful, but | ||
| 10 | * WITHOUT ANY WARRANTY; without even the implied warranty of | ||
| 11 | * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU | ||
| 12 | * General Public License for more details. | ||
| 13 | * | ||
| 14 | * You should have received a copy of the GNU General Public License along | ||
| 15 | * with this program; if not, write to the Free Software Foundation, Inc., | ||
| 16 | * 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA. | ||
| 17 | */ | ||
| 18 | |||
| 19 | #include <linux/fs.h> | ||
| 20 | #include <linux/mm.h> | ||
| 21 | #include <linux/uaccess.h> | ||
| 22 | #include <asm/cacheflush.h> | ||
| 23 | #include <asm/pgtable.h> | ||
| 24 | #include <asm/tlbflush.h> | ||
| 25 | |||
| 26 | void * | ||
| 27 | iomap_atomic_prot_pfn(unsigned long pfn, enum km_type type, pgprot_t prot); | ||
| 28 | |||
| 29 | void | ||
| 30 | iounmap_atomic(void *kvaddr, enum km_type type); | ||
