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