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 | 7 | ||||
| -rw-r--r-- | arch/parisc/kernel/vmlinux.lds.S | 6 | 
9 files changed, 50 insertions, 13 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)  		offset = (pgoff - mpnt->vm_pgoff) << PAGE_SHIFT;  		addr = mpnt->vm_start + offset; +		/* The TLB is the engine of coherence on parisc: The +		 * CPU is entitled to speculate any page with a TLB +		 * mapping, so here we kill the mapping then flush the +		 * page along a special flush only alias mapping. +		 * This guarantees that the page is no-longer in the +		 * cache for any process and nor may it be +		 * speculatively read in (until the user or kernel +		 * specifically accesses it, of course) */ + +		flush_tlb_page(mpnt, addr);  		if (old_addr == 0 || (old_addr & (SHMLBA - 1)) != (addr & (SHMLBA - 1))) {  			__flush_cache_page(mpnt, addr, page_to_phys(page));  			if (old_addr) -				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)"); +				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)");  			old_addr = addr;  		}  	} @@ -499,6 +509,7 @@ flush_cache_page(struct vm_area_struct *vma, unsigned long vmaddr, unsigned long  {  	BUG_ON(!vma->vm_mm->context); +	flush_tlb_page(vma, vmaddr);  	__flush_cache_page(vma, vmaddr, page_to_phys(pfn_to_page(pfn)));  } 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)  END(fault_vector_11)  #endif +	/* Fault vector is separately protected and *must* be on its own page */ +	.align		PAGE_SIZE +ENTRY(end_fault_vector)  	.import		handle_interruption,code  	.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:  #endif -	/* Now initialize the PTEs themselves */ -	ldo		0+_PAGE_KERNEL(%r0),%r3 /* Hardwired 0 phys addr start */ +	/* Now initialize the PTEs themselves.  We use RWX for +	 * everything ... it will get remapped correctly later */ +	ldo		0+_PAGE_KERNEL_RWX(%r0),%r3 /* Hardwired 0 phys addr start */  	ldi		(1<<(KERNEL_INITIAL_ORDER-PAGE_SHIFT)),%r11 /* PFN count */  	load32		PA(pg0),%r1 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 @@  #include <linux/string.h>  #include <linux/kernel.h>  #include <linux/bug.h> +#include <linux/mm.h>  #include <linux/slab.h> +#include <asm/pgtable.h>  #include <asm/unwind.h>  #if 0 @@ -214,7 +216,13 @@ void *module_alloc(unsigned long size)  {  	if (size == 0)  		return NULL; -	return vmalloc(size); +	/* using RWX means less protection for modules, but it's +	 * easier than trying to map the text, data, init_text and +	 * init_data correctly */ +	return __vmalloc_node_range(size, 1, VMALLOC_START, VMALLOC_END, +				    GFP_KERNEL | __GFP_HIGHMEM, +				    PAGE_KERNEL_RWX, -1, +				    __builtin_return_address(0));  }  #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)  	.procend  ENDPROC(purge_kernel_dcache_page) - -	.export flush_user_dcache_range_asm - -flush_user_dcache_range_asm: +ENTRY(flush_user_dcache_range_asm)  	.proc  	.callinfo NO_CALLS  	.entry @@ -839,6 +836,7 @@ flush_user_dcache_range_asm:  	.exit  	.procend +ENDPROC(flush_user_dcache_range_asm)  ENTRY(flush_kernel_dcache_range_asm)  	.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)  			case IPI_RESCHEDULE:  				smp_debug(100, KERN_DEBUG "CPU%d IPI_RESCHEDULE\n", this_cpu); -				/* -				 * Reschedule callback.  Everything to be -				 * done is done by the interrupt return path. -				 */ +				scheduler_ipi();  				break;  			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,          return sys_fallocate(fd, mode, ((loff_t)offhi << 32) | offlo,                               ((loff_t)lenhi << 32) | lenlo);  } + +asmlinkage long compat_sys_fanotify_mark(int fan_fd, int flags, u32 mask_hi, +					 u32 mask_lo, int fd, +					 const char __user *pathname) +{ +	return sys_fanotify_mark(fan_fd, flags, ((u64)mask_hi << 32) | mask_lo, +				 fd, pathname); +} diff --git a/arch/parisc/kernel/syscall_table.S b/arch/parisc/kernel/syscall_table.S index 4be85ee10b85..34a4f5a2fffb 100644 --- a/arch/parisc/kernel/syscall_table.S +++ b/arch/parisc/kernel/syscall_table.S @@ -420,6 +420,13 @@  	ENTRY_COMP(recvmmsg)  	ENTRY_SAME(accept4)		/* 320 */  	ENTRY_SAME(prlimit64) +	ENTRY_SAME(fanotify_init) +	ENTRY_COMP(fanotify_mark) +	ENTRY_COMP(clock_adjtime) +	ENTRY_SAME(name_to_handle_at)	/* 325 */ +	ENTRY_COMP(open_by_handle_at) +	ENTRY_SAME(syncfs) +	ENTRY_SAME(setns)  	/* Nothing yet */ diff --git a/arch/parisc/kernel/vmlinux.lds.S b/arch/parisc/kernel/vmlinux.lds.S index 8f1e4efd143e..fa6f2b8163e0 100644 --- a/arch/parisc/kernel/vmlinux.lds.S +++ b/arch/parisc/kernel/vmlinux.lds.S @@ -69,6 +69,9 @@ SECTIONS  	/* End of text section */  	_etext = .; +	/* Start of data section */ +	_sdata = .; +  	RODATA  	/* writeable */ @@ -134,6 +137,7 @@ SECTIONS  	. = ALIGN(16384);  	__init_begin = .;  	INIT_TEXT_SECTION(16384) +	. = ALIGN(PAGE_SIZE);  	INIT_DATA_SECTION(16)  	/* we have to discard exit text and such at runtime, not link time */  	.exit.text : @@ -145,7 +149,7 @@ SECTIONS  		EXIT_DATA  	} -	PERCPU(L1_CACHE_BYTES, PAGE_SIZE) +	PERCPU_SECTION(L1_CACHE_BYTES)  	. = ALIGN(PAGE_SIZE);  	__init_end = .;  	/* freed after init ends here */ |