xref: /openbmc/linux/arch/sh/kernel/sys_sh.c (revision 7c0f6ba682b9c7632072ffbedf8d328c8f3c42ba)
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(&current->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(&current->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(&current->mm->mmap_sem);
946d243dd3SStuart Menefy 	return 0;
956d243dd3SStuart Menefy }
96