diff options
-rw-r--r-- | arch/mn10300/include/asm/pgtable.h | 3 | ||||
-rw-r--r-- | arch/mn10300/mm/init.c | 21 |
2 files changed, 24 insertions, 0 deletions
diff --git a/arch/mn10300/include/asm/pgtable.h b/arch/mn10300/include/asm/pgtable.h index cd568bf5407e..a1e894b5f65b 100644 --- a/arch/mn10300/include/asm/pgtable.h +++ b/arch/mn10300/include/asm/pgtable.h | |||
@@ -182,6 +182,9 @@ extern pte_t kernel_vmalloc_ptes[(VMALLOC_END - VMALLOC_START) / PAGE_SIZE]; | |||
182 | #define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE) | 182 | #define PAGE_KERNEL_LARGE __pgprot(__PAGE_KERNEL_LARGE) |
183 | #define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC) | 183 | #define PAGE_KERNEL_LARGE_EXEC __pgprot(__PAGE_KERNEL_LARGE_EXEC) |
184 | 184 | ||
185 | #define __PAGE_USERIO (__PAGE_KERNEL_BASE | _PAGE_PROT_WKWU | _PAGE_NX) | ||
186 | #define PAGE_USERIO __pgprot(__PAGE_USERIO) | ||
187 | |||
185 | /* | 188 | /* |
186 | * Whilst the MN10300 can do page protection for execute (given separate data | 189 | * Whilst the MN10300 can do page protection for execute (given separate data |
187 | * and insn TLBs), we are not supporting it at the moment. Write permission, | 190 | * and insn TLBs), we are not supporting it at the moment. Write permission, |
diff --git a/arch/mn10300/mm/init.c b/arch/mn10300/mm/init.c index 1daf97fd7c99..48907cc3bdb7 100644 --- a/arch/mn10300/mm/init.c +++ b/arch/mn10300/mm/init.c | |||
@@ -41,6 +41,10 @@ DEFINE_PER_CPU(struct mmu_gather, mmu_gathers); | |||
41 | 41 | ||
42 | unsigned long highstart_pfn, highend_pfn; | 42 | unsigned long highstart_pfn, highend_pfn; |
43 | 43 | ||
44 | #ifdef CONFIG_MN10300_HAS_ATOMIC_OPS_UNIT | ||
45 | static struct vm_struct user_iomap_vm; | ||
46 | #endif | ||
47 | |||
44 | /* | 48 | /* |
45 | * set up paging | 49 | * set up paging |
46 | */ | 50 | */ |
@@ -73,6 +77,23 @@ void __init paging_init(void) | |||
73 | /* pass the memory from the bootmem allocator to the main allocator */ | 77 | /* pass the memory from the bootmem allocator to the main allocator */ |
74 | free_area_init(zones_size); | 78 | free_area_init(zones_size); |
75 | 79 | ||
80 | #ifdef CONFIG_MN10300_HAS_ATOMIC_OPS_UNIT | ||
81 | /* The Atomic Operation Unit registers need to be mapped to userspace | ||
82 | * for all processes. The following uses vm_area_register_early() to | ||
83 | * reserve the first page of the vmalloc area and sets the pte for that | ||
84 | * page. | ||
85 | * | ||
86 | * glibc hardcodes this virtual mapping, so we're pretty much stuck with | ||
87 | * it from now on. | ||
88 | */ | ||
89 | user_iomap_vm.flags = VM_USERMAP; | ||
90 | user_iomap_vm.size = 1 << PAGE_SHIFT; | ||
91 | vm_area_register_early(&user_iomap_vm, PAGE_SIZE); | ||
92 | ppte = kernel_vmalloc_ptes; | ||
93 | set_pte(ppte, pfn_pte(USER_ATOMIC_OPS_PAGE_ADDR >> PAGE_SHIFT, | ||
94 | PAGE_USERIO)); | ||
95 | #endif | ||
96 | |||
76 | local_flush_tlb_all(); | 97 | local_flush_tlb_all(); |
77 | } | 98 | } |
78 | 99 | ||