Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci-2.6.23
Project overview
Project overview
Details
Activity
Releases
Repository
Repository
Files
Commits
Branches
Tags
Contributors
Graph
Compare
Issues
0
Issues
0
List
Boards
Labels
Milestones
Redmine
Redmine
Merge Requests
0
Merge Requests
0
CI / CD
CI / CD
Pipelines
Jobs
Schedules
Operations
Operations
Metrics
Environments
Analytics
Analytics
CI / CD
Repository
Value Stream
Wiki
Wiki
Snippets
Snippets
Members
Members
Collapse sidebar
Close sidebar
Activity
Graph
Create a new issue
Jobs
Commits
Issue Boards
Open sidebar
linux
linux-davinci-2.6.23
Commits
24954a14
Commit
24954a14
authored
Feb 01, 2006
by
Al Viro
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
[PATCH] s390x compat __user annotations
Signed-off-by:
Al Viro
<
viro@zeniv.linux.org.uk
>
parent
290f10ae
Changes
1
Show whitespace changes
Inline
Side-by-side
Showing
1 changed file
with
42 additions
and
41 deletions
+42
-41
arch/s390/kernel/compat_linux.c
arch/s390/kernel/compat_linux.c
+42
-41
No files found.
arch/s390/kernel/compat_linux.c
View file @
24954a14
...
@@ -100,12 +100,12 @@
...
@@ -100,12 +100,12 @@
#define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid)
#define SET_STAT_UID(stat, uid) (stat).st_uid = high2lowuid(uid)
#define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid)
#define SET_STAT_GID(stat, gid) (stat).st_gid = high2lowgid(gid)
asmlinkage
long
sys32_chown16
(
const
char
*
filename
,
u16
user
,
u16
group
)
asmlinkage
long
sys32_chown16
(
const
char
__user
*
filename
,
u16
user
,
u16
group
)
{
{
return
sys_chown
(
filename
,
low2highuid
(
user
),
low2highgid
(
group
));
return
sys_chown
(
filename
,
low2highuid
(
user
),
low2highgid
(
group
));
}
}
asmlinkage
long
sys32_lchown16
(
const
char
*
filename
,
u16
user
,
u16
group
)
asmlinkage
long
sys32_lchown16
(
const
char
__user
*
filename
,
u16
user
,
u16
group
)
{
{
return
sys_lchown
(
filename
,
low2highuid
(
user
),
low2highgid
(
group
));
return
sys_lchown
(
filename
,
low2highuid
(
user
),
low2highgid
(
group
));
}
}
...
@@ -141,7 +141,7 @@ asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid)
...
@@ -141,7 +141,7 @@ asmlinkage long sys32_setresuid16(u16 ruid, u16 euid, u16 suid)
low2highuid
(
suid
));
low2highuid
(
suid
));
}
}
asmlinkage
long
sys32_getresuid16
(
u16
*
ruid
,
u16
*
euid
,
u16
*
suid
)
asmlinkage
long
sys32_getresuid16
(
u16
__user
*
ruid
,
u16
__user
*
euid
,
u16
__user
*
suid
)
{
{
int
retval
;
int
retval
;
...
@@ -158,7 +158,7 @@ asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid)
...
@@ -158,7 +158,7 @@ asmlinkage long sys32_setresgid16(u16 rgid, u16 egid, u16 sgid)
low2highgid
(
sgid
));
low2highgid
(
sgid
));
}
}
asmlinkage
long
sys32_getresgid16
(
u16
*
rgid
,
u16
*
egid
,
u16
*
sgid
)
asmlinkage
long
sys32_getresgid16
(
u16
__user
*
rgid
,
u16
__user
*
egid
,
u16
__user
*
sgid
)
{
{
int
retval
;
int
retval
;
...
@@ -179,7 +179,7 @@ asmlinkage long sys32_setfsgid16(u16 gid)
...
@@ -179,7 +179,7 @@ asmlinkage long sys32_setfsgid16(u16 gid)
return
sys_setfsgid
((
gid_t
)
gid
);
return
sys_setfsgid
((
gid_t
)
gid
);
}
}
static
int
groups16_to_user
(
u16
*
grouplist
,
struct
group_info
*
group_info
)
static
int
groups16_to_user
(
u16
__user
*
grouplist
,
struct
group_info
*
group_info
)
{
{
int
i
;
int
i
;
u16
group
;
u16
group
;
...
@@ -193,7 +193,7 @@ static int groups16_to_user(u16 *grouplist, struct group_info *group_info)
...
@@ -193,7 +193,7 @@ static int groups16_to_user(u16 *grouplist, struct group_info *group_info)
return
0
;
return
0
;
}
}
static
int
groups16_from_user
(
struct
group_info
*
group_info
,
u16
*
grouplist
)
static
int
groups16_from_user
(
struct
group_info
*
group_info
,
u16
__user
*
grouplist
)
{
{
int
i
;
int
i
;
u16
group
;
u16
group
;
...
@@ -207,7 +207,7 @@ static int groups16_from_user(struct group_info *group_info, u16 *grouplist)
...
@@ -207,7 +207,7 @@ static int groups16_from_user(struct group_info *group_info, u16 *grouplist)
return
0
;
return
0
;
}
}
asmlinkage
long
sys32_getgroups16
(
int
gidsetsize
,
u16
*
grouplist
)
asmlinkage
long
sys32_getgroups16
(
int
gidsetsize
,
u16
__user
*
grouplist
)
{
{
int
i
;
int
i
;
...
@@ -231,7 +231,7 @@ out:
...
@@ -231,7 +231,7 @@ out:
return
i
;
return
i
;
}
}
asmlinkage
long
sys32_setgroups16
(
int
gidsetsize
,
u16
*
grouplist
)
asmlinkage
long
sys32_setgroups16
(
int
gidsetsize
,
u16
__user
*
grouplist
)
{
{
struct
group_info
*
group_info
;
struct
group_info
*
group_info
;
int
retval
;
int
retval
;
...
@@ -278,14 +278,14 @@ asmlinkage long sys32_getegid16(void)
...
@@ -278,14 +278,14 @@ asmlinkage long sys32_getegid16(void)
/* 32-bit timeval and related flotsam. */
/* 32-bit timeval and related flotsam. */
static
inline
long
get_tv32
(
struct
timeval
*
o
,
struct
compat_timeval
*
i
)
static
inline
long
get_tv32
(
struct
timeval
*
o
,
struct
compat_timeval
__user
*
i
)
{
{
return
(
!
access_ok
(
VERIFY_READ
,
o
,
sizeof
(
*
o
))
||
return
(
!
access_ok
(
VERIFY_READ
,
o
,
sizeof
(
*
o
))
||
(
__get_user
(
o
->
tv_sec
,
&
i
->
tv_sec
)
||
(
__get_user
(
o
->
tv_sec
,
&
i
->
tv_sec
)
||
__get_user
(
o
->
tv_usec
,
&
i
->
tv_usec
)));
__get_user
(
o
->
tv_usec
,
&
i
->
tv_usec
)));
}
}
static
inline
long
put_tv32
(
struct
compat_timeval
*
o
,
struct
timeval
*
i
)
static
inline
long
put_tv32
(
struct
compat_timeval
__user
*
o
,
struct
timeval
*
i
)
{
{
return
(
!
access_ok
(
VERIFY_WRITE
,
o
,
sizeof
(
*
o
))
||
return
(
!
access_ok
(
VERIFY_WRITE
,
o
,
sizeof
(
*
o
))
||
(
__put_user
(
i
->
tv_sec
,
&
o
->
tv_sec
)
||
(
__put_user
(
i
->
tv_sec
,
&
o
->
tv_sec
)
||
...
@@ -341,7 +341,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
...
@@ -341,7 +341,7 @@ asmlinkage long sys32_ipc(u32 call, int first, int second, int third, u32 ptr)
return
-
ENOSYS
;
return
-
ENOSYS
;
}
}
asmlinkage
long
sys32_truncate64
(
const
char
*
path
,
unsigned
long
high
,
unsigned
long
low
)
asmlinkage
long
sys32_truncate64
(
const
char
__user
*
path
,
unsigned
long
high
,
unsigned
long
low
)
{
{
if
((
int
)
high
<
0
)
if
((
int
)
high
<
0
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -357,7 +357,7 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned
...
@@ -357,7 +357,7 @@ asmlinkage long sys32_ftruncate64(unsigned int fd, unsigned long high, unsigned
return
sys_ftruncate
(
fd
,
(
high
<<
32
)
|
low
);
return
sys_ftruncate
(
fd
,
(
high
<<
32
)
|
low
);
}
}
int
cp_compat_stat
(
struct
kstat
*
stat
,
struct
compat_stat
*
statbuf
)
int
cp_compat_stat
(
struct
kstat
*
stat
,
struct
compat_stat
__user
*
statbuf
)
{
{
int
err
;
int
err
;
...
@@ -591,7 +591,7 @@ sys32_delete_module(const char __user *name_user, unsigned int flags)
...
@@ -591,7 +591,7 @@ sys32_delete_module(const char __user *name_user, unsigned int flags)
extern
struct
timezone
sys_tz
;
extern
struct
timezone
sys_tz
;
asmlinkage
long
sys32_gettimeofday
(
struct
compat_timeval
*
tv
,
struct
timezone
*
tz
)
asmlinkage
long
sys32_gettimeofday
(
struct
compat_timeval
__user
*
tv
,
struct
timezone
__user
*
tz
)
{
{
if
(
tv
)
{
if
(
tv
)
{
struct
timeval
ktv
;
struct
timeval
ktv
;
...
@@ -606,7 +606,7 @@ asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *t
...
@@ -606,7 +606,7 @@ asmlinkage long sys32_gettimeofday(struct compat_timeval *tv, struct timezone *t
return
0
;
return
0
;
}
}
static
inline
long
get_ts32
(
struct
timespec
*
o
,
struct
compat_timeval
*
i
)
static
inline
long
get_ts32
(
struct
timespec
*
o
,
struct
compat_timeval
__user
*
i
)
{
{
long
usec
;
long
usec
;
...
@@ -620,7 +620,7 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
...
@@ -620,7 +620,7 @@ static inline long get_ts32(struct timespec *o, struct compat_timeval *i)
return
0
;
return
0
;
}
}
asmlinkage
long
sys32_settimeofday
(
struct
compat_timeval
*
tv
,
struct
timezone
*
tz
)
asmlinkage
long
sys32_settimeofday
(
struct
compat_timeval
__user
*
tv
,
struct
timezone
__user
*
tz
)
{
{
struct
timespec
kts
;
struct
timespec
kts
;
struct
timezone
ktz
;
struct
timezone
ktz
;
...
@@ -645,7 +645,7 @@ asmlinkage long sys32_pause(void)
...
@@ -645,7 +645,7 @@ asmlinkage long sys32_pause(void)
return
-
ERESTARTNOHAND
;
return
-
ERESTARTNOHAND
;
}
}
asmlinkage
long
sys32_pread64
(
unsigned
int
fd
,
char
*
ubuf
,
asmlinkage
long
sys32_pread64
(
unsigned
int
fd
,
char
__user
*
ubuf
,
size_t
count
,
u32
poshi
,
u32
poslo
)
size_t
count
,
u32
poshi
,
u32
poslo
)
{
{
if
((
compat_ssize_t
)
count
<
0
)
if
((
compat_ssize_t
)
count
<
0
)
...
@@ -653,7 +653,7 @@ asmlinkage long sys32_pread64(unsigned int fd, char *ubuf,
...
@@ -653,7 +653,7 @@ asmlinkage long sys32_pread64(unsigned int fd, char *ubuf,
return
sys_pread64
(
fd
,
ubuf
,
count
,
((
loff_t
)
AA
(
poshi
)
<<
32
)
|
AA
(
poslo
));
return
sys_pread64
(
fd
,
ubuf
,
count
,
((
loff_t
)
AA
(
poshi
)
<<
32
)
|
AA
(
poslo
));
}
}
asmlinkage
long
sys32_pwrite64
(
unsigned
int
fd
,
const
char
*
ubuf
,
asmlinkage
long
sys32_pwrite64
(
unsigned
int
fd
,
const
char
__user
*
ubuf
,
size_t
count
,
u32
poshi
,
u32
poslo
)
size_t
count
,
u32
poshi
,
u32
poslo
)
{
{
if
((
compat_ssize_t
)
count
<
0
)
if
((
compat_ssize_t
)
count
<
0
)
...
@@ -666,7 +666,7 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun
...
@@ -666,7 +666,7 @@ asmlinkage compat_ssize_t sys32_readahead(int fd, u32 offhi, u32 offlo, s32 coun
return
sys_readahead
(
fd
,
((
loff_t
)
AA
(
offhi
)
<<
32
)
|
AA
(
offlo
),
count
);
return
sys_readahead
(
fd
,
((
loff_t
)
AA
(
offhi
)
<<
32
)
|
AA
(
offlo
),
count
);
}
}
asmlinkage
long
sys32_sendfile
(
int
out_fd
,
int
in_fd
,
compat_off_t
*
offset
,
size_t
count
)
asmlinkage
long
sys32_sendfile
(
int
out_fd
,
int
in_fd
,
compat_off_t
__user
*
offset
,
size_t
count
)
{
{
mm_segment_t
old_fs
=
get_fs
();
mm_segment_t
old_fs
=
get_fs
();
int
ret
;
int
ret
;
...
@@ -686,7 +686,7 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size
...
@@ -686,7 +686,7 @@ asmlinkage long sys32_sendfile(int out_fd, int in_fd, compat_off_t *offset, size
}
}
asmlinkage
long
sys32_sendfile64
(
int
out_fd
,
int
in_fd
,
asmlinkage
long
sys32_sendfile64
(
int
out_fd
,
int
in_fd
,
compat_loff_t
*
offset
,
s32
count
)
compat_loff_t
__user
*
offset
,
s32
count
)
{
{
mm_segment_t
old_fs
=
get_fs
();
mm_segment_t
old_fs
=
get_fs
();
int
ret
;
int
ret
;
...
@@ -722,7 +722,7 @@ struct timex32 {
...
@@ -722,7 +722,7 @@ struct timex32 {
extern
int
do_adjtimex
(
struct
timex
*
);
extern
int
do_adjtimex
(
struct
timex
*
);
asmlinkage
long
sys32_adjtimex
(
struct
timex32
*
utp
)
asmlinkage
long
sys32_adjtimex
(
struct
timex32
__user
*
utp
)
{
{
struct
timex
txc
;
struct
timex
txc
;
int
ret
;
int
ret
;
...
@@ -789,12 +789,13 @@ struct __sysctl_args32 {
...
@@ -789,12 +789,13 @@ struct __sysctl_args32 {
u32
__unused
[
4
];
u32
__unused
[
4
];
};
};
asmlinkage
long
sys32_sysctl
(
struct
__sysctl_args32
*
args
)
asmlinkage
long
sys32_sysctl
(
struct
__sysctl_args32
__user
*
args
)
{
{
struct
__sysctl_args32
tmp
;
struct
__sysctl_args32
tmp
;
int
error
;
int
error
;
size_t
oldlen
,
*
oldlenp
=
NULL
;
size_t
oldlen
;
unsigned
long
addr
=
(((
long
)
&
args
->
__unused
[
0
])
+
7
)
&
~
7
;
size_t
__user
*
oldlenp
=
NULL
;
unsigned
long
addr
=
(((
unsigned
long
)
&
args
->
__unused
[
0
])
+
7
)
&
~
7
;
if
(
copy_from_user
(
&
tmp
,
args
,
sizeof
(
tmp
)))
if
(
copy_from_user
(
&
tmp
,
args
,
sizeof
(
tmp
)))
return
-
EFAULT
;
return
-
EFAULT
;
...
@@ -806,20 +807,20 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 *args)
...
@@ -806,20 +807,20 @@ asmlinkage long sys32_sysctl(struct __sysctl_args32 *args)
basically copy the whole sysctl.c here, and
basically copy the whole sysctl.c here, and
glibc's __sysctl uses rw memory for the structure
glibc's __sysctl uses rw memory for the structure
anyway. */
anyway. */
if
(
get_user
(
oldlen
,
(
u32
*
)
A
(
tmp
.
oldlenp
))
||
if
(
get_user
(
oldlen
,
(
u32
__user
*
)
compat_ptr
(
tmp
.
oldlenp
))
||
put_user
(
oldlen
,
(
size_t
*
)
addr
))
put_user
(
oldlen
,
(
size_t
__user
*
)
addr
))
return
-
EFAULT
;
return
-
EFAULT
;
oldlenp
=
(
size_t
*
)
addr
;
oldlenp
=
(
size_t
__user
*
)
addr
;
}
}
lock_kernel
();
lock_kernel
();
error
=
do_sysctl
(
(
int
*
)
A
(
tmp
.
name
),
tmp
.
nlen
,
(
void
*
)
A
(
tmp
.
oldval
),
error
=
do_sysctl
(
compat_ptr
(
tmp
.
name
),
tmp
.
nlen
,
compat_ptr
(
tmp
.
oldval
),
oldlenp
,
(
void
*
)
A
(
tmp
.
newval
),
tmp
.
newlen
);
oldlenp
,
compat_ptr
(
tmp
.
newval
),
tmp
.
newlen
);
unlock_kernel
();
unlock_kernel
();
if
(
oldlenp
)
{
if
(
oldlenp
)
{
if
(
!
error
)
{
if
(
!
error
)
{
if
(
get_user
(
oldlen
,
(
size_t
*
)
addr
)
||
if
(
get_user
(
oldlen
,
(
size_t
__user
*
)
addr
)
||
put_user
(
oldlen
,
(
u32
*
)
A
(
tmp
.
oldlenp
)))
put_user
(
oldlen
,
(
u32
__user
*
)
compat_ptr
(
tmp
.
oldlenp
)))
error
=
-
EFAULT
;
error
=
-
EFAULT
;
}
}
copy_to_user
(
args
->
__unused
,
tmp
.
__unused
,
sizeof
(
tmp
.
__unused
));
copy_to_user
(
args
->
__unused
,
tmp
.
__unused
,
sizeof
(
tmp
.
__unused
));
...
@@ -853,7 +854,7 @@ struct stat64_emu31 {
...
@@ -853,7 +854,7 @@ struct stat64_emu31 {
unsigned
long
st_ino
;
unsigned
long
st_ino
;
};
};
static
int
cp_stat64
(
struct
stat64_emu31
*
ubuf
,
struct
kstat
*
stat
)
static
int
cp_stat64
(
struct
stat64_emu31
__user
*
ubuf
,
struct
kstat
*
stat
)
{
{
struct
stat64_emu31
tmp
;
struct
stat64_emu31
tmp
;
...
@@ -877,7 +878,7 @@ static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat)
...
@@ -877,7 +878,7 @@ static int cp_stat64(struct stat64_emu31 *ubuf, struct kstat *stat)
return
copy_to_user
(
ubuf
,
&
tmp
,
sizeof
(
tmp
))
?
-
EFAULT
:
0
;
return
copy_to_user
(
ubuf
,
&
tmp
,
sizeof
(
tmp
))
?
-
EFAULT
:
0
;
}
}
asmlinkage
long
sys32_stat64
(
char
*
filename
,
struct
stat64_emu31
*
statbuf
)
asmlinkage
long
sys32_stat64
(
char
__user
*
filename
,
struct
stat64_emu31
__user
*
statbuf
)
{
{
struct
kstat
stat
;
struct
kstat
stat
;
int
ret
=
vfs_stat
(
filename
,
&
stat
);
int
ret
=
vfs_stat
(
filename
,
&
stat
);
...
@@ -886,7 +887,7 @@ asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf)
...
@@ -886,7 +887,7 @@ asmlinkage long sys32_stat64(char * filename, struct stat64_emu31 * statbuf)
return
ret
;
return
ret
;
}
}
asmlinkage
long
sys32_lstat64
(
char
*
filename
,
struct
stat64_emu31
*
statbuf
)
asmlinkage
long
sys32_lstat64
(
char
__user
*
filename
,
struct
stat64_emu31
__user
*
statbuf
)
{
{
struct
kstat
stat
;
struct
kstat
stat
;
int
ret
=
vfs_lstat
(
filename
,
&
stat
);
int
ret
=
vfs_lstat
(
filename
,
&
stat
);
...
@@ -895,7 +896,7 @@ asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf)
...
@@ -895,7 +896,7 @@ asmlinkage long sys32_lstat64(char * filename, struct stat64_emu31 * statbuf)
return
ret
;
return
ret
;
}
}
asmlinkage
long
sys32_fstat64
(
unsigned
long
fd
,
struct
stat64_emu31
*
statbuf
)
asmlinkage
long
sys32_fstat64
(
unsigned
long
fd
,
struct
stat64_emu31
__user
*
statbuf
)
{
{
struct
kstat
stat
;
struct
kstat
stat
;
int
ret
=
vfs_fstat
(
fd
,
&
stat
);
int
ret
=
vfs_fstat
(
fd
,
&
stat
);
...
@@ -952,7 +953,7 @@ out:
...
@@ -952,7 +953,7 @@ out:
asmlinkage
unsigned
long
asmlinkage
unsigned
long
old32_mmap
(
struct
mmap_arg_struct_emu31
*
arg
)
old32_mmap
(
struct
mmap_arg_struct_emu31
__user
*
arg
)
{
{
struct
mmap_arg_struct_emu31
a
;
struct
mmap_arg_struct_emu31
a
;
int
error
=
-
EFAULT
;
int
error
=
-
EFAULT
;
...
@@ -970,7 +971,7 @@ out:
...
@@ -970,7 +971,7 @@ out:
}
}
asmlinkage
long
asmlinkage
long
sys32_mmap2
(
struct
mmap_arg_struct_emu31
*
arg
)
sys32_mmap2
(
struct
mmap_arg_struct_emu31
__user
*
arg
)
{
{
struct
mmap_arg_struct_emu31
a
;
struct
mmap_arg_struct_emu31
a
;
int
error
=
-
EFAULT
;
int
error
=
-
EFAULT
;
...
@@ -982,7 +983,7 @@ out:
...
@@ -982,7 +983,7 @@ out:
return
error
;
return
error
;
}
}
asmlinkage
long
sys32_read
(
unsigned
int
fd
,
char
*
buf
,
size_t
count
)
asmlinkage
long
sys32_read
(
unsigned
int
fd
,
char
__user
*
buf
,
size_t
count
)
{
{
if
((
compat_ssize_t
)
count
<
0
)
if
((
compat_ssize_t
)
count
<
0
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -990,7 +991,7 @@ asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count)
...
@@ -990,7 +991,7 @@ asmlinkage long sys32_read(unsigned int fd, char * buf, size_t count)
return
sys_read
(
fd
,
buf
,
count
);
return
sys_read
(
fd
,
buf
,
count
);
}
}
asmlinkage
long
sys32_write
(
unsigned
int
fd
,
char
*
buf
,
size_t
count
)
asmlinkage
long
sys32_write
(
unsigned
int
fd
,
char
__user
*
buf
,
size_t
count
)
{
{
if
((
compat_ssize_t
)
count
<
0
)
if
((
compat_ssize_t
)
count
<
0
)
return
-
EINVAL
;
return
-
EINVAL
;
...
@@ -1002,12 +1003,12 @@ asmlinkage long sys32_clone(struct pt_regs regs)
...
@@ -1002,12 +1003,12 @@ asmlinkage long sys32_clone(struct pt_regs regs)
{
{
unsigned
long
clone_flags
;
unsigned
long
clone_flags
;
unsigned
long
newsp
;
unsigned
long
newsp
;
int
*
parent_tidptr
,
*
child_tidptr
;
int
__user
*
parent_tidptr
,
*
child_tidptr
;
clone_flags
=
regs
.
gprs
[
3
]
&
0xffffffffUL
;
clone_flags
=
regs
.
gprs
[
3
]
&
0xffffffffUL
;
newsp
=
regs
.
orig_gpr2
&
0x7fffffffUL
;
newsp
=
regs
.
orig_gpr2
&
0x7fffffffUL
;
parent_tidptr
=
(
int
*
)
(
regs
.
gprs
[
4
]
&
0x7fffffffUL
);
parent_tidptr
=
compat_ptr
(
regs
.
gprs
[
4
]
);
child_tidptr
=
(
int
*
)
(
regs
.
gprs
[
5
]
&
0x7fffffffUL
);
child_tidptr
=
compat_ptr
(
regs
.
gprs
[
5
]
);
if
(
!
newsp
)
if
(
!
newsp
)
newsp
=
regs
.
gprs
[
15
];
newsp
=
regs
.
gprs
[
15
];
return
do_fork
(
clone_flags
,
newsp
,
&
regs
,
0
,
return
do_fork
(
clone_flags
,
newsp
,
&
regs
,
0
,
...
...
Write
Preview
Markdown
is supported
0%
Try again
or
attach a new file
Attach a file
Cancel
You are about to add
0
people
to the discussion. Proceed with caution.
Finish editing this message first!
Cancel
Please
register
or
sign in
to comment