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 Tanasmlinkage 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 Tanasmlinkage int sys_getpagesize(void) 581000197dSLey Foon Tan { 591000197dSLey Foon Tan return PAGE_SIZE; 601000197dSLey Foon Tan } 61