diff options
author | James Bottomley <jbottomley@parallels.com> | 2011-05-22 03:04:55 -0400 |
---|---|---|
committer | James Bottomley <jbottomley@parallels.com> | 2011-05-22 03:04:55 -0400 |
commit | 7fe2ac6882f74e8bd5b3891f63c09cb10aee9d03 (patch) | |
tree | 3358215354ae27d86411963ab33c2d8f07c5e427 /arch/parisc/kernel | |
parent | 2e7bad5f34b5beed47542490c760ed26574e38ba (diff) | |
parent | b7d45818444a31948cfc7849136013a0ea54b2fb (diff) |
Merge branch 'flushing' into for-linus
Diffstat (limited to 'arch/parisc/kernel')
-rw-r--r-- | arch/parisc/kernel/cache.c | 13 | ||||
-rw-r--r-- | arch/parisc/kernel/entry.S | 3 | ||||
-rw-r--r-- | arch/parisc/kernel/head.S | 5 | ||||
-rw-r--r-- | arch/parisc/kernel/module.c | 10 | ||||
-rw-r--r-- | arch/parisc/kernel/vmlinux.lds.S | 1 |
5 files changed, 28 insertions, 4 deletions
diff --git a/arch/parisc/kernel/cache.c b/arch/parisc/kernel/cache.c index 3f11331c2775..83335f3da5fc 100644 --- a/arch/parisc/kernel/cache.c +++ b/arch/parisc/kernel/cache.c | |||
@@ -304,10 +304,20 @@ void flush_dcache_page(struct page *page) | |||
304 | offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT; | 304 | offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT; |
305 | addr = mpnt->vm_start + offset; | 305 | addr = mpnt->vm_start + offset; |
306 | 306 | ||
307 | /* The TLB is the engine of coherence on parisc: The | ||
308 | * CPU is entitled to speculate any page with a TLB | ||
309 | * mapping, so here we kill the mapping then flush the | ||
310 | * page along a special flush only alias mapping. | ||
311 | * This guarantees that the page is no-longer in the | ||
312 | * cache for any process and nor may it be | ||
313 | * speculatively read in (until the user or kernel | ||
314 | * specifically accesses it, of course) */ | ||
315 | |||
316 | flush_tlb_page(mpnt, addr); | ||
307 | if (old_addr == 0 || (old_addr & (SHMLBA - 1)) != (addr & (SHMLBA - 1))) { | 317 | if (old_addr == 0 || (old_addr & (SHMLBA - 1)) != (addr & (SHMLBA - 1))) { |
308 | __flush_cache_page(mpnt, addr, page_to_phys(page)); | 318 | __flush_cache_page(mpnt, addr, page_to_phys(page)); |
309 | if (old_addr) | 319 | if (old_addr) |
310 | printk(KERN_ERR "INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s\n", old_addr, addr, mpnt->vm_file ? mpnt->vm_file->f_path.dentry->d_name.name : "(null)"); | 320 | printk(KERN_ERR "INEQUIVALENT ALIASES 0x%lx and 0x%lx in file %s\n", old_addr, addr, mpnt->vm_file ? (char *)mpnt->vm_file->f_path.dentry->d_name.name : "(null)"); |
311 | old_addr = addr; | 321 | old_addr = addr; |
312 | } | 322 | } |
313 | } | 323 | } |
@@ -499,6 +509,7 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long | |||
499 | { | 509 | { |
500 | BUG_ON(!vma->vm_mm->context); | 510 | BUG_ON(!vma->vm_mm->context); |
501 | 511 | ||
512 | flush_tlb_page(vma, vmaddr); | ||
502 | __flush_cache_page(vma, vmaddr, page_to_phys(pfn_to_page(pfn))); | 513 | __flush_cache_page(vma, vmaddr, page_to_phys(pfn_to_page(pfn))); |
503 | 514 | ||
504 | } | 515 | } |
diff --git a/arch/parisc/kernel/entry.S b/arch/parisc/kernel/entry.S index ead8d2a1034c..6f0594439143 100644 --- a/arch/parisc/kernel/entry.S +++ b/arch/parisc/kernel/entry.S | |||
@@ -692,6 +692,9 @@ ENTRY(fault_vector_11) | |||
692 | END(fault_vector_11) | 692 | END(fault_vector_11) |
693 | 693 | ||
694 | #endif | 694 | #endif |
695 | /* Fault vector is separately protected and *must* be on its own page */ | ||
696 | .align PAGE_SIZE | ||
697 | ENTRY(end_fault_vector) | ||
695 | 698 | ||
696 | .import handle_interruption,code | 699 | .import handle_interruption,code |
697 | .import do_cpu_irq_mask,code | 700 | .import do_cpu_irq_mask,code |
diff --git a/arch/parisc/kernel/head.S b/arch/parisc/kernel/head.S index 145c5e4caaa0..37aabd772fbb 100644 --- a/arch/parisc/kernel/head.S +++ b/arch/parisc/kernel/head.S | |||
@@ -106,8 +106,9 @@ $bss_loop: | |||
106 | #endif | 106 | #endif |
107 | 107 | ||
108 | 108 | ||
109 | /* Now initialize the PTEs themselves */ | 109 | /* Now initialize the PTEs themselves. We use RWX for |
110 | ldo 0+_PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */ | 110 | * everything ... it will get remapped correctly later */ |
111 | ldo 0+_PAGE_KERNEL_RWX(%r0),%r3 /* Hardwired 0 phys addr start */ | ||
111 | ldi (1<<(KERNEL_INITIAL_ORDER-PAGE_SHIFT)),%r11 /* PFN count */ | 112 | ldi (1<<(KERNEL_INITIAL_ORDER-PAGE_SHIFT)),%r11 /* PFN count */ |
112 | load32 PA(pg0),%r1 | 113 | load32 PA(pg0),%r1 |
113 | 114 | ||
diff --git a/arch/parisc/kernel/module.c b/arch/parisc/kernel/module.c index 6e81bb596e5b..cedbbb8b18d9 100644 --- a/arch/parisc/kernel/module.c +++ b/arch/parisc/kernel/module.c | |||
@@ -61,8 +61,10 @@ | |||
61 | #include <linux/string.h> | 61 | #include <linux/string.h> |
62 | #include <linux/kernel.h> | 62 | #include <linux/kernel.h> |
63 | #include <linux/bug.h> | 63 | #include <linux/bug.h> |
64 | #include <linux/mm.h> | ||
64 | #include <linux/slab.h> | 65 | #include <linux/slab.h> |
65 | 66 | ||
67 | #include <asm/pgtable.h> | ||
66 | #include <asm/unwind.h> | 68 | #include <asm/unwind.h> |
67 | 69 | ||
68 | #if 0 | 70 | #if 0 |
@@ -214,7 +216,13 @@ void *module_alloc(unsigned long size) | |||
214 | { | 216 | { |
215 | if (size == 0) | 217 | if (size == 0) |
216 | return NULL; | 218 | return NULL; |
217 | return vmalloc(size); | 219 | /* using RWX means less protection for modules, but it's |
220 | * easier than trying to map the text, data, init_text and | ||
221 | * init_data correctly */ | ||
222 | return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, | ||
223 | GFP_KERNEL | __GFP_HIGHMEM, | ||
224 | PAGE_KERNEL_RWX, -1, | ||
225 | __builtin_return_address(0)); | ||
218 | } | 226 | } |
219 | 227 | ||
220 | #ifndef CONFIG_64BIT | 228 | #ifndef CONFIG_64BIT |
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 8f1e4efd143e..bf6a43a322ec 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -134,6 +134,7 @@ SECTIONS | |||
134 | . = ALIGN(16384); | 134 | . = ALIGN(16384); |
135 | __init_begin = .; | 135 | __init_begin = .; |
136 | INIT_TEXT_SECTION(16384) | 136 | INIT_TEXT_SECTION(16384) |
137 | . = ALIGN(PAGE_SIZE); | ||
137 | INIT_DATA_SECTION(16) | 138 | INIT_DATA_SECTION(16) |
138 | /* we have to discard exit text and such at runtime, not link time */ | 139 | /* we have to discard exit text and such at runtime, not link time */ |
139 | .exit.text : | 140 | .exit.text : |