Linux Kernel
3.7.1
Main Page
Related Pages
Modules
Namespaces
Data Structures
Files
File List
Globals
All
Data Structures
Namespaces
Files
Functions
Variables
Typedefs
Enumerations
Enumerator
Macros
Groups
Pages
arch
sh
kernel
sys_sh.c
Go to the documentation of this file.
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 <asm/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
(&
current
->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
(&
current
->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
(&
current
->mm->mmap_sem);
94
return
0;
95
}
Generated on Thu Jan 10 2013 13:17:58 for Linux Kernel by
1.8.2