1 /* 2 * Copyright (C) 2013 Altera Corporation 3 * Copyright (C) 2011-2012 Tobias Klauser <tklauser@distanz.ch> 4 * Copyright (C) 2004 Microtronix Datacom Ltd. 5 * 6 * This file is subject to the terms and conditions of the GNU General Public 7 * License. See the file "COPYING" in the main directory of this archive 8 * for more details. 9 */ 10 11 #include <linux/export.h> 12 #include <linux/file.h> 13 #include <linux/fs.h> 14 #include <linux/slab.h> 15 #include <linux/syscalls.h> 16 17 #include <asm/cacheflush.h> 18 #include <asm/traps.h> 19 20 /* sys_cacheflush -- flush the processor cache. */ 21 asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, 22 unsigned int op) 23 { 24 struct vm_area_struct *vma; 25 struct mm_struct *mm = current->mm; 26 27 if (len == 0) 28 return 0; 29 30 /* We only support op 0 now, return error if op is non-zero.*/ 31 if (op) 32 return -EINVAL; 33 34 /* Check for overflow */ 35 if (addr + len < addr) 36 return -EFAULT; 37 38 if (mmap_read_lock_killable(mm)) 39 return -EINTR; 40 41 /* 42 * Verify that the specified address region actually belongs 43 * to this process. 44 */ 45 vma = find_vma(mm, addr); 46 if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) { 47 mmap_read_unlock(mm); 48 return -EFAULT; 49 } 50 51 flush_cache_range(vma, addr, addr + len); 52 53 mmap_read_unlock(mm); 54 return 0; 55 } 56 57 asmlinkage int sys_getpagesize(void) 58 { 59 return PAGE_SIZE; 60 } 61