xref: /openbmc/linux/arch/nios2/kernel/sys_nios2.c (revision d0034a7a4ac7fae708146ac0059b9c47a1543f0d)
11000197dSLey Foon Tan /*
21000197dSLey Foon Tan  * Copyright (C) 2013 Altera Corporation
31000197dSLey Foon Tan  * Copyright (C) 2011-2012 Tobias Klauser <tklauser@distanz.ch>
41000197dSLey Foon Tan  * Copyright (C) 2004 Microtronix Datacom Ltd.
51000197dSLey Foon Tan  *
61000197dSLey Foon Tan  * This file is subject to the terms and conditions of the GNU General Public
71000197dSLey Foon Tan  * License.  See the file "COPYING" in the main directory of this archive
81000197dSLey Foon Tan  * for more details.
91000197dSLey Foon Tan  */
101000197dSLey Foon Tan 
111000197dSLey Foon Tan #include <linux/export.h>
121000197dSLey Foon Tan #include <linux/file.h>
131000197dSLey Foon Tan #include <linux/fs.h>
141000197dSLey Foon Tan #include <linux/slab.h>
151000197dSLey Foon Tan #include <linux/syscalls.h>
161000197dSLey Foon Tan 
171000197dSLey Foon Tan #include <asm/cacheflush.h>
181000197dSLey Foon Tan #include <asm/traps.h>
191000197dSLey Foon Tan 
201000197dSLey Foon Tan /* sys_cacheflush -- flush the processor cache. */
sys_cacheflush(unsigned long addr,unsigned long len,unsigned int op)211000197dSLey Foon Tan asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len,
221000197dSLey Foon Tan 				unsigned int op)
231000197dSLey Foon Tan {
241000197dSLey Foon Tan 	struct vm_area_struct *vma;
25*c26958cbSJann Horn 	struct mm_struct *mm = current->mm;
261000197dSLey Foon Tan 
271000197dSLey Foon Tan 	if (len == 0)
281000197dSLey Foon Tan 		return 0;
291000197dSLey Foon Tan 
301000197dSLey Foon Tan 	/* We only support op 0 now, return error if op is non-zero.*/
311000197dSLey Foon Tan 	if (op)
321000197dSLey Foon Tan 		return -EINVAL;
331000197dSLey Foon Tan 
341000197dSLey Foon Tan 	/* Check for overflow */
351000197dSLey Foon Tan 	if (addr + len < addr)
361000197dSLey Foon Tan 		return -EFAULT;
371000197dSLey Foon Tan 
38*c26958cbSJann Horn 	if (mmap_read_lock_killable(mm))
39*c26958cbSJann Horn 		return -EINTR;
40*c26958cbSJann Horn 
411000197dSLey Foon Tan 	/*
421000197dSLey Foon Tan 	 * Verify that the specified address region actually belongs
431000197dSLey Foon Tan 	 * to this process.
441000197dSLey Foon Tan 	 */
45*c26958cbSJann Horn 	vma = find_vma(mm, addr);
46*c26958cbSJann Horn 	if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) {
47*c26958cbSJann Horn 		mmap_read_unlock(mm);
481000197dSLey Foon Tan 		return -EFAULT;
49*c26958cbSJann Horn 	}
501000197dSLey Foon Tan 
511000197dSLey Foon Tan 	flush_cache_range(vma, addr, addr + len);
521000197dSLey Foon Tan 
53*c26958cbSJann Horn 	mmap_read_unlock(mm);
541000197dSLey Foon Tan 	return 0;
551000197dSLey Foon Tan }
561000197dSLey Foon Tan 
sys_getpagesize(void)571000197dSLey Foon Tan asmlinkage int sys_getpagesize(void)
581000197dSLey Foon Tan {
591000197dSLey Foon Tan 	return PAGE_SIZE;
601000197dSLey Foon Tan }
61