diff options
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/pacache.S | 6 | ||||
-rw-r--r-- | arch/parisc/kernel/smp.c | 5 | ||||
-rw-r--r-- | arch/parisc/kernel/sys_parisc32.c | 8 | ||||
-rw-r--r-- | arch/parisc/kernel/syscall_table.S | 6 | ||||
-rw-r--r-- | arch/parisc/kernel/vmlinux.lds.S | 4 |
9 files changed, 48 insertions, 12 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/pacache.S b/arch/parisc/kernel/pacache.S index a85823668cba..93ff3d90edd1 100644 --- a/arch/parisc/kernel/pacache.S +++ b/arch/parisc/kernel/pacache.S | |||
@@ -817,10 +817,7 @@ ENTRY(purge_kernel_dcache_page) | |||
817 | .procend | 817 | .procend |
818 | ENDPROC(purge_kernel_dcache_page) | 818 | ENDPROC(purge_kernel_dcache_page) |
819 | 819 | ||
820 | 820 | ENTRY(flush_user_dcache_range_asm) | |
821 | .export flush_user_dcache_range_asm | ||
822 | |||
823 | flush_user_dcache_range_asm: | ||
824 | .proc | 821 | .proc |
825 | .callinfo NO_CALLS | 822 | .callinfo NO_CALLS |
826 | .entry | 823 | .entry |
@@ -839,6 +836,7 @@ flush_user_dcache_range_asm: | |||
839 | .exit | 836 | .exit |
840 | 837 | ||
841 | .procend | 838 | .procend |
839 | ENDPROC(flush_user_dcache_range_asm) | ||
842 | 840 | ||
843 | ENTRY(flush_kernel_dcache_range_asm) | 841 | ENTRY(flush_kernel_dcache_range_asm) |
844 | .proc | 842 | .proc |
diff --git a/arch/parisc/kernel/smp.c b/arch/parisc/kernel/smp.c index 69d63d354ef0..828305f19cff 100644 --- a/arch/parisc/kernel/smp.c +++ b/arch/parisc/kernel/smp.c | |||
@@ -155,10 +155,7 @@ ipi_interrupt(int irq, void *dev_id) | |||
155 | 155 | ||
156 | case IPI_RESCHEDULE: | 156 | case IPI_RESCHEDULE: |
157 | smp_debug(100, KERN_DEBUG "CPU%d IPI_RESCHEDULE\n", this_cpu); | 157 | smp_debug(100, KERN_DEBUG "CPU%d IPI_RESCHEDULE\n", this_cpu); |
158 | /* | 158 | scheduler_ipi(); |
159 | * Reschedule callback. Everything to be | ||
160 | * done is done by the interrupt return path. | ||
161 | */ | ||
162 | break; | 159 | break; |
163 | 160 | ||
164 | case IPI_CALL_FUNC: | 161 | case IPI_CALL_FUNC: |
diff --git a/arch/parisc/kernel/sys_parisc32.c b/arch/parisc/kernel/sys_parisc32.c index 88a0ad14a9c9..dc9a62462323 100644 --- a/arch/parisc/kernel/sys_parisc32.c +++ b/arch/parisc/kernel/sys_parisc32.c | |||
@@ -228,3 +228,11 @@ asmlinkage long compat_sys_fallocate(int fd, int mode, u32 offhi, u32 offlo, | |||
228 | return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo, | 228 | return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo, |
229 | ((loff_t)lenhi << 32) | lenlo); | 229 | ((loff_t)lenhi << 32) | lenlo); |
230 | } | 230 | } |
231 | |||
232 | asmlinkage long compat_sys_fanotify_mark(int fan_fd, int flags, u32 mask_hi, | ||
233 | u32 mask_lo, int fd, | ||
234 | const char __user *pathname) | ||
235 | { | ||
236 | return sys_fanotify_mark(fan_fd, flags, ((u64)mask_hi << 32) | mask_lo, | ||
237 | fd, pathname); | ||
238 | } | ||
diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 4be85ee10b85..a5b02ce4d41e 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S | |||
@@ -420,6 +420,12 @@ | |||
420 | ENTRY_COMP(recvmmsg) | 420 | ENTRY_COMP(recvmmsg) |
421 | ENTRY_SAME(accept4) /* 320 */ | 421 | ENTRY_SAME(accept4) /* 320 */ |
422 | ENTRY_SAME(prlimit64) | 422 | ENTRY_SAME(prlimit64) |
423 | ENTRY_SAME(fanotify_init) | ||
424 | ENTRY_COMP(fanotify_mark) | ||
425 | ENTRY_COMP(clock_adjtime) | ||
426 | ENTRY_SAME(name_to_handle_at) /* 325 */ | ||
427 | ENTRY_COMP(open_by_handle_at) | ||
428 | ENTRY_SAME(syncfs) | ||
423 | 429 | ||
424 | /* Nothing yet */ | 430 | /* Nothing yet */ |
425 | 431 | ||
diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 8f1e4efd143e..e1a55849bfa7 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S | |||
@@ -69,6 +69,9 @@ SECTIONS | |||
69 | /* End of text section */ | 69 | /* End of text section */ |
70 | _etext = .; | 70 | _etext = .; |
71 | 71 | ||
72 | /* Start of data section */ | ||
73 | _sdata = .; | ||
74 | |||
72 | RODATA | 75 | RODATA |
73 | 76 | ||
74 | /* writeable */ | 77 | /* writeable */ |
@@ -134,6 +137,7 @@ SECTIONS | |||
134 | . = ALIGN(16384); | 137 | . = ALIGN(16384); |
135 | __init_begin = .; | 138 | __init_begin = .; |
136 | INIT_TEXT_SECTION(16384) | 139 | INIT_TEXT_SECTION(16384) |
140 | . = ALIGN(PAGE_SIZE); | ||
137 | INIT_DATA_SECTION(16) | 141 | INIT_DATA_SECTION(16) |
138 | /* we have to discard exit text and such at runtime, not link time */ | 142 | /* we have to discard exit text and such at runtime, not link time */ |
139 | .exit.text : | 143 | .exit.text : |