1 /* 2 * linux/arch/sh/kernel/sys_sh.c 3 * 4 * This file contains various random system calls that 5 * have a non-standard calling sequence on the Linux/SuperH 6 * platform. 7 * 8 * Taken from i386 version. 9 */ 10 #include <linux/errno.h> 11 #include <linux/sched.h> 12 #include <linux/mm.h> 13 #include <linux/smp.h> 14 #include <linux/sem.h> 15 #include <linux/msg.h> 16 #include <linux/shm.h> 17 #include <linux/stat.h> 18 #include <linux/syscalls.h> 19 #include <linux/mman.h> 20 #include <linux/file.h> 21 #include <linux/utsname.h> 22 #include <linux/module.h> 23 #include <linux/fs.h> 24 #include <linux/ipc.h> 25 #include <asm/syscalls.h> 26 #include <linux/uaccess.h> 27 #include <asm/unistd.h> 28 #include <asm/cacheflush.h> 29 #include <asm/cachectl.h> 30 31 asmlinkage int old_mmap(unsigned long addr, unsigned long len, 32 unsigned long prot, unsigned long flags, 33 int fd, unsigned long off) 34 { 35 if (off & ~PAGE_MASK) 36 return -EINVAL; 37 return sys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT); 38 } 39 40 asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, 41 unsigned long prot, unsigned long flags, 42 unsigned long fd, unsigned long pgoff) 43 { 44 /* 45 * The shift for mmap2 is constant, regardless of PAGE_SIZE 46 * setting. 47 */ 48 if (pgoff & ((1 << (PAGE_SHIFT - 12)) - 1)) 49 return -EINVAL; 50 51 pgoff >>= PAGE_SHIFT - 12; 52 53 return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); 54 } 55 56 /* sys_cacheflush -- flush (part of) the processor cache. */ 57 asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, int op) 58 { 59 struct vm_area_struct *vma; 60 61 if ((op <= 0) || (op > (CACHEFLUSH_D_PURGE|CACHEFLUSH_I))) 62 return -EINVAL; 63 64 /* 65 * Verify that the specified address region actually belongs 66 * to this process. 67 */ 68 if (addr + len < addr) 69 return -EFAULT; 70 71 down_read(¤t->mm->mmap_sem); 72 vma = find_vma (current->mm, addr); 73 if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) { 74 up_read(¤t->mm->mmap_sem); 75 return -EFAULT; 76 } 77 78 switch (op & CACHEFLUSH_D_PURGE) { 79 case CACHEFLUSH_D_INVAL: 80 __flush_invalidate_region((void *)addr, len); 81 break; 82 case CACHEFLUSH_D_WB: 83 __flush_wback_region((void *)addr, len); 84 break; 85 case CACHEFLUSH_D_PURGE: 86 __flush_purge_region((void *)addr, len); 87 break; 88 } 89 90 if (op & CACHEFLUSH_I) 91 flush_icache_range(addr, addr+len); 92 93 up_read(¤t->mm->mmap_sem); 94 return 0; 95 } 96