11da177e4SLinus Torvalds /* 21da177e4SLinus Torvalds * linux/arch/sh/kernel/sys_sh.c 31da177e4SLinus Torvalds * 41da177e4SLinus Torvalds * This file contains various random system calls that 51da177e4SLinus Torvalds * have a non-standard calling sequence on the Linux/SuperH 61da177e4SLinus Torvalds * platform. 71da177e4SLinus Torvalds * 81da177e4SLinus Torvalds * Taken from i386 version. 91da177e4SLinus Torvalds */ 101da177e4SLinus Torvalds #include <linux/errno.h> 111da177e4SLinus Torvalds #include <linux/sched.h> 121da177e4SLinus Torvalds #include <linux/mm.h> 131da177e4SLinus Torvalds #include <linux/smp.h> 141da177e4SLinus Torvalds #include <linux/sem.h> 151da177e4SLinus Torvalds #include <linux/msg.h> 161da177e4SLinus Torvalds #include <linux/shm.h> 171da177e4SLinus Torvalds #include <linux/stat.h> 181da177e4SLinus Torvalds #include <linux/syscalls.h> 191da177e4SLinus Torvalds #include <linux/mman.h> 201da177e4SLinus Torvalds #include <linux/file.h> 211da177e4SLinus Torvalds #include <linux/utsname.h> 22f3c25758SPaul Mundt #include <linux/module.h> 23e06c4e57SPaul Mundt #include <linux/fs.h> 24cba4fbbfSAdrian Bunk #include <linux/ipc.h> 25fa43972fSPaul Mundt #include <asm/syscalls.h> 26*7c0f6ba6SLinus Torvalds #include <linux/uaccess.h> 27fe74290dSArnd Bergmann #include <asm/unistd.h> 286d243dd3SStuart Menefy #include <asm/cacheflush.h> 296d243dd3SStuart Menefy #include <asm/cachectl.h> 301da177e4SLinus Torvalds 311da177e4SLinus Torvalds asmlinkage int old_mmap(unsigned long addr, unsigned long len, 321da177e4SLinus Torvalds unsigned long prot, unsigned long flags, 331da177e4SLinus Torvalds int fd, unsigned long off) 341da177e4SLinus Torvalds { 351da177e4SLinus Torvalds if (off & ~PAGE_MASK) 361da177e4SLinus Torvalds return -EINVAL; 37f8b72560SAl Viro return sys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT); 381da177e4SLinus Torvalds } 391da177e4SLinus Torvalds 401da177e4SLinus Torvalds asmlinkage long sys_mmap2(unsigned long addr, unsigned long len, 411da177e4SLinus Torvalds unsigned long prot, unsigned long flags, 421da177e4SLinus Torvalds unsigned long fd, unsigned long pgoff) 431da177e4SLinus Torvalds { 448c31813fSToshinobu Sugioka /* 458c31813fSToshinobu Sugioka * The shift for mmap2 is constant, regardless of PAGE_SIZE 468c31813fSToshinobu Sugioka * setting. 478c31813fSToshinobu Sugioka */ 488c31813fSToshinobu Sugioka if (pgoff & ((1 << (PAGE_SHIFT - 12)) - 1)) 498c31813fSToshinobu Sugioka return -EINVAL; 508c31813fSToshinobu Sugioka 518c31813fSToshinobu Sugioka pgoff >>= PAGE_SHIFT - 12; 528c31813fSToshinobu Sugioka 53f8b72560SAl Viro return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); 541da177e4SLinus Torvalds } 551da177e4SLinus Torvalds 566d243dd3SStuart Menefy /* sys_cacheflush -- flush (part of) the processor cache. */ 576d243dd3SStuart Menefy asmlinkage int sys_cacheflush(unsigned long addr, unsigned long len, int op) 586d243dd3SStuart Menefy { 596d243dd3SStuart Menefy struct vm_area_struct *vma; 606d243dd3SStuart Menefy 61788e6af3SGiuseppe Cavallaro if ((op <= 0) || (op > (CACHEFLUSH_D_PURGE|CACHEFLUSH_I))) 626d243dd3SStuart Menefy return -EINVAL; 636d243dd3SStuart Menefy 646d243dd3SStuart Menefy /* 656d243dd3SStuart Menefy * Verify that the specified address region actually belongs 666d243dd3SStuart Menefy * to this process. 676d243dd3SStuart Menefy */ 686d243dd3SStuart Menefy if (addr + len < addr) 696d243dd3SStuart Menefy return -EFAULT; 706d243dd3SStuart Menefy 716d243dd3SStuart Menefy down_read(¤t->mm->mmap_sem); 726d243dd3SStuart Menefy vma = find_vma (current->mm, addr); 736d243dd3SStuart Menefy if (vma == NULL || addr < vma->vm_start || addr + len > vma->vm_end) { 746d243dd3SStuart Menefy up_read(¤t->mm->mmap_sem); 756d243dd3SStuart Menefy return -EFAULT; 766d243dd3SStuart Menefy } 776d243dd3SStuart Menefy 786d243dd3SStuart Menefy switch (op & CACHEFLUSH_D_PURGE) { 796d243dd3SStuart Menefy case CACHEFLUSH_D_INVAL: 806d243dd3SStuart Menefy __flush_invalidate_region((void *)addr, len); 816d243dd3SStuart Menefy break; 826d243dd3SStuart Menefy case CACHEFLUSH_D_WB: 836d243dd3SStuart Menefy __flush_wback_region((void *)addr, len); 846d243dd3SStuart Menefy break; 856d243dd3SStuart Menefy case CACHEFLUSH_D_PURGE: 866d243dd3SStuart Menefy __flush_purge_region((void *)addr, len); 876d243dd3SStuart Menefy break; 886d243dd3SStuart Menefy } 896d243dd3SStuart Menefy 906d243dd3SStuart Menefy if (op & CACHEFLUSH_I) 91a6786fdaSGiuseppe CAVALLARO flush_icache_range(addr, addr+len); 926d243dd3SStuart Menefy 936d243dd3SStuart Menefy up_read(¤t->mm->mmap_sem); 946d243dd3SStuart Menefy return 0; 956d243dd3SStuart Menefy } 96