Commit | Line | Data |
---|---|---|
1da177e4 LT |
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 | */ | |
1da177e4 LT |
10 | #include <linux/errno.h> |
11 | #include <linux/sched.h> | |
12 | #include <linux/mm.h> | |
13 | #include <linux/smp.h> | |
1da177e4 LT |
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> | |
f3c25758 | 22 | #include <linux/module.h> |
e06c4e57 | 23 | #include <linux/fs.h> |
cba4fbbf | 24 | #include <linux/ipc.h> |
fa43972f | 25 | #include <asm/syscalls.h> |
1da177e4 | 26 | #include <asm/uaccess.h> |
fe74290d | 27 | #include <asm/unistd.h> |
6d243dd3 SM |
28 | #include <asm/cacheflush.h> |
29 | #include <asm/cachectl.h> | |
1da177e4 | 30 | |
1da177e4 LT |
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; | |
f8b72560 | 37 | return sys_mmap_pgoff(addr, len, prot, flags, fd, off>>PAGE_SHIFT); |
1da177e4 LT |
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 | { | |
8c31813f TS |
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 | ||
f8b72560 | 53 | return sys_mmap_pgoff(addr, len, prot, flags, fd, pgoff); |
1da177e4 LT |
54 | } |
55 | ||
6d243dd3 SM |
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 | ||
788e6af3 | 61 | if ((op <= 0) || (op > (CACHEFLUSH_D_PURGE|CACHEFLUSH_I))) |
6d243dd3 SM |
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) | |
a6786fda | 91 | flush_icache_range(addr, addr+len); |
6d243dd3 SM |
92 | |
93 | up_read(¤t->mm->mmap_sem); | |
94 | return 0; | |
95 | } |