linux/arch/nios2/kernel/sys_nios2.c
<<
>>
Prefs
   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. */
  21asmlinkage 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
  57asmlinkage int sys_getpagesize(void)
  58{
  59        return PAGE_SIZE;
  60}
  61