Skip to content
Projects
Groups
Snippets
Help
Loading...
Help
Support
Keyboard shortcuts
?
Submit feedback
Contribute to GitLab
Sign in
Toggle navigation
L
linux-davinci
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
Commits
fe00f943
Commit
fe00f943
authored
Mar 01, 2005
by
Ralf Baechle
Browse files
Options
Browse Files
Download
Email Patches
Plain Diff
Sparseify MIPS.
Signed-off-by:
Ralf Baechle
<
ralf@linux-mips.org
>
parent
14f18b7f
Changes
21
Hide whitespace changes
Inline
Side-by-side
Showing
21 changed files
with
607 additions
and
585 deletions
+607
-585
arch/mips/Makefile
arch/mips/Makefile
+15
-0
arch/mips/kernel/i8259.c
arch/mips/kernel/i8259.c
+1
-1
arch/mips/kernel/irixelf.c
arch/mips/kernel/irixelf.c
+7
-7
arch/mips/kernel/irixinv.c
arch/mips/kernel/irixinv.c
+4
-3
arch/mips/kernel/irixsig.c
arch/mips/kernel/irixsig.c
+215
-193
arch/mips/kernel/process.c
arch/mips/kernel/process.c
+0
-8
arch/mips/kernel/ptrace.c
arch/mips/kernel/ptrace.c
+2
-2
arch/mips/kernel/signal.c
arch/mips/kernel/signal.c
+8
-6
arch/mips/kernel/sysirix.c
arch/mips/kernel/sysirix.c
+235
-244
arch/mips/kernel/traps.c
arch/mips/kernel/traps.c
+12
-9
arch/mips/kernel/unaligned.c
arch/mips/kernel/unaligned.c
+5
-5
arch/mips/lib/csum_partial_copy.c
arch/mips/lib/csum_partial_copy.c
+1
-1
arch/mips/mm/c-r4k.c
arch/mips/mm/c-r4k.c
+4
-3
arch/mips/mm/cache.c
arch/mips/mm/cache.c
+5
-4
arch/mips/mm/fault.c
arch/mips/mm/fault.c
+2
-2
include/asm-mips/cacheflush.h
include/asm-mips/cacheflush.h
+2
-1
include/asm-mips/checksum.h
include/asm-mips/checksum.h
+3
-2
include/asm-mips/io.h
include/asm-mips/io.h
+14
-4
include/asm-mips/irq.h
include/asm-mips/irq.h
+1
-3
include/asm-mips/sibyte/sb1250.h
include/asm-mips/sibyte/sb1250.h
+1
-1
include/asm-mips/uaccess.h
include/asm-mips/uaccess.h
+70
-86
No files found.
arch/mips/Makefile
View file @
fe00f943
...
...
@@ -52,6 +52,21 @@ ifdef CONFIG_CROSSCOMPILE
CROSS_COMPILE
:=
$
(
tool-prefix
)
endif
CHECKFLAGS-y
+=
-D__linux__
-D__mips__
\
-D_ABIO32
=
1
\
-D_ABIN32
=
2
\
-D_ABI64
=
3
CHECKFLAGS-$(CONFIG_32BIT)
+=
-D_MIPS_SIM
=
_ABIO32
\
-D_MIPS_SZLONG
=
32
\
-D__PTRDIFF_TYPE__
=
int
CHECKFLAGS-$(CONFIG_64BIT)
+=
-m64
-D_MIPS_SIM
=
_ABI64
\
-D_MIPS_SZLONG
=
64
\
-D__PTRDIFF_TYPE__
=
"long int"
CHECKFLAGS-$(CONFIG_CPU_BIG_ENDIAN)
+=
-D__MIPSEB__
CHECKFLAGS-$(CONFIG_CPU_LITTLE_ENDIAN)
+=
-D__MIPSEL__
CHECKFLAGS
=
$
(
CHECKFLAGS-y
)
ifdef
CONFIG_BUILD_ELF64
gas-abi
=
64
ld-emul
=
$
(
64bit-emul
)
...
...
arch/mips/kernel/i8259.c
View file @
fe00f943
...
...
@@ -321,7 +321,7 @@ void __init init_i8259_irqs (void)
for
(
i
=
0
;
i
<
16
;
i
++
)
{
irq_desc
[
i
].
status
=
IRQ_DISABLED
;
irq_desc
[
i
].
action
=
0
;
irq_desc
[
i
].
action
=
NULL
;
irq_desc
[
i
].
depth
=
1
;
irq_desc
[
i
].
handler
=
&
i8259A_irq_type
;
}
...
...
arch/mips/kernel/irixelf.c
View file @
fe00f943
...
...
@@ -147,7 +147,7 @@ static void padzero(unsigned long elf_bss)
nbyte
=
elf_bss
&
(
PAGE_SIZE
-
1
);
if
(
nbyte
)
{
nbyte
=
PAGE_SIZE
-
nbyte
;
clear_user
((
void
*
)
elf_bss
,
nbyte
);
clear_user
((
void
__user
*
)
elf_bss
,
nbyte
);
}
}
...
...
@@ -878,10 +878,10 @@ static int load_irix_library(struct file *file)
* phdrs there are in the USER_PHDRP array. We return the vaddr the
* first phdr was successfully mapped to.
*/
unsigned
long
irix_mapelf
(
int
fd
,
struct
elf_phdr
*
user_phdrp
,
int
cnt
)
unsigned
long
irix_mapelf
(
int
fd
,
struct
elf_phdr
__user
*
user_phdrp
,
int
cnt
)
{
unsigned
long
type
,
vaddr
,
filesz
,
offset
,
flags
;
struct
elf_phdr
*
hp
;
struct
elf_phdr
__user
*
hp
;
struct
file
*
filp
;
int
i
,
retval
;
...
...
@@ -968,9 +968,9 @@ unsigned long irix_mapelf(int fd, struct elf_phdr *user_phdrp, int cnt)
/* These are the only things you should do on a core-file: use only these
* functions to write out all the necessary info.
*/
static
int
dump_write
(
struct
file
*
file
,
const
void
*
addr
,
int
nr
)
static
int
dump_write
(
struct
file
*
file
,
const
void
__user
*
addr
,
int
nr
)
{
return
file
->
f_op
->
write
(
file
,
(
const
char
*
)
addr
,
nr
,
&
file
->
f_pos
)
==
nr
;
return
file
->
f_op
->
write
(
file
,
(
const
char
__user
*
)
addr
,
nr
,
&
file
->
f_pos
)
==
nr
;
}
static
int
dump_seek
(
struct
file
*
file
,
off_t
off
)
...
...
@@ -1204,7 +1204,7 @@ static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file)
len
=
current
->
mm
->
arg_end
-
current
->
mm
->
arg_start
;
len
=
len
>=
ELF_PRARGSZ
?
ELF_PRARGSZ
:
len
;
(
void
*
)
copy_from_user
(
&
psinfo
.
pr_psargs
,
(
const
char
*
)
current
->
mm
->
arg_start
,
len
);
(
const
char
__user
*
)
current
->
mm
->
arg_start
,
len
);
for
(
i
=
0
;
i
<
len
;
i
++
)
if
(
psinfo
.
pr_psargs
[
i
]
==
0
)
psinfo
.
pr_psargs
[
i
]
=
' '
;
...
...
@@ -1301,7 +1301,7 @@ static int irix_core_dump(long signr, struct pt_regs * regs, struct file *file)
#ifdef DEBUG
printk
(
"elf_core_dump: writing %08lx %lx
\n
"
,
addr
,
len
);
#endif
DUMP_WRITE
((
void
*
)
addr
,
len
);
DUMP_WRITE
((
void
__user
*
)
addr
,
len
);
}
if
((
off_t
)
file
->
f_pos
!=
offset
)
{
...
...
arch/mips/kernel/irixinv.c
View file @
fe00f943
...
...
@@ -30,10 +30,10 @@ void add_to_inventory (int class, int type, int controller, int unit, int state)
inventory_items
++
;
}
int
dump_inventory_to_user
(
void
*
userbuf
,
int
size
)
int
dump_inventory_to_user
(
void
__user
*
userbuf
,
int
size
)
{
inventory_t
*
inv
=
&
inventory
[
0
];
inventory_t
*
user
=
userbuf
;
inventory_t
__user
*
user
=
userbuf
;
int
v
;
if
(
!
access_ok
(
VERIFY_WRITE
,
userbuf
,
size
))
...
...
@@ -41,7 +41,8 @@ int dump_inventory_to_user (void *userbuf, int size)
for
(
v
=
0
;
v
<
inventory_items
;
v
++
){
inv
=
&
inventory
[
v
];
copy_to_user
(
user
,
inv
,
sizeof
(
inventory_t
));
if
(
copy_to_user
(
user
,
inv
,
sizeof
(
inventory_t
)))
return
-
EFAULT
;
user
++
;
}
return
inventory_items
*
sizeof
(
inventory_t
);
...
...
arch/mips/kernel/irixsig.c
View file @
fe00f943
...
...
@@ -76,36 +76,39 @@ static inline void dump_irix5_sigctx(struct sigctx_irix5 *c)
}
#endif
static
void
setup_irix_frame
(
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
signr
,
sigset_t
*
oldmask
)
static
int
setup_irix_frame
(
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
signr
,
sigset_t
*
oldmask
)
{
struct
sigctx_irix5
__user
*
ctx
;
unsigned
long
sp
;
struct
sigctx_irix5
*
ctx
;
int
i
;
int
error
,
i
;
sp
=
regs
->
regs
[
29
];
sp
-=
sizeof
(
struct
sigctx_irix5
);
sp
&=
~
(
0xf
);
ctx
=
(
struct
sigctx_irix5
*
)
sp
;
ctx
=
(
struct
sigctx_irix5
__user
*
)
sp
;
if
(
!
access_ok
(
VERIFY_WRITE
,
ctx
,
sizeof
(
*
ctx
)))
goto
segv_and_exit
;
__put_user
(
0
,
&
ctx
->
weird_fpu_thing
);
__put_user
(
~
(
0x00000001
),
&
ctx
->
rmask
);
__put_user
(
0
,
&
ctx
->
regs
[
0
]);
error
=
__put_user
(
0
,
&
ctx
->
weird_fpu_thing
);
error
|=
__put_user
(
~
(
0x00000001
),
&
ctx
->
rmask
);
error
|=
__put_user
(
0
,
&
ctx
->
regs
[
0
]);
for
(
i
=
1
;
i
<
32
;
i
++
)
__put_user
((
u64
)
regs
->
regs
[
i
],
&
ctx
->
regs
[
i
]);
error
|=
__put_user
((
u64
)
regs
->
regs
[
i
],
&
ctx
->
regs
[
i
]);
error
|=
__put_user
((
u64
)
regs
->
hi
,
&
ctx
->
hi
);
error
|=
__put_user
((
u64
)
regs
->
lo
,
&
ctx
->
lo
);
error
|=
__put_user
((
u64
)
regs
->
cp0_epc
,
&
ctx
->
pc
);
error
|=
__put_user
(
!!
used_math
(),
&
ctx
->
usedfp
);
error
|=
__put_user
((
u64
)
regs
->
cp0_cause
,
&
ctx
->
cp0_cause
);
error
|=
__put_user
((
u64
)
regs
->
cp0_badvaddr
,
&
ctx
->
cp0_badvaddr
);
__put_user
((
u64
)
regs
->
hi
,
&
ctx
->
hi
);
__put_user
((
u64
)
regs
->
lo
,
&
ctx
->
lo
);
__put_user
((
u64
)
regs
->
cp0_epc
,
&
ctx
->
pc
);
__put_user
(
!!
used_math
(),
&
ctx
->
usedfp
);
__put_user
((
u64
)
regs
->
cp0_cause
,
&
ctx
->
cp0_cause
);
__put_user
((
u64
)
regs
->
cp0_badvaddr
,
&
ctx
->
cp0_badvaddr
);
error
|=
__put_user
(
0
,
&
ctx
->
sstk_flags
);
/* XXX sigstack unimp... todo... */
__put_user
(
0
,
&
ctx
->
sstk_flags
);
/* XXX sigstack unimp... todo... */
error
|=
__copy_to_user
(
&
ctx
->
sigset
,
oldmask
,
sizeof
(
irix_sigset_t
))
?
-
EFAULT
:
0
;
__copy_to_user
(
&
ctx
->
sigset
,
oldmask
,
sizeof
(
irix_sigset_t
));
if
(
error
)
goto
segv_and_exit
;
#ifdef DEBUG_SIG
dump_irix5_sigctx
(
ctx
);
...
...
@@ -117,13 +120,14 @@ static void setup_irix_frame(struct k_sigaction *ka, struct pt_regs *regs,
regs
->
regs
[
7
]
=
(
unsigned
long
)
ka
->
sa
.
sa_handler
;
regs
->
regs
[
25
]
=
regs
->
cp0_epc
=
(
unsigned
long
)
ka
->
sa_restorer
;
return
;
return
1
;
segv_and_exit:
force_sigsegv
(
signr
,
current
);
return
0
;
}
static
void
inline
static
int
inline
setup_irix_rt_frame
(
struct
k_sigaction
*
ka
,
struct
pt_regs
*
regs
,
int
signr
,
sigset_t
*
oldmask
,
siginfo_t
*
info
)
{
...
...
@@ -131,9 +135,11 @@ setup_irix_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
do_exit
(
SIGSEGV
);
}
static
inline
void
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
static
inline
int
handle_signal
(
unsigned
long
sig
,
siginfo_t
*
info
,
struct
k_sigaction
*
ka
,
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
{
int
ret
;
switch
(
regs
->
regs
[
0
])
{
case
ERESTARTNOHAND
:
regs
->
regs
[
2
]
=
EINTR
;
...
...
@@ -151,9 +157,9 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
regs
->
regs
[
0
]
=
0
;
/* Don't deal with this again. */
if
(
ka
->
sa
.
sa_flags
&
SA_SIGINFO
)
setup_irix_rt_frame
(
ka
,
regs
,
sig
,
oldset
,
info
);
ret
=
setup_irix_rt_frame
(
ka
,
regs
,
sig
,
oldset
,
info
);
else
setup_irix_frame
(
ka
,
regs
,
sig
,
oldset
);
ret
=
setup_irix_frame
(
ka
,
regs
,
sig
,
oldset
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
sigorsets
(
&
current
->
blocked
,
&
current
->
blocked
,
&
ka
->
sa
.
sa_mask
);
...
...
@@ -161,6 +167,8 @@ static inline void handle_signal(unsigned long sig, siginfo_t *info,
sigaddset
(
&
current
->
blocked
,
sig
);
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
return
ret
;
}
asmlinkage
int
do_irix_signal
(
sigset_t
*
oldset
,
struct
pt_regs
*
regs
)
...
...
@@ -184,10 +192,8 @@ asmlinkage int do_irix_signal(sigset_t *oldset, struct pt_regs *regs)
oldset
=
&
current
->
blocked
;
signr
=
get_signal_to_deliver
(
&
info
,
&
ka
,
regs
,
NULL
);
if
(
signr
>
0
)
{
handle_signal
(
signr
,
&
info
,
&
ka
,
oldset
,
regs
);
return
1
;
}
if
(
signr
>
0
)
return
handle_signal
(
signr
,
&
info
,
&
ka
,
oldset
,
regs
);
no_signal:
/*
...
...
@@ -208,10 +214,11 @@ no_signal:
asmlinkage
void
irix_sigreturn
(
struct
pt_regs
*
regs
)
{
struct
sigctx_irix5
*
context
,
*
magic
;
struct
sigctx_irix5
__user
*
context
,
*
magic
;
unsigned
long
umask
,
mask
;
u64
*
fregs
;
int
sig
,
i
,
base
=
0
;
u32
usedfp
;
int
error
,
sig
,
i
,
base
=
0
;
sigset_t
blocked
;
/* Always make any pending restarted system calls return -EINTR */
...
...
@@ -220,8 +227,8 @@ irix_sigreturn(struct pt_regs *regs)
if
(
regs
->
regs
[
2
]
==
1000
)
base
=
1
;
context
=
(
struct
sigctx_irix5
*
)
regs
->
regs
[
base
+
4
];
magic
=
(
struct
sigctx_irix5
*
)
regs
->
regs
[
base
+
5
];
context
=
(
struct
sigctx_irix5
__user
*
)
regs
->
regs
[
base
+
4
];
magic
=
(
struct
sigctx_irix5
__user
*
)
regs
->
regs
[
base
+
5
];
sig
=
(
int
)
regs
->
regs
[
base
+
6
];
#ifdef DEBUG_SIG
printk
(
"[%s:%d] IRIX sigreturn(scp[%p],ucp[%p],sig[%d])
\n
"
,
...
...
@@ -236,25 +243,31 @@ irix_sigreturn(struct pt_regs *regs)
dump_irix5_sigctx
(
context
);
#endif
__get_user
(
regs
->
cp0_epc
,
&
context
->
pc
);
umask
=
context
->
rmask
;
mask
=
2
;
error
=
__get_user
(
regs
->
cp0_epc
,
&
context
->
pc
);
error
|=
__get_user
(
umask
,
&
context
->
rmask
);
mask
=
2
;
for
(
i
=
1
;
i
<
32
;
i
++
,
mask
<<=
1
)
{
if
(
umask
&
mask
)
__get_user
(
regs
->
regs
[
i
],
&
context
->
regs
[
i
]);
if
(
umask
&
mask
)
error
|=
__get_user
(
regs
->
regs
[
i
],
&
context
->
regs
[
i
]);
}
__get_user
(
regs
->
hi
,
&
context
->
hi
);
__get_user
(
regs
->
lo
,
&
context
->
lo
);
error
|=
__get_user
(
regs
->
hi
,
&
context
->
hi
);
error
|=
__get_user
(
regs
->
lo
,
&
context
->
lo
);
if
((
umask
&
1
)
&&
context
->
usedfp
)
{
error
|=
__get_user
(
usedfp
,
&
context
->
usedfp
);
if
((
umask
&
1
)
&&
usedfp
)
{
fregs
=
(
u64
*
)
&
current
->
thread
.
fpu
;
for
(
i
=
0
;
i
<
32
;
i
++
)
fregs
[
i
]
=
(
u64
)
context
->
fpregs
[
i
]
;
__get_user
(
current
->
thread
.
fpu
.
hard
.
fcr31
,
&
context
->
fpcsr
);
error
|=
__get_user
(
fregs
[
i
],
&
context
->
fpregs
[
i
])
;
error
|=
__get_user
(
current
->
thread
.
fpu
.
hard
.
fcr31
,
&
context
->
fpcsr
);
}
/* XXX do sigstack crapola here... XXX */
if
(
__copy_from_user
(
&
blocked
,
&
context
->
sigset
,
sizeof
(
blocked
)))
error
|=
__copy_from_user
(
&
blocked
,
&
context
->
sigset
,
sizeof
(
blocked
))
?
-
EFAULT
:
0
;
if
(
error
)
goto
badframe
;
sigdelsetmask
(
&
blocked
,
~
_BLOCKABLE
);
...
...
@@ -296,8 +309,8 @@ static inline void dump_sigact_irix5(struct sigact_irix5 *p)
#endif
asmlinkage
int
irix_sigaction
(
int
sig
,
const
struct
sigaction
*
act
,
struct
sigaction
*
oact
,
void
*
trampoline
)
irix_sigaction
(
int
sig
,
const
struct
sigaction
__user
*
act
,
struct
sigaction
__user
*
oact
,
void
__user
*
trampoline
)
{
struct
k_sigaction
new_ka
,
old_ka
;
int
ret
;
...
...
@@ -311,12 +324,16 @@ irix_sigaction(int sig, const struct sigaction *act,
#endif
if
(
act
)
{
sigset_t
mask
;
i
f
(
!
access_ok
(
VERIFY_READ
,
act
,
sizeof
(
*
act
))
||
__get_user
(
new_ka
.
sa
.
sa_handler
,
&
act
->
sa_handler
)
||
__get_user
(
new_ka
.
sa
.
sa_flags
,
&
act
->
sa_flags
))
i
nt
err
;
if
(
!
access_ok
(
VERIFY_READ
,
act
,
sizeof
(
*
act
)
))
return
-
EFAULT
;
err
=
__get_user
(
new_ka
.
sa
.
sa_handler
,
&
act
->
sa_handler
);
err
|=
__get_user
(
new_ka
.
sa
.
sa_flags
,
&
act
->
sa_flags
);
__copy_from_user
(
&
mask
,
&
act
->
sa_mask
,
sizeof
(
sigset_t
));
err
|=
__copy_from_user
(
&
mask
,
&
act
->
sa_mask
,
sizeof
(
sigset_t
))
?
-
EFAULT
:
0
;
if
(
err
)
return
err
;
/*
* Hmmm... methinks IRIX libc always passes a valid trampoline
...
...
@@ -330,30 +347,37 @@ irix_sigaction(int sig, const struct sigaction *act,
ret
=
do_sigaction
(
sig
,
act
?
&
new_ka
:
NULL
,
oact
?
&
old_ka
:
NULL
);
if
(
!
ret
&&
oact
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
oact
,
sizeof
(
*
oact
))
||
__put_user
(
old_ka
.
sa
.
sa_handler
,
&
oact
->
sa_handler
)
||
__put_user
(
old_ka
.
sa
.
sa_flags
,
&
oact
->
sa_flags
))
int
err
;
if
(
!
access_ok
(
VERIFY_WRITE
,
oact
,
sizeof
(
*
oact
)))
return
-
EFAULT
;
err
=
__put_user
(
old_ka
.
sa
.
sa_handler
,
&
oact
->
sa_handler
);
err
|=
__put_user
(
old_ka
.
sa
.
sa_flags
,
&
oact
->
sa_flags
);
err
|=
__copy_to_user
(
&
oact
->
sa_mask
,
&
old_ka
.
sa
.
sa_mask
,
sizeof
(
sigset_t
))
?
-
EFAULT
:
0
;
if
(
err
)
return
-
EFAULT
;
__copy_to_user
(
&
old_ka
.
sa
.
sa_mask
,
&
oact
->
sa_mask
,
sizeof
(
sigset_t
));
}
return
ret
;
}
asmlinkage
int
irix_sigpending
(
irix_sigset_t
*
set
)
asmlinkage
int
irix_sigpending
(
irix_sigset_t
__user
*
set
)
{
return
do_sigpending
(
set
,
sizeof
(
*
set
));
}
asmlinkage
int
irix_sigprocmask
(
int
how
,
irix_sigset_t
*
new
,
irix_sigset_t
*
old
)
asmlinkage
int
irix_sigprocmask
(
int
how
,
irix_sigset_t
__user
*
new
,
irix_sigset_t
__user
*
old
)
{
sigset_t
oldbits
,
newbits
;
if
(
new
)
{
if
(
!
access_ok
(
VERIFY_READ
,
new
,
sizeof
(
*
new
)))
return
-
EFAULT
;
__copy_from_user
(
&
newbits
,
new
,
sizeof
(
unsigned
long
)
*
4
);
if
(
__copy_from_user
(
&
newbits
,
new
,
sizeof
(
unsigned
long
)
*
4
))
return
-
EFAULT
;
sigdelsetmask
(
&
newbits
,
~
_BLOCKABLE
);
spin_lock_irq
(
&
current
->
sighand
->
siglock
);
...
...
@@ -381,20 +405,19 @@ asmlinkage int irix_sigprocmask(int how, irix_sigset_t *new, irix_sigset_t *old)
recalc_sigpending
();
spin_unlock_irq
(
&
current
->
sighand
->
siglock
);
}
if
(
old
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
old
,
sizeof
(
*
old
)))
return
-
EFAULT
;
__copy_to_user
(
old
,
&
current
->
blocked
,
sizeof
(
unsigned
long
)
*
4
);
}
if
(
old
)
return
copy_to_user
(
old
,
&
current
->
blocked
,
sizeof
(
unsigned
long
)
*
4
)
?
-
EFAULT
:
0
;
return
0
;
}
asmlinkage
int
irix_sigsuspend
(
struct
pt_regs
*
regs
)
{
sigset_t
*
uset
,
saveset
,
newset
;
sigset_t
saveset
,
newset
;
sigset_t
__user
*
uset
;
uset
=
(
sigset_t
*
)
regs
->
regs
[
4
];
uset
=
(
sigset_t
__user
*
)
regs
->
regs
[
4
];
if
(
copy_from_user
(
&
newset
,
uset
,
sizeof
(
sigset_t
)))
return
-
EFAULT
;
sigdelsetmask
(
&
newset
,
~
_BLOCKABLE
);
...
...
@@ -440,12 +463,13 @@ struct irix5_siginfo {
}
stuff
;
};
asmlinkage
int
irix_sigpoll_sys
(
unsigned
long
*
set
,
struct
irix5_siginfo
*
info
,
struct
timespec
*
tp
)
asmlinkage
int
irix_sigpoll_sys
(
unsigned
long
__user
*
set
,
struct
irix5_siginfo
__user
*
info
,
struct
timespec
__user
*
tp
)
{
long
expire
=
MAX_SCHEDULE_TIMEOUT
;
sigset_t
kset
;
int
i
,
sig
,
error
,
timeo
=
0
;
struct
timespec
ktp
;
#ifdef DEBUG_SIG
printk
(
"[%s:%d] irix_sigpoll_sys(%p,%p,%p)
\n
"
,
...
...
@@ -456,14 +480,8 @@ asmlinkage int irix_sigpoll_sys(unsigned long *set, struct irix5_siginfo *info,
if
(
!
set
)
return
-
EINVAL
;
if
(
!
access_ok
(
VERIFY_READ
,
set
,
sizeof
(
kset
)))
{
error
=
-
EFAULT
;
goto
out
;
}
__copy_from_user
(
&
kset
,
set
,
sizeof
(
set
));
if
(
error
)
goto
out
;
if
(
copy_from_user
(
&
kset
,
set
,
sizeof
(
set
)))
return
-
EFAULT
;
if
(
info
&&
clear_user
(
info
,
sizeof
(
*
info
)))
{
error
=
-
EFAULT
;
...
...
@@ -471,19 +489,21 @@ asmlinkage int irix_sigpoll_sys(unsigned long *set, struct irix5_siginfo *info,
}
if
(
tp
)
{
if
(
!
access_ok
(
VERIFY_READ
,
tp
,
sizeof
(
*
tp
)))
if
(
copy_from_user
(
&
ktp
,
tp
,
sizeof
(
*
tp
)))
return
-
EFAULT
;
if
(
!
tp
->
tv_sec
&&
!
tp
->
tv_nsec
)
{
error
=
-
EINVAL
;
goto
out
;
}
expire
=
timespec_to_jiffies
(
tp
)
+
(
tp
->
tv_sec
||
tp
->
tv_nsec
);
if
(
!
ktp
.
tv_sec
&&
!
ktp
.
tv_nsec
)
return
-
EINVAL
;
expire
=
timespec_to_jiffies
(
&
ktp
)
+
(
ktp
.
tv_sec
||
ktp
.
tv_nsec
);
}
while
(
1
)
{
long
tmp
=
0
;
expire
=
schedule_timeout_interruptible
(
expire
);
current
->
state
=
TASK_INTERRUPTIBLE
;
expire
=
schedule_timeout
(
expire
);
for
(
i
=
0
;
i
<=
4
;
i
++
)
tmp
|=
(
current
->
pending
.
signal
.
sig
[
i
]
&
kset
.
sig
[
i
]);
...
...
@@ -500,15 +520,14 @@ asmlinkage int irix_sigpoll_sys(unsigned long *set, struct irix5_siginfo *info,
if
(
timeo
)
return
-
EAGAIN
;
for
(
sig
=
1
;
i
<=
65
/* IRIX_NSIG */
;
sig
++
)
{
for
(
sig
=
1
;
i
<=
65
/* IRIX_NSIG */
;
sig
++
)
{
if
(
sigismember
(
&
kset
,
sig
))
continue
;
if
(
sigismember
(
&
current
->
pending
.
signal
,
sig
))
{
/* XXX need more than this... */
if
(
info
)
info
->
sig
=
sig
;
error
=
0
;
goto
out
;
return
copy_to_user
(
&
info
->
sig
,
&
sig
,
sizeof
(
sig
));
return
0
;
}
}
...
...
@@ -534,8 +553,9 @@ extern int getrusage(struct task_struct *, int, struct rusage __user *);
#define W_MASK (W_EXITED | W_TRAPPED | W_STOPPED | W_CONT | W_NOHANG)
asmlinkage
int
irix_waitsys
(
int
type
,
int
pid
,
struct
irix5_siginfo
*
info
,
int
options
,
struct
rusage
*
ru
)
asmlinkage
int
irix_waitsys
(
int
type
,
int
pid
,
struct
irix5_siginfo
__user
*
info
,
int
options
,
struct
rusage
__user
*
ru
)
{
int
flag
,
retval
;
DECLARE_WAITQUEUE
(
wait
,
current
);
...
...
@@ -543,28 +563,22 @@ asmlinkage int irix_waitsys(int type, int pid, struct irix5_siginfo *info,
struct
task_struct
*
p
;
struct
list_head
*
_p
;
if
(
!
info
)
{
retval
=
-
EINVAL
;
goto
out
;
}
if
(
!
access_ok
(
VERIFY_WRITE
,
info
,
sizeof
(
*
info
)))
{
retval
=
-
EFAULT
;
goto
out
;
}
if
(
ru
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
ru
,
sizeof
(
*
ru
)))
{
retval
=
-
EFAULT
;
goto
out
;
}
}
if
(
options
&
~
(
W_MASK
))
{
retval
=
-
EINVAL
;
goto
out
;
}
if
(
type
!=
IRIX_P_PID
&&
type
!=
IRIX_P_PGID
&&
type
!=
IRIX_P_ALL
)
{
retval
=
-
EINVAL
;
goto
out
;
}
if
(
!
info
)
return
-
EINVAL
;
if
(
!
access_ok
(
VERIFY_WRITE
,
info
,
sizeof
(
*
info
)))
return
-
EFAULT
;
if
(
ru
)
if
(
!
access_ok
(
VERIFY_WRITE
,
ru
,
sizeof
(
*
ru
)))
return
-
EFAULT
;
if
(
options
&
~
W_MASK
)
return
-
EINVAL
;
if
(
type
!=
IRIX_P_PID
&&
type
!=
IRIX_P_PGID
&&
type
!=
IRIX_P_ALL
)
return
-
EINVAL
;
add_wait_queue
(
&
current
->
signal
->
wait_chldexit
,
&
wait
);
repeat:
flag
=
0
;
...
...
@@ -595,18 +609,20 @@ repeat:
add_parent
(
p
,
p
->
parent
);
write_unlock_irq
(
&
tasklist_lock
);
retval
=
ru
?
getrusage
(
p
,
RUSAGE_BOTH
,
ru
)
:
0
;
if
(
!
retval
&&
ru
)
{
retval
|=
__put_user
(
SIGCHLD
,
&
info
->
sig
);
retval
|=
__put_user
(
0
,
&
info
->
code
);
retval
|=
__put_user
(
p
->
pid
,
&
info
->
stuff
.
procinfo
.
pid
);
retval
|=
__put_user
((
p
->
exit_code
>>
8
)
&
0xff
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
status
);
retval
|=
__put_user
(
p
->
utime
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
utime
);
retval
|=
__put_user
(
p
->
stime
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
stime
);
}
if
(
!
retval
)
{
p
->
exit_code
=
0
;
}
if
(
retval
)
goto
end_waitsys
;
retval
=
__put_user
(
SIGCHLD
,
&
info
->
sig
);
retval
|=
__put_user
(
0
,
&
info
->
code
);
retval
|=
__put_user
(
p
->
pid
,
&
info
->
stuff
.
procinfo
.
pid
);
retval
|=
__put_user
((
p
->
exit_code
>>
8
)
&
0xff
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
status
);
retval
|=
__put_user
(
p
->
utime
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
utime
);
retval
|=
__put_user
(
p
->
stime
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
stime
);
if
(
retval
)
goto
end_waitsys
;
p
->
exit_code
=
0
;
goto
end_waitsys
;
case
EXIT_ZOMBIE
:
...
...
@@ -614,16 +630,18 @@ repeat:
current
->
signal
->
cstime
+=
p
->
stime
+
p
->
signal
->
cstime
;
if
(
ru
!=
NULL
)
getrusage
(
p
,
RUSAGE_BOTH
,
ru
);
__put_user
(
SIGCHLD
,
&
info
->
sig
);
__put_user
(
1
,
&
info
->
code
);
/* CLD_EXITED */
__put_user
(
p
->
pid
,
&
info
->
stuff
.
procinfo
.
pid
);
__put_user
((
p
->
exit_code
>>
8
)
&
0xff
,
retval
=
__put_user
(
SIGCHLD
,
&
info
->
sig
);
retval
|=
__put_user
(
1
,
&
info
->
code
);
/* CLD_EXITED */
retval
|=
__put_user
(
p
->
pid
,
&
info
->
stuff
.
procinfo
.
pid
);
retval
|=
__put_user
((
p
->
exit_code
>>
8
)
&
0xff
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
status
);
__put_user
(
p
->
utime
,
retval
|=
__put_user
(
p
->
utime
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
utime
);
__put_user
(
p
->
stime
,
retval
|=
__put_user
(
p
->
stime
,
&
info
->
stuff
.
procinfo
.
procdata
.
child
.
stime
);
retval
=
0
;
if
(
retval
)
return
retval
;
if
(
p
->
real_parent
!=
p
->
parent
)
{
write_lock_irq
(
&
tasklist_lock
);
remove_parent
(
p
);
...
...
@@ -656,7 +674,6 @@ end_waitsys:
current
->
state
=
TASK_RUNNING
;
remove_wait_queue
(
&
current
->
signal
->
wait_chldexit
,
&
wait
);
out:
return
retval
;
}
...
...
@@ -675,39 +692,39 @@ struct irix5_context {
asmlinkage
int
irix_getcontext
(
struct
pt_regs
*
regs
)
{
int
i
,
base
=
0
;
struct
irix5_context
*
ctx
;
int
error
,
i
,
base
=
0
;
struct
irix5_context
__user
*
ctx
;
unsigned
long
flags
;
if
(
regs
->
regs
[
2
]
==
1000
)
base
=
1
;
ctx
=
(
struct
irix5_context
*
)
regs
->
regs
[
base
+
4
];
ctx
=
(
struct
irix5_context
__user
*
)
regs
->
regs
[
base
+
4
];
#ifdef DEBUG_SIG
printk
(
"[%s:%d] irix_getcontext(%p)
\n
"
,
current
->
comm
,
current
->
pid
,
ctx
);
#endif
if
(
!
access_ok
(
VERIFY_WRITE
,
ctx
,
sizeof
(
*
ctx
)))
if
(
!
access_ok
(
VERIFY_WRITE
,
ctx
,
sizeof
(
*
ctx
)))
;
return
-
EFAULT
;
__put_user
(
current
->
thread
.
irix_oldctx
,
&
ctx
->
link
);
error
=
__put_user
(
current
->
thread
.
irix_oldctx
,
&
ctx
->
link
);
__copy_to_user
(
&
ctx
->
sigmask
,
&
current
->
blocked
,
sizeof
(
irix_sigset_t
))
;
error
|=
__copy_to_user
(
&
ctx
->
sigmask
,
&
current
->
blocked
,
sizeof
(
irix_sigset_t
))
?
-
EFAULT
:
0
;
/* XXX Do sigstack stuff someday... */
__put_user
(
0
,
&
ctx
->
stack
.
sp
);
__put_user
(
0
,
&
ctx
->
stack
.
size
);
__put_user
(
0
,
&
ctx
->
stack
.
flags
);
error
|=
__put_user
(
0
,
&
ctx
->
stack
.
sp
);
error
|=
__put_user
(
0
,
&
ctx
->
stack
.
size
);
error
|=
__put_user
(
0
,
&
ctx
->
stack
.
flags
);
__put_user
(
0
,
&
ctx
->
weird_graphics_thing
);
__put_user
(
0
,
&
ctx
->
regs
[
0
]);
error
|=
__put_user
(
0
,
&
ctx
->
weird_graphics_thing
);
error
|=
__put_user
(
0
,
&
ctx
->
regs
[
0
]);
for
(
i
=
1
;
i
<
32
;
i
++
)
__put_user
(
regs
->
regs
[
i
],
&
ctx
->
regs
[
i
]);
__put_user
(
regs
->
lo
,
&
ctx
->
regs
[
32
]);
__put_user
(
regs
->
hi
,
&
ctx
->
regs
[
33
]);
__put_user
(
regs
->
cp0_cause
,
&
ctx
->
regs
[
34
]);
__put_user
(
regs
->
cp0_epc
,
&
ctx
->
regs
[
35
]);
error
|=
__put_user
(
regs
->
regs
[
i
],
&
ctx
->
regs
[
i
]);
error
|=
__put_user
(
regs
->
lo
,
&
ctx
->
regs
[
32
]);
error
|=
__put_user
(
regs
->
hi
,
&
ctx
->
regs
[
33
]);
error
|=
__put_user
(
regs
->
cp0_cause
,
&
ctx
->
regs
[
34
]);
error
|=
__put_user
(
regs
->
cp0_epc
,
&
ctx
->
regs
[
35
]);
flags
=
0x0f
;
if
(
!
used_math
())
{
...
...
@@ -716,119 +733,124 @@ asmlinkage int irix_getcontext(struct pt_regs *regs)
/* XXX wheee... */
printk
(
"Wheee, no code for saving IRIX FPU context yet.
\n
"
);
}
__put_user
(
flags
,
&
ctx
->
flags
);
error
|=
__put_user
(
flags
,
&
ctx
->
flags
);
return
0
;
return
error
;
}
asmlinkage
unsigned
long
irix_setcontext
(
struct
pt_regs
*
regs
)
asmlinkage
void
irix_setcontext
(
struct
pt_regs
*
regs
)
{
int
error
,
base
=
0
;
struct
irix5_context
*
ctx
;
struct
irix5_context
__user
*
ctx
;
int
err
,
base
=
0
;
u32
flags
;
if
(
regs
->
regs
[
2
]
==
1000
)
if
(
regs
->
regs
[
2
]
==
1000
)
base
=
1
;
ctx
=
(
struct
irix5_context
*
)
regs
->
regs
[
base
+
4
];
ctx
=
(
struct
irix5_context
__user
*
)
regs
->
regs
[
base
+
4
];
#ifdef DEBUG_SIG
printk
(
"[%s:%d] irix_setcontext(%p)
\n
"
,
current
->
comm
,
current
->
pid
,
ctx
);
#endif
if
(
!
access_ok
(
VERIFY_READ
,
ctx
,
sizeof
(
*
ctx
)))
{
error
=
-
EFAULT
;
goto
out
;
}
if
(
!
access_ok
(
VERIFY_READ
,
ctx
,
sizeof
(
*
ctx
)))
goto
segv_and_exit
;
if
(
ctx
->
flags
&
0x02
)
{
err
=
__get_user
(
flags
,
&
ctx
->
flags
);
if
(
flags
&
0x02
)
{
/* XXX sigstack garbage, todo... */
printk
(
"Wheee, cannot do sigstack stuff in setcontext
\n
"
);
}
if
(
ctx
->
flags
&
0x04
)
{
if
(
flags
&
0x04
)
{
int
i
;
/* XXX extra control block stuff... todo... */
for
(
i
=
1
;
i
<
32
;
i
++
)
regs
->
regs
[
i
]
=
ctx
->
regs
[
i
]
;
regs
->
lo
=
ctx
->
regs
[
32
]
;
regs
->
hi
=
ctx
->
regs
[
33
]
;
regs
->
cp0_epc
=
ctx
->
regs
[
35
]
;
for
(
i
=
1
;
i
<
32
;
i
++
)
err
|=
__get_user
(
regs
->
regs
[
i
],
&
ctx
->
regs
[
i
])
;
err
|=
__get_user
(
regs
->
lo
,
&
ctx
->
regs
[
32
])
;
err
|=
__get_user
(
regs
->
hi
,
&
ctx
->
regs
[
33
])
;
err
|=
__get_user
(
regs
->
cp0_epc
,
&
ctx
->
regs
[
35
])
;
}
if
(
ctx
->
flags
&
0x08
)
{
if
(
flags
&
0x08
)
/* XXX fpu context, blah... */
printk
(
"Wheee, cannot restore FPU context yet...
\n
"
);
}
current
->
thread
.
irix_oldctx
=
ctx
->
link
;
error
=
regs
->
regs
[
2
];
printk
(
KERN_ERR
"Wheee, cannot restore FPU context yet...
\n
"
);
out:
return
error
;
err
|=
__get_user
(
current
->
thread
.
irix_oldctx
,
&
ctx
->
link
);
if
(
err
)
goto
segv_and_exit
;
/*
* Don't let your children do this ...
*/
if
(
current_thread_info
()
->
flags
&
TIF_SYSCALL_TRACE
)
do_syscall_trace
(
regs
,
1
);
__asm__
__volatile__
(
"move
\t
$29,%0
\n\t
"
"j
\t
syscall_exit"
:
/* no outputs */
:
"r"
(
&
regs
));
/* Unreached */
segv_and_exit:
force_sigsegv
(
SIGSEGV
,
current
);
}
struct
irix_sigstack
{
unsigned
long
sp
;
int
status
;
};
struct
irix_sigstack
{
unsigned
long
sp
;
int
status
;
};
asmlinkage
int
irix_sigstack
(
struct
irix_sigstack
*
new
,
struct
irix_sigstack
*
old
)
asmlinkage
int
irix_sigstack
(
struct
irix_sigstack
__user
*
new
,
struct
irix_sigstack
__user
*
old
)
{
int
error
=
-
EFAULT
;
#ifdef DEBUG_SIG
printk
(
"[%s:%d] irix_sigstack(%p,%p)
\n
"
,
current
->
comm
,
current
->
pid
,
new
,
old
);
#endif
if
(
new
)
{
if
(
new
)
{
if
(
!
access_ok
(
VERIFY_READ
,
new
,
sizeof
(
*
new
)))
goto
out
;
return
-
EFAULT
;
}
if
(
old
)
{
if
(
old
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
old
,
sizeof
(
*
old
)))
goto
out
;
return
-
EFAULT
;
}
error
=
0
;
out:
return
error
;
return
0
;
}
struct
irix_sigaltstack
{
unsigned
long
sp
;
int
size
;
int
status
;
};
asmlinkage
int
irix_sigaltstack
(
struct
irix_sigaltstack
*
new
,
struct
irix_sigaltstack
*
old
)
asmlinkage
int
irix_sigaltstack
(
struct
irix_sigaltstack
__user
*
new
,
struct
irix_sigaltstack
__user
*
old
)
{
int
error
=
-
EFAULT
;
#ifdef DEBUG_SIG
printk
(
"[%s:%d] irix_sigaltstack(%p,%p)
\n
"
,
current
->
comm
,
current
->
pid
,
new
,
old
);
#endif
if
(
new
)
{
if
(
new
)
if
(
!
access_ok
(
VERIFY_READ
,
new
,
sizeof
(
*
new
)))
goto
out
;
}
return
-
EFAULT
;
if
(
old
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
old
,
sizeof
(
*
old
)))
goto
out
;
return
-
EFAULT
;
}
error
=
0
;
out:
error
=
0
;
return
error
;
return
0
;
}
struct
irix_procset
{
int
cmd
,
ltype
,
lid
,
rtype
,
rid
;
};
asmlinkage
int
irix_sigsendset
(
struct
irix_procset
*
pset
,
int
sig
)
asmlinkage
int
irix_sigsendset
(
struct
irix_procset
__user
*
pset
,
int
sig
)
{
if
(
!
access_ok
(
VERIFY_READ
,
pset
,
sizeof
(
*
pset
)))
return
-
EFAULT
;
#ifdef DEBUG_SIG
printk
(
"[%s:%d] irix_sigsendset([%d,%d,%d,%d,%d],%d)
\n
"
,
current
->
comm
,
current
->
pid
,
...
...
arch/mips/kernel/process.c
View file @
fe00f943
...
...
@@ -38,14 +38,6 @@
#include <asm/isadep.h>
#include <asm/inst.h>
/*
* We use this if we don't have any better idle routine..
* (This to kill: kernel/platform.c.
*/
void
default_idle
(
void
)
{
}
/*
* The idle thread. There's no useful work to be done, so just try to conserve
* power and have a low exit latency (ie sit in a loop waiting for somebody to
...
...
arch/mips/kernel/ptrace.c
View file @
fe00f943
...
...
@@ -103,7 +103,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
ret
=
-
EIO
;
if
(
copied
!=
sizeof
(
tmp
))
break
;
ret
=
put_user
(
tmp
,(
unsigned
long
*
)
data
);
ret
=
put_user
(
tmp
,(
unsigned
long
__user
*
)
data
);
break
;
}
...
...
@@ -180,7 +180,7 @@ asmlinkage int sys_ptrace(long request, long pid, long addr, long data)
ret
=
-
EIO
;
goto
out_tsk
;
}
ret
=
put_user
(
tmp
,
(
unsigned
long
*
)
data
);
ret
=
put_user
(
tmp
,
(
unsigned
long
__user
*
)
data
);
break
;
}
...
...
arch/mips/kernel/signal.c
View file @
fe00f943
...
...
@@ -47,9 +47,10 @@ save_static_function(sys_sigsuspend);
__attribute_used__
noinline
static
int
_sys_sigsuspend
(
nabi_no_regargs
struct
pt_regs
regs
)
{
sigset_t
*
uset
,
saveset
,
newset
;
sigset_t
saveset
,
newset
;
sigset_t
__user
*
uset
;
uset
=
(
sigset_t
*
)
regs
.
regs
[
4
];
uset
=
(
sigset_t
__user
*
)
regs
.
regs
[
4
];
if
(
copy_from_user
(
&
newset
,
uset
,
sizeof
(
sigset_t
)))
return
-
EFAULT
;
sigdelsetmask
(
&
newset
,
~
_BLOCKABLE
);
...
...
@@ -75,7 +76,8 @@ save_static_function(sys_rt_sigsuspend);
__attribute_used__
noinline
static
int
_sys_rt_sigsuspend
(
nabi_no_regargs
struct
pt_regs
regs
)
{
sigset_t
*
unewset
,
saveset
,
newset
;
sigset_t
saveset
,
newset
;
sigset_t
__user
*
unewset
;
size_t
sigsetsize
;
/* XXX Don't preclude handling different sized sigset_t's. */
...
...
@@ -83,7 +85,7 @@ _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
if
(
sigsetsize
!=
sizeof
(
sigset_t
))
return
-
EINVAL
;
unewset
=
(
sigset_t
*
)
regs
.
regs
[
4
];
unewset
=
(
sigset_t
__user
*
)
regs
.
regs
[
4
];
if
(
copy_from_user
(
&
newset
,
unewset
,
sizeof
(
newset
)))
return
-
EFAULT
;
sigdelsetmask
(
&
newset
,
~
_BLOCKABLE
);
...
...
@@ -147,8 +149,8 @@ asmlinkage int sys_sigaction(int sig, const struct sigaction *act,
asmlinkage
int
sys_sigaltstack
(
nabi_no_regargs
struct
pt_regs
regs
)
{
const
stack_t
*
uss
=
(
const
stack_t
*
)
regs
.
regs
[
4
];
stack_t
*
uoss
=
(
stack_t
*
)
regs
.
regs
[
5
];
const
stack_t
__user
*
uss
=
(
const
stack_t
__user
*
)
regs
.
regs
[
4
];
stack_t
__user
*
uoss
=
(
stack_t
__user
*
)
regs
.
regs
[
5
];
unsigned
long
usp
=
regs
.
regs
[
29
];
return
do_sigaltstack
(
uss
,
uoss
,
usp
);
...
...
arch/mips/kernel/sysirix.c
View file @
fe00f943
...
...
@@ -233,7 +233,7 @@ asmlinkage int irix_prctl(unsigned option, ...)
#undef DEBUG_PROCGRPS
extern
unsigned
long
irix_mapelf
(
int
fd
,
struct
elf_phdr
*
user_phdrp
,
int
cnt
);
extern
unsigned
long
irix_mapelf
(
int
fd
,
struct
elf_phdr
__user
*
user_phdrp
,
int
cnt
);
extern
int
getrusage
(
struct
task_struct
*
p
,
int
who
,
struct
rusage
__user
*
ru
);
extern
char
*
prom_getenv
(
char
*
name
);
extern
long
prom_setenv
(
char
*
name
,
char
*
value
);
...
...
@@ -270,23 +270,19 @@ asmlinkage int irix_syssgi(struct pt_regs *regs)
cmd
=
regs
->
regs
[
base
+
4
];
switch
(
cmd
)
{
case
SGI_SYSID
:
{
char
*
buf
=
(
cha
r
*
)
regs
->
regs
[
base
+
5
];
char
__user
*
buf
=
(
char
__use
r
*
)
regs
->
regs
[
base
+
5
];
/* XXX Use ethernet addr.... */
retval
=
clear_user
(
buf
,
64
);
retval
=
clear_user
(
buf
,
64
)
?
-
EFAULT
:
0
;
break
;
}
#if 0
case SGI_RDNAME: {
int pid = (int) regs->regs[base + 5];
char
*buf = (cha
r *) regs->regs[base + 6];
char
__user *buf = (char __use
r *) regs->regs[base + 6];
struct task_struct *p;
char tcomm[sizeof(current->comm)];
if (!access_ok(VERIFY_WRITE, buf, sizeof(tcomm))) {
retval = -EFAULT;
break;
}
read_lock(&tasklist_lock);
p = find_task_by_pid(pid);
if (!p) {
...
...
@@ -298,34 +294,28 @@ asmlinkage int irix_syssgi(struct pt_regs *regs)
read_unlock(&tasklist_lock);
/* XXX Need to check sizes. */
copy_to_user(buf, tcomm, sizeof(tcomm));
retval = 0;
retval = copy_to_user(buf, tcomm, sizeof(tcomm)) ? -EFAULT : 0;
break;
}
case SGI_GETNVRAM: {
char
*name = (cha
r *) regs->regs[base+5];
char
*buf = (cha
r *) regs->regs[base+6];
char
__user *name = (char __use
r *) regs->regs[base+5];
char
__user *buf = (char __use
r *) regs->regs[base+6];
char *value;
return -EINVAL; /* til I fix it */
if (!access_ok(VERIFY_WRITE, buf, 128)) {
retval = -EFAULT;
break;
}
value = prom_getenv(name); /* PROM lock? */
if (!value) {
retval = -EINVAL;
break;
}
/* Do I strlen() for the length? */
copy_to_user(buf, value, 128);
retval = 0;
retval = copy_to_user(buf, value, 128) ? -EFAULT : 0;
break;
}
case SGI_SETNVRAM: {
char
*name = (cha
r *) regs->regs[base+5];
char
*value = (cha
r *) regs->regs[base+6];
char
__user *name = (char __use
r *) regs->regs[base+5];
char
__user *value = (char __use
r *) regs->regs[base+6];
return -EINVAL; /* til I fix it */
retval = prom_setenv(name, value);
/* XXX make sure retval conforms to syssgi(2) */
...
...
@@ -401,16 +391,16 @@ asmlinkage int irix_syssgi(struct pt_regs *regs)
case
SGI_SETGROUPS
:
retval
=
sys_setgroups
((
int
)
regs
->
regs
[
base
+
5
],
(
gid_t
*
)
regs
->
regs
[
base
+
6
]);
(
gid_t
__user
*
)
regs
->
regs
[
base
+
6
]);
break
;
case
SGI_GETGROUPS
:
retval
=
sys_getgroups
((
int
)
regs
->
regs
[
base
+
5
],
(
gid_t
*
)
regs
->
regs
[
base
+
6
]);
(
gid_t
__user
*
)
regs
->
regs
[
base
+
6
]);
break
;
case
SGI_RUSAGE
:
{
struct
rusage
*
ru
=
(
struct
rusage
*
)
regs
->
regs
[
base
+
6
];
struct
rusage
__user
*
ru
=
(
struct
rusage
__user
*
)
regs
->
regs
[
base
+
6
];
switch
((
int
)
regs
->
regs
[
base
+
5
])
{
case
0
:
...
...
@@ -447,7 +437,7 @@ asmlinkage int irix_syssgi(struct pt_regs *regs)
case
SGI_ELFMAP
:
retval
=
irix_mapelf
((
int
)
regs
->
regs
[
base
+
5
],
(
struct
elf_phdr
*
)
regs
->
regs
[
base
+
6
],
(
struct
elf_phdr
__user
*
)
regs
->
regs
[
base
+
6
],
(
int
)
regs
->
regs
[
base
+
7
]);
break
;
...
...
@@ -462,24 +452,24 @@ asmlinkage int irix_syssgi(struct pt_regs *regs)
case
SGI_PHYSP
:
{
unsigned
long
addr
=
regs
->
regs
[
base
+
5
];
int
*
pageno
=
(
int
*
)
(
regs
->
regs
[
base
+
6
]);
int
__user
*
pageno
=
(
int
__user
*
)
(
regs
->
regs
[
base
+
6
]);
struct
mm_struct
*
mm
=
current
->
mm
;
pgd_t
*
pgdp
;
pud_t
*
pudp
;
pmd_t
*
pmdp
;
pte_t
*
ptep
;
if
(
!
access_ok
(
VERIFY_WRITE
,
pageno
,
sizeof
(
int
)))
return
-
EFAULT
;
down_read
(
&
mm
->
mmap_sem
);
pgdp
=
pgd_offset
(
mm
,
addr
);
pmdp
=
pmd_offset
(
pgdp
,
addr
);
pudp
=
pud_offset
(
pgdp
,
addr
);
pmdp
=
pmd_offset
(
pudp
,
addr
);
ptep
=
pte_offset
(
pmdp
,
addr
);
retval
=
-
EINVAL
;
if
(
ptep
)
{
pte_t
pte
=
*
ptep
;
if
(
pte_val
(
pte
)
&
(
_PAGE_VALID
|
_PAGE_PRESENT
))
{
/* b0rked on 64-bit */
retval
=
put_user
((
pte_val
(
pte
)
&
PAGE_MASK
)
>>
PAGE_SHIFT
,
pageno
);
}
...
...
@@ -490,7 +480,7 @@ asmlinkage int irix_syssgi(struct pt_regs *regs)
case
SGI_INVENT
:
{
int
arg1
=
(
int
)
regs
->
regs
[
base
+
5
];
void
*
buffer
=
(
void
*
)
regs
->
regs
[
base
+
6
];
void
__user
*
buffer
=
(
void
__user
*
)
regs
->
regs
[
base
+
6
];
int
count
=
(
int
)
regs
->
regs
[
base
+
7
];
switch
(
arg1
)
{
...
...
@@ -686,8 +676,8 @@ asmlinkage int irix_pause(void)
}
/* XXX need more than this... */
asmlinkage
int
irix_mount
(
char
*
dev_name
,
char
*
dir_name
,
unsigned
long
flags
,
char
*
type
,
void
*
data
,
int
datalen
)
asmlinkage
int
irix_mount
(
char
__user
*
dev_name
,
char
__user
*
dir_name
,
unsigned
long
flags
,
char
__user
*
type
,
void
__user
*
data
,
int
datalen
)
{
printk
(
"[%s:%d] irix_mount(%p,%p,%08lx,%p,%p,%d)
\n
"
,
current
->
comm
,
current
->
pid
,
...
...
@@ -702,8 +692,8 @@ struct irix_statfs {
char
f_fname
[
6
],
f_fpack
[
6
];
};
asmlinkage
int
irix_statfs
(
const
char
*
path
,
struct
irix_statfs
*
buf
,
int
len
,
int
fs_type
)
asmlinkage
int
irix_statfs
(
const
char
__user
*
path
,
struct
irix_statfs
__user
*
buf
,
int
len
,
int
fs_type
)
{
struct
nameidata
nd
;
struct
kstatfs
kbuf
;
...
...
@@ -718,6 +708,7 @@ asmlinkage int irix_statfs(const char *path, struct irix_statfs *buf,
error
=
-
EFAULT
;
goto
out
;
}
error
=
user_path_walk
(
path
,
&
nd
);
if
(
error
)
goto
out
;
...
...
@@ -726,18 +717,17 @@ asmlinkage int irix_statfs(const char *path, struct irix_statfs *buf,
if
(
error
)
goto
dput_and_out
;
__put_user
(
kbuf
.
f_type
,
&
buf
->
f_type
);
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
error
=
__put_user
(
kbuf
.
f_type
,
&
buf
->
f_type
);
error
|=
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
error
|=
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
error
|=
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
error
|=
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
__put_user
(
0
,
&
buf
->
f_fname
[
i
]);
__put_user
(
0
,
&
buf
->
f_fpack
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_fname
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_fpack
[
i
]);
}
error
=
0
;
dput_and_out:
path_release
(
&
nd
);
...
...
@@ -745,7 +735,7 @@ out:
return
error
;
}
asmlinkage
int
irix_fstatfs
(
unsigned
int
fd
,
struct
irix_statfs
*
buf
)
asmlinkage
int
irix_fstatfs
(
unsigned
int
fd
,
struct
irix_statfs
__user
*
buf
)
{
struct
kstatfs
kbuf
;
struct
file
*
file
;
...
...
@@ -755,6 +745,7 @@ asmlinkage int irix_fstatfs(unsigned int fd, struct irix_statfs *buf)
error
=
-
EFAULT
;
goto
out
;
}
if
(
!
(
file
=
fget
(
fd
)))
{
error
=
-
EBADF
;
goto
out
;
...
...
@@ -764,16 +755,17 @@ asmlinkage int irix_fstatfs(unsigned int fd, struct irix_statfs *buf)
if
(
error
)
goto
out_f
;
__put_user
(
kbuf
.
f_type
,
&
buf
->
f_type
);
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
__put_user
(
0
,
&
buf
->
f_fname
[
i
]);
__put_user
(
0
,
&
buf
->
f_fpack
[
i
]);
error
=
__put_user
(
kbuf
.
f_type
,
&
buf
->
f_type
);
error
|=
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
error
|=
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
error
|=
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
error
|=
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
for
(
i
=
0
;
i
<
6
;
i
++
)
{
error
|=
__put_user
(
0
,
&
buf
->
f_fname
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_fpack
[
i
]);
}
out_f:
...
...
@@ -800,14 +792,15 @@ asmlinkage int irix_setpgrp(int flags)
return
error
;
}
asmlinkage
int
irix_times
(
struct
tms
*
tbuf
)
asmlinkage
int
irix_times
(
struct
tms
__user
*
tbuf
)
{
int
err
=
0
;
if
(
tbuf
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
tbuf
,
sizeof
*
tbuf
))
return
-
EFAULT
;
err
|=
__put_user
(
current
->
utime
,
&
tbuf
->
tms_utime
);
err
=
__put_user
(
current
->
utime
,
&
tbuf
->
tms_utime
);
err
|=
__put_user
(
current
->
stime
,
&
tbuf
->
tms_stime
);
err
|=
__put_user
(
current
->
signal
->
cutime
,
&
tbuf
->
tms_cutime
);
err
|=
__put_user
(
current
->
signal
->
cstime
,
&
tbuf
->
tms_cstime
);
...
...
@@ -823,13 +816,13 @@ asmlinkage int irix_exec(struct pt_regs *regs)
if
(
regs
->
regs
[
2
]
==
1000
)
base
=
1
;
filename
=
getname
((
char
*
)
(
long
)
regs
->
regs
[
base
+
4
]);
filename
=
getname
((
char
__user
*
)
(
long
)
regs
->
regs
[
base
+
4
]);
error
=
PTR_ERR
(
filename
);
if
(
IS_ERR
(
filename
))
return
error
;
error
=
do_execve
(
filename
,
(
char
*
*
)
(
long
)
regs
->
regs
[
base
+
5
],
(
char
**
)
0
,
regs
);
error
=
do_execve
(
filename
,
(
char
__user
*
__user
*
)
(
long
)
regs
->
regs
[
base
+
5
],
NULL
,
regs
);
putname
(
filename
);
return
error
;
...
...
@@ -842,12 +835,12 @@ asmlinkage int irix_exece(struct pt_regs *regs)
if
(
regs
->
regs
[
2
]
==
1000
)
base
=
1
;
filename
=
getname
((
char
*
)
(
long
)
regs
->
regs
[
base
+
4
]);
filename
=
getname
((
char
__user
*
)
(
long
)
regs
->
regs
[
base
+
4
]);
error
=
PTR_ERR
(
filename
);
if
(
IS_ERR
(
filename
))
return
error
;
error
=
do_execve
(
filename
,
(
char
*
*
)
(
long
)
regs
->
regs
[
base
+
5
],
(
char
*
*
)
(
long
)
regs
->
regs
[
base
+
6
],
regs
);
error
=
do_execve
(
filename
,
(
char
__user
*
__user
*
)
(
long
)
regs
->
regs
[
base
+
5
],
(
char
__user
*
__user
*
)
(
long
)
regs
->
regs
[
base
+
6
],
regs
);
putname
(
filename
);
return
error
;
...
...
@@ -903,22 +896,17 @@ asmlinkage int irix_socket(int family, int type, int protocol)
return
sys_socket
(
family
,
type
,
protocol
);
}
asmlinkage
int
irix_getdomainname
(
char
*
name
,
int
len
)
asmlinkage
int
irix_getdomainname
(
char
__user
*
name
,
int
len
)
{
int
error
;
if
(
!
access_ok
(
VERIFY_WRITE
,
name
,
len
))
return
-
EFAULT
;
int
err
;
down_read
(
&
uts_sem
);
if
(
len
>
__NEW_UTS_LEN
)
len
=
__NEW_UTS_LEN
;
error
=
0
;
if
(
copy_to_user
(
name
,
system_utsname
.
domainname
,
len
))
error
=
-
EFAULT
;
err
=
copy_to_user
(
name
,
system_utsname
.
domainname
,
len
)
?
-
EFAULT
:
0
;
up_read
(
&
uts_sem
);
return
err
or
;
return
err
;
}
asmlinkage
unsigned
long
irix_getpagesize
(
void
)
...
...
@@ -934,12 +922,13 @@ asmlinkage int irix_msgsys(int opcode, unsigned long arg0, unsigned long arg1,
case
0
:
return
sys_msgget
((
key_t
)
arg0
,
(
int
)
arg1
);
case
1
:
return
sys_msgctl
((
int
)
arg0
,
(
int
)
arg1
,
(
struct
msqid_ds
*
)
arg2
);
return
sys_msgctl
((
int
)
arg0
,
(
int
)
arg1
,
(
struct
msqid_ds
__user
*
)
arg2
);
case
2
:
return
sys_msgrcv
((
int
)
arg0
,
(
struct
msgbuf
*
)
arg1
,
return
sys_msgrcv
((
int
)
arg0
,
(
struct
msgbuf
__user
*
)
arg1
,
(
size_t
)
arg2
,
(
long
)
arg3
,
(
int
)
arg4
);
case
3
:
return
sys_msgsnd
((
int
)
arg0
,
(
struct
msgbuf
*
)
arg1
,
return
sys_msgsnd
((
int
)
arg0
,
(
struct
msgbuf
__user
*
)
arg1
,
(
size_t
)
arg2
,
(
int
)
arg3
);
default:
return
-
EINVAL
;
...
...
@@ -951,12 +940,13 @@ asmlinkage int irix_shmsys(int opcode, unsigned long arg0, unsigned long arg1,
{
switch
(
opcode
)
{
case
0
:
return
do_shmat
((
int
)
arg0
,
(
char
*
)
arg1
,
(
int
)
arg2
,
return
do_shmat
((
int
)
arg0
,
(
char
__user
*
)
arg1
,
(
int
)
arg2
,
(
unsigned
long
*
)
arg3
);
case
1
:
return
sys_shmctl
((
int
)
arg0
,
(
int
)
arg1
,
(
struct
shmid_ds
*
)
arg2
);
return
sys_shmctl
((
int
)
arg0
,
(
int
)
arg1
,
(
struct
shmid_ds
__user
*
)
arg2
);
case
2
:
return
sys_shmdt
((
char
*
)
arg0
);
return
sys_shmdt
((
char
__user
*
)
arg0
);
case
3
:
return
sys_shmget
((
key_t
)
arg0
,
(
int
)
arg1
,
(
int
)
arg2
);
default:
...
...
@@ -974,7 +964,7 @@ asmlinkage int irix_semsys(int opcode, unsigned long arg0, unsigned long arg1,
case
1
:
return
sys_semget
((
key_t
)
arg0
,
(
int
)
arg1
,
(
int
)
arg2
);
case
2
:
return
sys_semop
((
int
)
arg0
,
(
struct
sembuf
*
)
arg1
,
return
sys_semop
((
int
)
arg0
,
(
struct
sembuf
__user
*
)
arg1
,
(
unsigned
int
)
arg2
);
default:
return
-
EINVAL
;
...
...
@@ -992,15 +982,16 @@ static inline loff_t llseek(struct file *file, loff_t offset, int origin)
lock_kernel
();
retval
=
fn
(
file
,
offset
,
origin
);
unlock_kernel
();
return
retval
;
}
asmlinkage
int
irix_lseek64
(
int
fd
,
int
_unused
,
int
offhi
,
int
offlow
,
int
origin
)
{
int
retval
;
struct
file
*
file
;
loff_t
offset
;
int
retval
;
retval
=
-
EBADF
;
file
=
fget
(
fd
);
...
...
@@ -1025,12 +1016,12 @@ asmlinkage int irix_sginap(int ticks)
return
0
;
}
asmlinkage
int
irix_sgikopt
(
char
*
istring
,
cha
r
*
ostring
,
int
len
)
asmlinkage
int
irix_sgikopt
(
char
__user
*
istring
,
char
__use
r
*
ostring
,
int
len
)
{
return
-
EINVAL
;
}
asmlinkage
int
irix_gettimeofday
(
struct
timeval
*
tv
)
asmlinkage
int
irix_gettimeofday
(
struct
timeval
__user
*
tv
)
{
time_t
sec
;
long
nsec
,
seq
;
...
...
@@ -1071,7 +1062,7 @@ asmlinkage unsigned long irix_mmap32(unsigned long addr, size_t len, int prot,
if
(
max_size
>
file
->
f_dentry
->
d_inode
->
i_size
)
{
old_pos
=
sys_lseek
(
fd
,
max_size
-
1
,
0
);
sys_write
(
fd
,
""
,
1
);
sys_write
(
fd
,
(
void
__user
*
)
""
,
1
);
sys_lseek
(
fd
,
old_pos
,
0
);
}
}
...
...
@@ -1096,7 +1087,7 @@ asmlinkage int irix_madvise(unsigned long addr, int len, int behavior)
return
-
EINVAL
;
}
asmlinkage
int
irix_pagelock
(
char
*
addr
,
int
len
,
int
op
)
asmlinkage
int
irix_pagelock
(
char
__user
*
addr
,
int
len
,
int
op
)
{
printk
(
"[%s:%d] Wheee.. irix_pagelock(%p,%d,%d)
\n
"
,
current
->
comm
,
current
->
pid
,
addr
,
len
,
op
);
...
...
@@ -1136,7 +1127,7 @@ asmlinkage int irix_BSDsetpgrp(int pid, int pgrp)
return
error
;
}
asmlinkage
int
irix_systeminfo
(
int
cmd
,
char
*
buf
,
int
cnt
)
asmlinkage
int
irix_systeminfo
(
int
cmd
,
char
__user
*
buf
,
int
cnt
)
{
printk
(
"[%s:%d] Wheee.. irix_systeminfo(%d,%p,%d)
\n
"
,
current
->
comm
,
current
->
pid
,
cmd
,
buf
,
cnt
);
...
...
@@ -1152,14 +1143,14 @@ struct iuname {
char
_unused3
[
257
],
_unused4
[
257
],
_unused5
[
257
];
};
asmlinkage
int
irix_uname
(
struct
iuname
*
buf
)
asmlinkage
int
irix_uname
(
struct
iuname
__user
*
buf
)
{
down_read
(
&
uts_sem
);
if
(
copy_
to
_user
(
system_utsname
.
sysname
,
buf
->
sysname
,
65
)
||
copy_
to
_user
(
system_utsname
.
nodename
,
buf
->
nodename
,
65
)
||
copy_
to
_user
(
system_utsname
.
release
,
buf
->
release
,
65
)
||
copy_
to
_user
(
system_utsname
.
version
,
buf
->
version
,
65
)
||
copy_
to
_user
(
system_utsname
.
machine
,
buf
->
machine
,
65
))
{
if
(
copy_
from
_user
(
system_utsname
.
sysname
,
buf
->
sysname
,
65
)
||
copy_
from
_user
(
system_utsname
.
nodename
,
buf
->
nodename
,
65
)
||
copy_
from
_user
(
system_utsname
.
release
,
buf
->
release
,
65
)
||
copy_
from
_user
(
system_utsname
.
version
,
buf
->
version
,
65
)
||
copy_
from
_user
(
system_utsname
.
machine
,
buf
->
machine
,
65
))
{
return
-
EFAULT
;
}
up_read
(
&
uts_sem
);
...
...
@@ -1169,7 +1160,7 @@ asmlinkage int irix_uname(struct iuname *buf)
#undef DEBUG_XSTAT
static
int
irix_xstat32_xlate
(
struct
kstat
*
stat
,
void
*
ubuf
)
static
int
irix_xstat32_xlate
(
struct
kstat
*
stat
,
void
__user
*
ubuf
)
{
struct
xstat32
{
u32
st_dev
,
st_pad1
[
3
],
st_ino
,
st_mode
,
st_nlink
,
st_uid
,
st_gid
;
...
...
@@ -1209,7 +1200,7 @@ static int irix_xstat32_xlate(struct kstat *stat, void *ubuf)
return
copy_to_user
(
ubuf
,
&
ub
,
sizeof
(
ub
))
?
-
EFAULT
:
0
;
}
static
int
irix_xstat64_xlate
(
struct
kstat
*
stat
,
void
*
ubuf
)
static
int
irix_xstat64_xlate
(
struct
kstat
*
stat
,
void
__user
*
ubuf
)
{
struct
xstat64
{
u32
st_dev
;
s32
st_pad1
[
3
];
...
...
@@ -1259,7 +1250,7 @@ static int irix_xstat64_xlate(struct kstat *stat, void *ubuf)
return
copy_to_user
(
ubuf
,
&
ks
,
sizeof
(
ks
))
?
-
EFAULT
:
0
;
}
asmlinkage
int
irix_xstat
(
int
version
,
char
*
filename
,
struct
stat
*
statbuf
)
asmlinkage
int
irix_xstat
(
int
version
,
char
__user
*
filename
,
struct
stat
__user
*
statbuf
)
{
int
retval
;
struct
kstat
stat
;
...
...
@@ -1285,7 +1276,7 @@ asmlinkage int irix_xstat(int version, char *filename, struct stat *statbuf)
return
retval
;
}
asmlinkage
int
irix_lxstat
(
int
version
,
char
*
filename
,
struct
stat
*
statbuf
)
asmlinkage
int
irix_lxstat
(
int
version
,
char
__user
*
filename
,
struct
stat
__user
*
statbuf
)
{
int
error
;
struct
kstat
stat
;
...
...
@@ -1312,7 +1303,7 @@ asmlinkage int irix_lxstat(int version, char *filename, struct stat *statbuf)
return
error
;
}
asmlinkage
int
irix_fxstat
(
int
version
,
int
fd
,
struct
stat
*
statbuf
)
asmlinkage
int
irix_fxstat
(
int
version
,
int
fd
,
struct
stat
__user
*
statbuf
)
{
int
error
;
struct
kstat
stat
;
...
...
@@ -1338,7 +1329,7 @@ asmlinkage int irix_fxstat(int version, int fd, struct stat *statbuf)
return
error
;
}
asmlinkage
int
irix_xmknod
(
int
ver
,
char
*
filename
,
int
mode
,
unsigned
dev
)
asmlinkage
int
irix_xmknod
(
int
ver
,
char
__user
*
filename
,
int
mode
,
unsigned
dev
)
{
int
retval
;
printk
(
"[%s:%d] Wheee.. irix_xmknod(%d,%s,%x,%x)
\n
"
,
...
...
@@ -1358,7 +1349,7 @@ asmlinkage int irix_xmknod(int ver, char *filename, int mode, unsigned dev)
return
retval
;
}
asmlinkage
int
irix_swapctl
(
int
cmd
,
char
*
arg
)
asmlinkage
int
irix_swapctl
(
int
cmd
,
char
__user
*
arg
)
{
printk
(
"[%s:%d] Wheee.. irix_swapctl(%d,%p)
\n
"
,
current
->
comm
,
current
->
pid
,
cmd
,
arg
);
...
...
@@ -1374,7 +1365,7 @@ struct irix_statvfs {
char
f_fstr
[
32
];
u32
f_filler
[
16
];
};
asmlinkage
int
irix_statvfs
(
char
*
fname
,
struct
irix_statvfs
*
buf
)
asmlinkage
int
irix_statvfs
(
char
__user
*
fname
,
struct
irix_statvfs
__user
*
buf
)
{
struct
nameidata
nd
;
struct
kstatfs
kbuf
;
...
...
@@ -1382,10 +1373,9 @@ asmlinkage int irix_statvfs(char *fname, struct irix_statvfs *buf)
printk
(
"[%s:%d] Wheee.. irix_statvfs(%s,%p)
\n
"
,
current
->
comm
,
current
->
pid
,
fname
,
buf
);
if
(
!
access_ok
(
VERIFY_WRITE
,
buf
,
sizeof
(
struct
irix_statvfs
)))
{
error
=
-
EFAULT
;
goto
out
;
}
if
(
!
access_ok
(
VERIFY_WRITE
,
buf
,
sizeof
(
struct
irix_statvfs
)))
return
-
EFAULT
;
error
=
user_path_walk
(
fname
,
&
nd
);
if
(
error
)
goto
out
;
...
...
@@ -1393,27 +1383,25 @@ asmlinkage int irix_statvfs(char *fname, struct irix_statvfs *buf)
if
(
error
)
goto
dput_and_out
;
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
error
|=
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
error
|=
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
error
|=
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
error
|=
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
#ifdef __MIPSEB__
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
#else
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
#endif
for
(
i
=
0
;
i
<
16
;
i
++
)
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
__put_user
(
0
,
&
buf
->
f_flag
);
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
error
|=
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_flag
);
error
|=
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
for
(
i
=
0
;
i
<
32
;
i
++
)
__put_user
(
0
,
&
buf
->
f_fstr
[
i
]);
error
=
0
;
error
|=
__put_user
(
0
,
&
buf
->
f_fstr
[
i
]);
dput_and_out:
path_release
(
&
nd
);
...
...
@@ -1421,7 +1409,7 @@ out:
return
error
;
}
asmlinkage
int
irix_fstatvfs
(
int
fd
,
struct
irix_statvfs
*
buf
)
asmlinkage
int
irix_fstatvfs
(
int
fd
,
struct
irix_statvfs
__user
*
buf
)
{
struct
kstatfs
kbuf
;
struct
file
*
file
;
...
...
@@ -1430,10 +1418,9 @@ asmlinkage int irix_fstatvfs(int fd, struct irix_statvfs *buf)
printk
(
"[%s:%d] Wheee.. irix_fstatvfs(%d,%p)
\n
"
,
current
->
comm
,
current
->
pid
,
fd
,
buf
);
if
(
!
access_ok
(
VERIFY_WRITE
,
buf
,
sizeof
(
struct
irix_statvfs
)))
{
error
=
-
EFAULT
;
goto
out
;
}
if
(
!
access_ok
(
VERIFY_WRITE
,
buf
,
sizeof
(
struct
irix_statvfs
)))
return
-
EFAULT
;
if
(
!
(
file
=
fget
(
fd
)))
{
error
=
-
EBADF
;
goto
out
;
...
...
@@ -1442,24 +1429,24 @@ asmlinkage int irix_fstatvfs(int fd, struct irix_statvfs *buf)
if
(
error
)
goto
out_f
;
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
error
=
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
error
|=
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
error
|=
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
error
|=
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
#ifdef __MIPSEB__
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
#else
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
#endif
for
(
i
=
0
;
i
<
16
;
i
++
)
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
__put_user
(
0
,
&
buf
->
f_flag
);
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
__clear_user
(
&
buf
->
f_fstr
,
sizeof
(
buf
->
f_fstr
))
;
error
|=
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_flag
);
error
|=
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
error
|=
__clear_user
(
&
buf
->
f_fstr
,
sizeof
(
buf
->
f_fstr
))
?
-
EFAULT
:
0
;
out_f:
fput
(
file
);
...
...
@@ -1483,7 +1470,7 @@ asmlinkage int irix_sigqueue(int pid, int sig, int code, int val)
return
-
EINVAL
;
}
asmlinkage
int
irix_truncate64
(
char
*
name
,
int
pad
,
int
size1
,
int
size2
)
asmlinkage
int
irix_truncate64
(
char
__user
*
name
,
int
pad
,
int
size1
,
int
size2
)
{
int
retval
;
...
...
@@ -1516,6 +1503,7 @@ asmlinkage int irix_mmap64(struct pt_regs *regs)
int
len
,
prot
,
flags
,
fd
,
off1
,
off2
,
error
,
base
=
0
;
unsigned
long
addr
,
pgoff
,
*
sp
;
struct
file
*
file
=
NULL
;
int
err
;
if
(
regs
->
regs
[
2
]
==
1000
)
base
=
1
;
...
...
@@ -1525,36 +1513,31 @@ asmlinkage int irix_mmap64(struct pt_regs *regs)
prot
=
regs
->
regs
[
base
+
6
];
if
(
!
base
)
{
flags
=
regs
->
regs
[
base
+
7
];
if
(
!
access_ok
(
VERIFY_READ
,
sp
,
(
4
*
sizeof
(
unsigned
long
))))
{
error
=
-
EFAULT
;
goto
out
;
}
if
(
!
access_ok
(
VERIFY_READ
,
sp
,
(
4
*
sizeof
(
unsigned
long
))))
return
-
EFAULT
;
fd
=
sp
[
0
];
__get_user
(
off1
,
&
sp
[
1
]);
__get_user
(
off2
,
&
sp
[
2
]);
err
=
__get_user
(
off1
,
&
sp
[
1
]);
err
|=
__get_user
(
off2
,
&
sp
[
2
]);
}
else
{
if
(
!
access_ok
(
VERIFY_READ
,
sp
,
(
5
*
sizeof
(
unsigned
long
))))
{
error
=
-
EFAULT
;
goto
out
;
}
__get_user
(
flags
,
&
sp
[
0
]);
__get_user
(
fd
,
&
sp
[
1
]);
__get_user
(
off1
,
&
sp
[
2
]);
__get_user
(
off2
,
&
sp
[
3
]);
if
(
!
access_ok
(
VERIFY_READ
,
sp
,
(
5
*
sizeof
(
unsigned
long
))))
return
-
EFAULT
;
err
=
__get_user
(
flags
,
&
sp
[
0
]);
err
|=
__get_user
(
fd
,
&
sp
[
1
]);
err
|=
__get_user
(
off1
,
&
sp
[
2
]);
err
|=
__get_user
(
off2
,
&
sp
[
3
]);
}
if
(
off1
&
PAGE_MASK
)
{
error
=
-
EOVERFLOW
;
goto
out
;
}
if
(
err
)
return
err
;
if
(
off1
&
PAGE_MASK
)
return
-
EOVERFLOW
;
pgoff
=
(
off1
<<
(
32
-
PAGE_SHIFT
))
|
(
off2
>>
PAGE_SHIFT
);
if
(
!
(
flags
&
MAP_ANONYMOUS
))
{
if
(
!
(
file
=
fget
(
fd
)))
{
error
=
-
EBADF
;
goto
out
;
}
if
(
!
(
file
=
fget
(
fd
)))
return
-
EBADF
;
/* Ok, bad taste hack follows, try to think in something else
when reading this */
...
...
@@ -1564,7 +1547,7 @@ asmlinkage int irix_mmap64(struct pt_regs *regs)
if
(
max_size
>
file
->
f_dentry
->
d_inode
->
i_size
)
{
old_pos
=
sys_lseek
(
fd
,
max_size
-
1
,
0
);
sys_write
(
fd
,
""
,
1
);
sys_write
(
fd
,
(
void
__user
*
)
""
,
1
);
sys_lseek
(
fd
,
old_pos
,
0
);
}
}
...
...
@@ -1579,7 +1562,6 @@ asmlinkage int irix_mmap64(struct pt_regs *regs)
if
(
file
)
fput
(
file
);
out:
return
error
;
}
...
...
@@ -1591,7 +1573,7 @@ asmlinkage int irix_dmi(struct pt_regs *regs)
return
-
EINVAL
;
}
asmlinkage
int
irix_pread
(
int
fd
,
char
*
buf
,
int
cnt
,
int
off64
,
asmlinkage
int
irix_pread
(
int
fd
,
char
__user
*
buf
,
int
cnt
,
int
off64
,
int
off1
,
int
off2
)
{
printk
(
"[%s:%d] Wheee.. irix_pread(%d,%p,%d,%d,%d,%d)
\n
"
,
...
...
@@ -1600,7 +1582,7 @@ asmlinkage int irix_pread(int fd, char *buf, int cnt, int off64,
return
-
EINVAL
;
}
asmlinkage
int
irix_pwrite
(
int
fd
,
char
*
buf
,
int
cnt
,
int
off64
,
asmlinkage
int
irix_pwrite
(
int
fd
,
char
__user
*
buf
,
int
cnt
,
int
off64
,
int
off1
,
int
off2
)
{
printk
(
"[%s:%d] Wheee.. irix_pwrite(%d,%p,%d,%d,%d,%d)
\n
"
,
...
...
@@ -1632,7 +1614,7 @@ struct irix_statvfs64 {
u32
f_filler
[
16
];
};
asmlinkage
int
irix_statvfs64
(
char
*
fname
,
struct
irix_statvfs64
*
buf
)
asmlinkage
int
irix_statvfs64
(
char
__user
*
fname
,
struct
irix_statvfs64
__user
*
buf
)
{
struct
nameidata
nd
;
struct
kstatfs
kbuf
;
...
...
@@ -1644,6 +1626,7 @@ asmlinkage int irix_statvfs64(char *fname, struct irix_statvfs64 *buf)
error
=
-
EFAULT
;
goto
out
;
}
error
=
user_path_walk
(
fname
,
&
nd
);
if
(
error
)
goto
out
;
...
...
@@ -1651,27 +1634,25 @@ asmlinkage int irix_statvfs64(char *fname, struct irix_statvfs64 *buf)
if
(
error
)
goto
dput_and_out
;
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
error
=
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
error
|=
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
error
|=
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
error
|=
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
#ifdef __MIPSEB__
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
#else
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
#endif
for
(
i
=
0
;
i
<
16
;
i
++
)
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
__put_user
(
0
,
&
buf
->
f_flag
);
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
error
|=
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_flag
);
error
|=
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
for
(
i
=
0
;
i
<
32
;
i
++
)
__put_user
(
0
,
&
buf
->
f_fstr
[
i
]);
error
=
0
;
error
|=
__put_user
(
0
,
&
buf
->
f_fstr
[
i
]);
dput_and_out:
path_release
(
&
nd
);
...
...
@@ -1679,7 +1660,7 @@ out:
return
error
;
}
asmlinkage
int
irix_fstatvfs64
(
int
fd
,
struct
irix_statvfs
*
buf
)
asmlinkage
int
irix_fstatvfs64
(
int
fd
,
struct
irix_statvfs
__user
*
buf
)
{
struct
kstatfs
kbuf
;
struct
file
*
file
;
...
...
@@ -1700,24 +1681,24 @@ asmlinkage int irix_fstatvfs64(int fd, struct irix_statvfs *buf)
if
(
error
)
goto
out_f
;
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
error
=
__put_user
(
kbuf
.
f_bsize
,
&
buf
->
f_bsize
);
error
|=
__put_user
(
kbuf
.
f_frsize
,
&
buf
->
f_frsize
);
error
|=
__put_user
(
kbuf
.
f_blocks
,
&
buf
->
f_blocks
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bfree
);
error
|=
__put_user
(
kbuf
.
f_bfree
,
&
buf
->
f_bavail
);
/* XXX hackety hack... */
error
|=
__put_user
(
kbuf
.
f_files
,
&
buf
->
f_files
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_ffree
);
error
|=
__put_user
(
kbuf
.
f_ffree
,
&
buf
->
f_favail
);
/* XXX hackety hack... */
#ifdef __MIPSEB__
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
1
],
&
buf
->
f_fsid
);
#else
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
error
|=
__put_user
(
kbuf
.
f_fsid
.
val
[
0
],
&
buf
->
f_fsid
);
#endif
for
(
i
=
0
;
i
<
16
;
i
++
)
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
__put_user
(
0
,
&
buf
->
f_flag
);
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
__clear_user
(
buf
->
f_fstr
,
sizeof
(
buf
->
f_fstr
[
i
]))
;
error
|=
__put_user
(
0
,
&
buf
->
f_basetype
[
i
]);
error
|=
__put_user
(
0
,
&
buf
->
f_flag
);
error
|=
__put_user
(
kbuf
.
f_namelen
,
&
buf
->
f_namemax
);
error
|=
__clear_user
(
buf
->
f_fstr
,
sizeof
(
buf
->
f_fstr
[
i
]))
?
-
EFAULT
:
0
;
out_f:
fput
(
file
);
...
...
@@ -1725,9 +1706,9 @@ out:
return
error
;
}
asmlinkage
int
irix_getmountid
(
char
*
fname
,
unsigned
long
*
midbuf
)
asmlinkage
int
irix_getmountid
(
char
__user
*
fname
,
unsigned
long
__user
*
midbuf
)
{
int
err
=
0
;
int
err
;
printk
(
"[%s:%d] irix_getmountid(%s, %p)
\n
"
,
current
->
comm
,
current
->
pid
,
fname
,
midbuf
);
...
...
@@ -1740,7 +1721,7 @@ asmlinkage int irix_getmountid(char *fname, unsigned long *midbuf)
* fsid of the filesystem to try and make the right decision, but
* we don't have this so for now. XXX
*/
err
|
=
__put_user
(
0
,
&
midbuf
[
0
]);
err
=
__put_user
(
0
,
&
midbuf
[
0
]);
err
|=
__put_user
(
0
,
&
midbuf
[
1
]);
err
|=
__put_user
(
0
,
&
midbuf
[
2
]);
err
|=
__put_user
(
0
,
&
midbuf
[
3
]);
...
...
@@ -1767,8 +1748,8 @@ struct irix_dirent32 {
};
struct
irix_dirent32_callback
{
struct
irix_dirent32
*
current_dir
;
struct
irix_dirent32
*
previous
;
struct
irix_dirent32
__user
*
current_dir
;
struct
irix_dirent32
__user
*
previous
;
int
count
;
int
error
;
};
...
...
@@ -1776,13 +1757,13 @@ struct irix_dirent32_callback {
#define NAME_OFFSET32(de) ((int) ((de)->d_name - (char *) (de)))
#define ROUND_UP32(x) (((x)+sizeof(u32)-1) & ~(sizeof(u32)-1))
static
int
irix_filldir32
(
void
*
__buf
,
const
char
*
name
,
int
namlen
,
loff_t
offset
,
ino_t
ino
,
unsigned
int
d_type
)
static
int
irix_filldir32
(
void
*
__buf
,
const
char
*
name
,
int
namlen
,
loff_t
offset
,
ino_t
ino
,
unsigned
int
d_type
)
{
struct
irix_dirent32
*
dirent
;
struct
irix_dirent32_callback
*
buf
=
(
struct
irix_dirent32_callback
*
)
__buf
;
struct
irix_dirent32
__user
*
dirent
;
struct
irix_dirent32_callback
*
buf
=
__buf
;
unsigned
short
reclen
=
ROUND_UP32
(
NAME_OFFSET32
(
dirent
)
+
namlen
+
1
);
int
err
=
0
;
#ifdef DEBUG_GETDENTS
printk
(
"
\n
irix_filldir32[reclen<%d>namlen<%d>count<%d>]"
,
...
...
@@ -1793,25 +1774,26 @@ static int irix_filldir32(void *__buf, const char *name, int namlen,
return
-
EINVAL
;
dirent
=
buf
->
previous
;
if
(
dirent
)
__put_user
(
offset
,
&
dirent
->
d_off
);
err
=
__put_user
(
offset
,
&
dirent
->
d_off
);
dirent
=
buf
->
current_dir
;
buf
->
previous
=
dirent
;
__put_user
(
ino
,
&
dirent
->
d_ino
);
__put_user
(
reclen
,
&
dirent
->
d_reclen
);
copy_to_user
(
dirent
->
d_name
,
name
,
namlen
);
__put_user
(
0
,
&
dirent
->
d_name
[
namlen
]);
((
char
*
)
dirent
)
+=
reclen
;
err
|=
__put_user
(
dirent
,
&
buf
->
previous
);
err
|=
__put_user
(
ino
,
&
dirent
->
d_ino
);
err
|=
__put_user
(
reclen
,
&
dirent
->
d_reclen
);
err
|=
copy_to_user
((
char
__user
*
)
dirent
->
d_name
,
name
,
namlen
)
?
-
EFAULT
:
0
;
err
|=
__put_user
(
0
,
&
dirent
->
d_name
[
namlen
]);
dirent
=
(
struct
irix_dirent32
__user
*
)
((
char
__user
*
)
dirent
+
reclen
);
buf
->
current_dir
=
dirent
;
buf
->
count
-=
reclen
;
return
0
;
return
err
;
}
asmlinkage
int
irix_ngetdents
(
unsigned
int
fd
,
void
*
dirent
,
unsigned
int
count
,
int
*
eob
)
asmlinkage
int
irix_ngetdents
(
unsigned
int
fd
,
void
__user
*
dirent
,
unsigned
int
count
,
int
__user
*
eob
)
{
struct
file
*
file
;
struct
irix_dirent32
*
lastdirent
;
struct
irix_dirent32
__user
*
lastdirent
;
struct
irix_dirent32_callback
buf
;
int
error
;
...
...
@@ -1824,7 +1806,7 @@ asmlinkage int irix_ngetdents(unsigned int fd, void * dirent,
if
(
!
file
)
goto
out
;
buf
.
current_dir
=
(
struct
irix_dirent32
*
)
dirent
;
buf
.
current_dir
=
(
struct
irix_dirent32
__user
*
)
dirent
;
buf
.
previous
=
NULL
;
buf
.
count
=
count
;
buf
.
error
=
0
;
...
...
@@ -1864,8 +1846,8 @@ struct irix_dirent64 {
};
struct
irix_dirent64_callback
{
struct
irix_dirent64
*
curr
;
struct
irix_dirent64
*
previous
;
struct
irix_dirent64
__user
*
curr
;
struct
irix_dirent64
__user
*
previous
;
int
count
;
int
error
;
};
...
...
@@ -1873,37 +1855,44 @@ struct irix_dirent64_callback {
#define NAME_OFFSET64(de) ((int) ((de)->d_name - (char *) (de)))
#define ROUND_UP64(x) (((x)+sizeof(u64)-1) & ~(sizeof(u64)-1))
static
int
irix_filldir64
(
void
*
__buf
,
const
char
*
name
,
int
namlen
,
loff_t
offset
,
ino_t
ino
,
unsigned
int
d_type
)
static
int
irix_filldir64
(
void
*
__buf
,
const
char
*
name
,
int
namlen
,
loff_t
offset
,
ino_t
ino
,
unsigned
int
d_type
)
{
struct
irix_dirent64
*
dirent
;
struct
irix_dirent64_callback
*
buf
=
(
struct
irix_dirent64_callback
*
)
__buf
;
struct
irix_dirent64
__user
*
dirent
;
struct
irix_dirent64_callback
*
buf
=
__buf
;
unsigned
short
reclen
=
ROUND_UP64
(
NAME_OFFSET64
(
dirent
)
+
namlen
+
1
);
int
err
=
0
;
buf
->
error
=
-
EINVAL
;
/* only used if we fail.. */
if
(
!
access_ok
(
VERIFY_WRITE
,
buf
,
sizeof
(
*
buf
)))
return
-
EFAULT
;
if
(
__put_user
(
-
EINVAL
,
&
buf
->
error
))
/* only used if we fail.. */
return
-
EFAULT
;
if
(
reclen
>
buf
->
count
)
return
-
EINVAL
;
dirent
=
buf
->
previous
;
if
(
dirent
)
__put_user
(
offset
,
&
dirent
->
d_off
);
err
=
__put_user
(
offset
,
&
dirent
->
d_off
);
dirent
=
buf
->
curr
;
buf
->
previous
=
dirent
;
__put_user
(
ino
,
&
dirent
->
d_ino
);
__put_user
(
reclen
,
&
dirent
->
d_reclen
);
__copy_to_user
(
dirent
->
d_name
,
name
,
namlen
);
__put_user
(
0
,
&
dirent
->
d_name
[
namlen
]);
((
char
*
)
dirent
)
+=
reclen
;
err
|=
__put_user
(
ino
,
&
dirent
->
d_ino
);
err
|=
__put_user
(
reclen
,
&
dirent
->
d_reclen
);
err
|=
__copy_to_user
((
char
__user
*
)
dirent
->
d_name
,
name
,
namlen
)
?
-
EFAULT
:
0
;
err
|=
__put_user
(
0
,
&
dirent
->
d_name
[
namlen
]);
dirent
=
(
struct
irix_dirent64
__user
*
)
((
char
__user
*
)
dirent
+
reclen
);
buf
->
curr
=
dirent
;
buf
->
count
-=
reclen
;
return
0
;
return
err
;
}
asmlinkage
int
irix_getdents64
(
int
fd
,
void
*
dirent
,
int
cnt
)
asmlinkage
int
irix_getdents64
(
int
fd
,
void
__user
*
dirent
,
int
cnt
)
{
struct
file
*
file
;
struct
irix_dirent64
*
lastdirent
;
struct
irix_dirent64
__user
*
lastdirent
;
struct
irix_dirent64_callback
buf
;
int
error
;
...
...
@@ -1923,7 +1912,7 @@ asmlinkage int irix_getdents64(int fd, void *dirent, int cnt)
if
(
cnt
<
(
sizeof
(
struct
irix_dirent64
)
+
255
))
goto
out_f
;
buf
.
curr
=
(
struct
irix_dirent64
*
)
dirent
;
buf
.
curr
=
(
struct
irix_dirent64
__user
*
)
dirent
;
buf
.
previous
=
NULL
;
buf
.
count
=
cnt
;
buf
.
error
=
0
;
...
...
@@ -1935,7 +1924,8 @@ asmlinkage int irix_getdents64(int fd, void *dirent, int cnt)
error
=
buf
.
error
;
goto
out_f
;
}
lastdirent
->
d_off
=
(
u64
)
file
->
f_pos
;
if
(
put_user
(
file
->
f_pos
,
&
lastdirent
->
d_off
))
return
-
EFAULT
;
#ifdef DEBUG_GETDENTS
printk
(
"returning %d
\n
"
,
cnt
-
buf
.
count
);
#endif
...
...
@@ -1947,10 +1937,10 @@ out:
return
error
;
}
asmlinkage
int
irix_ngetdents64
(
int
fd
,
void
*
dirent
,
int
cnt
,
int
*
eob
)
asmlinkage
int
irix_ngetdents64
(
int
fd
,
void
__user
*
dirent
,
int
cnt
,
int
*
eob
)
{
struct
file
*
file
;
struct
irix_dirent64
*
lastdirent
;
struct
irix_dirent64
__user
*
lastdirent
;
struct
irix_dirent64_callback
buf
;
int
error
;
...
...
@@ -1972,7 +1962,7 @@ asmlinkage int irix_ngetdents64(int fd, void *dirent, int cnt, int *eob)
goto
out_f
;
*
eob
=
0
;
buf
.
curr
=
(
struct
irix_dirent64
*
)
dirent
;
buf
.
curr
=
(
struct
irix_dirent64
__user
*
)
dirent
;
buf
.
previous
=
NULL
;
buf
.
count
=
cnt
;
buf
.
error
=
0
;
...
...
@@ -1984,7 +1974,8 @@ asmlinkage int irix_ngetdents64(int fd, void *dirent, int cnt, int *eob)
error
=
buf
.
error
;
goto
out_f
;
}
lastdirent
->
d_off
=
(
u64
)
file
->
f_pos
;
if
(
put_user
(
file
->
f_pos
,
&
lastdirent
->
d_off
))
return
-
EFAULT
;
#ifdef DEBUG_GETDENTS
printk
(
"eob=%d returning %d
\n
"
,
*
eob
,
cnt
-
buf
.
count
);
#endif
...
...
@@ -2047,14 +2038,14 @@ out:
return
retval
;
}
asmlinkage
int
irix_utssys
(
char
*
inbuf
,
int
arg
,
int
type
,
cha
r
*
outbuf
)
asmlinkage
int
irix_utssys
(
char
__user
*
inbuf
,
int
arg
,
int
type
,
char
__use
r
*
outbuf
)
{
int
retval
;
switch
(
type
)
{
case
0
:
/* uname() */
retval
=
irix_uname
((
struct
iuname
*
)
inbuf
);
retval
=
irix_uname
((
struct
iuname
__user
*
)
inbuf
);
goto
out
;
case
2
:
...
...
arch/mips/kernel/traps.c
View file @
fe00f943
...
...
@@ -339,9 +339,9 @@ asmlinkage void do_be(struct pt_regs *regs)
static
inline
int
get_insn_opcode
(
struct
pt_regs
*
regs
,
unsigned
int
*
opcode
)
{
unsigned
int
*
epc
;
unsigned
int
__user
*
epc
;
epc
=
(
unsigned
int
*
)
regs
->
cp0_epc
+
epc
=
(
unsigned
int
__user
*
)
regs
->
cp0_epc
+
((
regs
->
cp0_cause
&
CAUSEF_BD
)
!=
0
);
if
(
!
get_user
(
*
opcode
,
epc
))
return
0
;
...
...
@@ -371,7 +371,7 @@ static struct task_struct *ll_task = NULL;
static
inline
void
simulate_ll
(
struct
pt_regs
*
regs
,
unsigned
int
opcode
)
{
unsigned
long
value
,
*
vaddr
;
unsigned
long
value
,
__user
*
vaddr
;
long
offset
;
int
signal
=
0
;
...
...
@@ -385,7 +385,8 @@ static inline void simulate_ll(struct pt_regs *regs, unsigned int opcode)
offset
<<=
16
;
offset
>>=
16
;
vaddr
=
(
unsigned
long
*
)((
long
)(
regs
->
regs
[(
opcode
&
BASE
)
>>
21
])
+
offset
);
vaddr
=
(
unsigned
long
__user
*
)
((
unsigned
long
)(
regs
->
regs
[(
opcode
&
BASE
)
>>
21
])
+
offset
);
if
((
unsigned
long
)
vaddr
&
3
)
{
signal
=
SIGBUS
;
...
...
@@ -418,7 +419,8 @@ sig:
static
inline
void
simulate_sc
(
struct
pt_regs
*
regs
,
unsigned
int
opcode
)
{
unsigned
long
*
vaddr
,
reg
;
unsigned
long
__user
*
vaddr
;
unsigned
long
reg
;
long
offset
;
int
signal
=
0
;
...
...
@@ -432,7 +434,8 @@ static inline void simulate_sc(struct pt_regs *regs, unsigned int opcode)
offset
<<=
16
;
offset
>>=
16
;
vaddr
=
(
unsigned
long
*
)((
long
)(
regs
->
regs
[(
opcode
&
BASE
)
>>
21
])
+
offset
);
vaddr
=
(
unsigned
long
__user
*
)
((
unsigned
long
)(
regs
->
regs
[(
opcode
&
BASE
)
>>
21
])
+
offset
);
reg
=
(
opcode
&
RT
)
>>
16
;
if
((
unsigned
long
)
vaddr
&
3
)
{
...
...
@@ -498,7 +501,7 @@ asmlinkage void do_ov(struct pt_regs *regs)
info
.
si_code
=
FPE_INTOVF
;
info
.
si_signo
=
SIGFPE
;
info
.
si_errno
=
0
;
info
.
si_addr
=
(
void
*
)
regs
->
cp0_epc
;
info
.
si_addr
=
(
void
__user
*
)
regs
->
cp0_epc
;
force_sig_info
(
SIGFPE
,
&
info
,
current
);
}
...
...
@@ -584,7 +587,7 @@ asmlinkage void do_bp(struct pt_regs *regs)
info
.
si_code
=
FPE_INTOVF
;
info
.
si_signo
=
SIGFPE
;
info
.
si_errno
=
0
;
info
.
si_addr
=
(
void
*
)
regs
->
cp0_epc
;
info
.
si_addr
=
(
void
__user
*
)
regs
->
cp0_epc
;
force_sig_info
(
SIGFPE
,
&
info
,
current
);
break
;
default:
...
...
@@ -621,7 +624,7 @@ asmlinkage void do_tr(struct pt_regs *regs)
info
.
si_code
=
FPE_INTOVF
;
info
.
si_signo
=
SIGFPE
;
info
.
si_errno
=
0
;
info
.
si_addr
=
(
void
*
)
regs
->
cp0_epc
;
info
.
si_addr
=
(
void
__user
*
)
regs
->
cp0_epc
;
force_sig_info
(
SIGFPE
,
&
info
,
current
);
break
;
default:
...
...
arch/mips/kernel/unaligned.c
View file @
fe00f943
...
...
@@ -94,7 +94,7 @@ unsigned long unaligned_instructions;
#endif
static
inline
int
emulate_load_store_insn
(
struct
pt_regs
*
regs
,
void
*
addr
,
unsigned
long
pc
,
void
__user
*
addr
,
unsigned
int
__user
*
pc
,
unsigned
long
**
regptr
,
unsigned
long
*
newvalue
)
{
union
mips_instruction
insn
;
...
...
@@ -107,7 +107,7 @@ static inline int emulate_load_store_insn(struct pt_regs *regs,
/*
* This load never faults.
*/
__get_user
(
insn
.
word
,
(
unsigned
int
*
)
pc
);
__get_user
(
insn
.
word
,
pc
);
switch
(
insn
.
i_format
.
opcode
)
{
/*
...
...
@@ -494,8 +494,8 @@ asmlinkage void do_ade(struct pt_regs *regs)
{
unsigned
long
*
regptr
,
newval
;
extern
int
do_dsemulret
(
struct
pt_regs
*
);
unsigned
int
__user
*
pc
;
mm_segment_t
seg
;
unsigned
long
pc
;
/*
* Address errors may be deliberately induced by the FPU emulator to
...
...
@@ -515,7 +515,7 @@ asmlinkage void do_ade(struct pt_regs *regs)
if
((
regs
->
cp0_badvaddr
==
regs
->
cp0_epc
)
||
(
regs
->
cp0_epc
&
0x1
))
goto
sigbus
;
pc
=
exception_epc
(
regs
);
pc
=
(
unsigned
int
__user
*
)
exception_epc
(
regs
);
if
((
current
->
thread
.
mflags
&
MF_FIXADE
)
==
0
)
goto
sigbus
;
...
...
@@ -526,7 +526,7 @@ asmlinkage void do_ade(struct pt_regs *regs)
seg
=
get_fs
();
if
(
!
user_mode
(
regs
))
set_fs
(
KERNEL_DS
);
if
(
!
emulate_load_store_insn
(
regs
,
(
void
*
)
regs
->
cp0_badvaddr
,
pc
,
if
(
!
emulate_load_store_insn
(
regs
,
(
void
__user
*
)
regs
->
cp0_badvaddr
,
pc
,
&
regptr
,
&
newval
))
{
compute_return_epc
(
regs
);
/*
...
...
arch/mips/lib/csum_partial_copy.c
View file @
fe00f943
...
...
@@ -33,7 +33,7 @@ unsigned int csum_partial_copy_nocheck(const unsigned char *src,
* Copy from userspace and compute checksum. If we catch an exception
* then zero the rest of the buffer.
*/
unsigned
int
csum_partial_copy_from_user
(
const
unsigned
char
*
src
,
unsigned
int
csum_partial_copy_from_user
(
const
unsigned
char
__user
*
src
,
unsigned
char
*
dst
,
int
len
,
unsigned
int
sum
,
int
*
err_ptr
)
{
int
missing
;
...
...
arch/mips/mm/c-r4k.c
View file @
fe00f943
...
...
@@ -456,8 +456,8 @@ static void r4k_flush_data_cache_page(unsigned long addr)
}
struct
flush_icache_range_args
{
unsigned
long
start
;
unsigned
long
end
;
unsigned
long
__user
start
;
unsigned
long
__user
end
;
};
static
inline
void
local_r4k_flush_icache_range
(
void
*
args
)
...
...
@@ -519,7 +519,8 @@ static inline void local_r4k_flush_icache_range(void *args)
}
}
static
void
r4k_flush_icache_range
(
unsigned
long
start
,
unsigned
long
end
)
static
void
r4k_flush_icache_range
(
unsigned
long
__user
start
,
unsigned
long
__user
end
)
{
struct
flush_icache_range_args
args
;
...
...
arch/mips/mm/cache.c
View file @
fe00f943
...
...
@@ -24,7 +24,8 @@ void (*flush_cache_mm)(struct mm_struct *mm);
void
(
*
flush_cache_range
)(
struct
vm_area_struct
*
vma
,
unsigned
long
start
,
unsigned
long
end
);
void
(
*
flush_cache_page
)(
struct
vm_area_struct
*
vma
,
unsigned
long
page
,
unsigned
long
pfn
);
void
(
*
flush_icache_range
)(
unsigned
long
start
,
unsigned
long
end
);
void
(
*
flush_icache_range
)(
unsigned
long
__user
start
,
unsigned
long
__user
end
);
void
(
*
flush_icache_page
)(
struct
vm_area_struct
*
vma
,
struct
page
*
page
);
/* MIPS specific cache operations */
...
...
@@ -49,10 +50,10 @@ EXPORT_SYMBOL(_dma_cache_inv);
* We could optimize the case where the cache argument is not BCACHE but
* that seems very atypical use ...
*/
asmlinkage
int
sys_cacheflush
(
unsigned
long
addr
,
unsigned
long
int
bytes
,
unsigned
int
cache
)
asmlinkage
int
sys_cacheflush
(
unsigned
long
__user
addr
,
unsigned
long
bytes
,
unsigned
int
cache
)
{
if
(
!
access_ok
(
VERIFY_WRITE
,
(
void
*
)
addr
,
bytes
))
if
(
!
access_ok
(
VERIFY_WRITE
,
(
void
__user
*
)
addr
,
bytes
))
return
-
EFAULT
;
flush_icache_range
(
addr
,
addr
+
bytes
);
...
...
arch/mips/mm/fault.c
View file @
fe00f943
...
...
@@ -141,7 +141,7 @@ bad_area_nosemaphore:
info
.
si_signo
=
SIGSEGV
;
info
.
si_errno
=
0
;
/* info.si_code has been set above */
info
.
si_addr
=
(
void
*
)
address
;
info
.
si_addr
=
(
void
__user
*
)
address
;
force_sig_info
(
SIGSEGV
,
&
info
,
tsk
);
return
;
}
...
...
@@ -197,7 +197,7 @@ do_sigbus:
info
.
si_signo
=
SIGBUS
;
info
.
si_errno
=
0
;
info
.
si_code
=
BUS_ADRERR
;
info
.
si_addr
=
(
void
*
)
address
;
info
.
si_addr
=
(
void
__user
*
)
address
;
force_sig_info
(
SIGBUS
,
&
info
,
tsk
);
return
;
...
...
include/asm-mips/cacheflush.h
View file @
fe00f943
...
...
@@ -49,7 +49,8 @@ static inline void flush_dcache_page(struct page *page)
extern
void
(
*
flush_icache_page
)(
struct
vm_area_struct
*
vma
,
struct
page
*
page
);
extern
void
(
*
flush_icache_range
)(
unsigned
long
start
,
unsigned
long
end
);
extern
void
(
*
flush_icache_range
)(
unsigned
long
__user
start
,
unsigned
long
__user
end
);
#define flush_cache_vmap(start, end) flush_cache_all()
#define flush_cache_vunmap(start, end) flush_cache_all()
...
...
include/asm-mips/checksum.h
View file @
fe00f943
...
...
@@ -34,8 +34,9 @@ unsigned int csum_partial(const unsigned char *buff, int len, unsigned int sum);
* this is a new version of the above that records errors it finds in *errp,
* but continues and zeros the rest of the buffer.
*/
unsigned
int
csum_partial_copy_from_user
(
const
unsigned
char
*
src
,
unsigned
char
*
dst
,
int
len
,
unsigned
int
sum
,
int
*
errp
);
unsigned
int
csum_partial_copy_from_user
(
const
unsigned
char
__user
*
src
,
unsigned
char
*
dst
,
int
len
,
unsigned
int
sum
,
int
*
errp
);
/*
* Copy and checksum to user
...
...
include/asm-mips/io.h
View file @
fe00f943
...
...
@@ -25,6 +25,7 @@
#include <asm/page.h>
#include <asm/pgtable-bits.h>
#include <asm/processor.h>
#include <asm/string.h>
#include <mangle-port.h>
...
...
@@ -217,7 +218,7 @@ static inline void __iomem * __ioremap_mode(phys_t offset, unsigned long size,
*/
if
(
flags
==
_CACHE_UNCACHED
)
base
=
(
u64
)
IO_BASE
;
return
(
void
*
)
(
unsigned
long
)
(
base
+
offset
);
return
(
void
__iomem
*
)
(
unsigned
long
)
(
base
+
offset
);
}
return
__ioremap
(
offset
,
size
,
flags
);
...
...
@@ -486,9 +487,18 @@ BUILDSTRING(q, u64)
/* Depends on MIPS II instruction set */
#define mmiowb() asm volatile ("sync" ::: "memory")
#define memset_io(a,b,c) memset((void *)(a),(b),(c))
#define memcpy_fromio(a,b,c) memcpy((a),(void *)(b),(c))
#define memcpy_toio(a,b,c) memcpy((void *)(a),(b),(c))
static
inline
void
memset_io
(
volatile
void
__iomem
*
addr
,
unsigned
char
val
,
int
count
)
{
memset
((
void
__force
*
)
addr
,
val
,
count
);
}
static
inline
void
memcpy_fromio
(
void
*
dst
,
const
volatile
void
__iomem
*
src
,
int
count
)
{
memcpy
(
dst
,
(
void
__force
*
)
src
,
count
);
}
static
inline
void
memcpy_toio
(
volatile
void
__iomem
*
dst
,
const
void
*
src
,
int
count
)
{
memcpy
((
void
__force
*
)
dst
,
src
,
count
);
}
/*
* Memory Mapped I/O
...
...
include/asm-mips/irq.h
View file @
fe00f943
...
...
@@ -24,11 +24,9 @@ static inline int irq_canonicalize(int irq)
struct
pt_regs
;
#ifdef CONFIG_PREEMPT
extern
asmlinkage
unsigned
int
do_IRQ
(
unsigned
int
irq
,
struct
pt_regs
*
regs
);
#
else
#
ifdef CONFIG_PREEMPT
/*
* do_IRQ handles all normal device IRQ's (the special
...
...
include/asm-mips/sibyte/sb1250.h
View file @
fe00f943
...
...
@@ -58,6 +58,6 @@ extern void prom_printf(char *fmt, ...);
#endif
#define IOADDR(a) ((vo
id
*)(IO_BASE + (a)))
#define IOADDR(a) ((vo
latile void __iomem
*)(IO_BASE + (a)))
#endif
include/asm-mips/uaccess.h
View file @
fe00f943
...
...
@@ -196,63 +196,56 @@
__get_user_nocheck((x),(ptr),sizeof(*(ptr)))
struct
__large_struct
{
unsigned
long
buf
[
100
];
};
#define __m(x) (*(struct __large_struct *)(x))
#define __m(x) (*(struct __large_struct
__user
*)(x))
/*
* Yuck. We need two variants, one for 64bit operation and one
* for 32 bit mode and old iron.
*/
#ifdef __mips64
#define __GET_USER_DW(
__gu_err) __get_user_asm("ld", __gu_er
r)
#define __GET_USER_DW(
ptr) __get_user_asm("ld", pt
r)
#else
#define __GET_USER_DW(
__gu_err) __get_user_asm_ll32(__gu_er
r)
#define __GET_USER_DW(
ptr) __get_user_asm_ll32(pt
r)
#endif
#define __get_user_nocheck(x,ptr,size) \
({ \
__typeof(*(ptr)) __gu_val = 0; \
long __gu_addr; \
__typeof(*(ptr)) __gu_val = (__typeof(*(ptr))) 0; \
long __gu_err = 0; \
\
might_sleep(); \
__gu_addr = (long) (ptr); \
switch (size) { \
case 1: __get_user_asm("lb",
__gu_er
r); break; \
case 2: __get_user_asm("lh",
__gu_er
r); break; \
case 4: __get_user_asm("lw",
__gu_er
r); break; \
case 8: __GET_USER_DW(
__gu_er
r); break; \
case 1: __get_user_asm("lb",
pt
r); break; \
case 2: __get_user_asm("lh",
pt
r); break; \
case 4: __get_user_asm("lw",
pt
r); break; \
case 8: __GET_USER_DW(
pt
r); break; \
default: __get_user_unknown(); break; \
} \
x
= (__typeof__(*(ptr))) __gu_val; \
(x)
= (__typeof__(*(ptr))) __gu_val; \
__gu_err; \
})
#define __get_user_check(x,ptr,size) \
({ \
const __typeof__(*(ptr)) __user * __gu_addr = (ptr); \
__typeof__(*(ptr)) __gu_val = 0; \
long __gu_addr; \
long __gu_err; \
long __gu_err = -EFAULT; \
\
might_sleep(); \
__gu_addr = (long) (ptr); \
__gu_err = access_ok(VERIFY_READ, (void *) __gu_addr, size) \
? 0 : -EFAULT; \
\
if (likely(!__gu_err)) { \
if (likely(access_ok(VERIFY_READ, __gu_addr, size))) { \
switch (size) { \
case 1: __get_user_asm("lb", __gu_
er
r); break; \
case 2: __get_user_asm("lh", __gu_
er
r); break; \
case 4: __get_user_asm("lw", __gu_
er
r); break; \
case 8: __GET_USER_DW(__gu_
err); break;
\
case 1: __get_user_asm("lb", __gu_
add
r); break; \
case 2: __get_user_asm("lh", __gu_
add
r); break; \
case 4: __get_user_asm("lw", __gu_
add
r); break; \
case 8: __GET_USER_DW(__gu_
addr); break;
\
default: __get_user_unknown(); break; \
} \
} \
x
= (__typeof__(*(ptr))) __gu_val; \
(x)
= (__typeof__(*(ptr))) __gu_val; \
__gu_err; \
})
#define __get_user_asm(insn,
__gu_er
r) \
(
{ \
#define __get_user_asm(insn,
add
r) \
{ \
__asm__ __volatile__( \
"1: " insn " %1, %3 \n" \
"2: \n" \
...
...
@@ -264,20 +257,20 @@ struct __large_struct { unsigned long buf[100]; };
" "__UA_ADDR "\t1b, 3b \n" \
" .previous \n" \
: "=r" (__gu_err), "=r" (__gu_val) \
: "0" (
__gu_err), "o" (__m(__gu_addr)), "i" (-EFAULT));
\
}
)
: "0" (
0), "o" (__m(addr)), "i" (-EFAULT));
\
}
/*
* Get a long long 64 using 32 bit registers.
*/
#define __get_user_asm_ll32(
__gu_er
r) \
(
{ \
#define __get_user_asm_ll32(
add
r) \
{ \
__asm__ __volatile__( \
"1: lw %1,
%3
\n" \
"2: lw %D1,
%4
\n" \
"1: lw %1,
(%3)
\n" \
"2: lw %D1,
4(%3)
\n" \
" move %0, $0 \n" \
"3: .section .fixup,\"ax\" \n" \
"4: li %0, %
5
\n" \
"4: li %0, %
4
\n" \
" move %1, $0 \n" \
" move %D1, $0 \n" \
" j 3b \n" \
...
...
@@ -287,9 +280,8 @@ struct __large_struct { unsigned long buf[100]; };
" " __UA_ADDR " 2b, 4b \n" \
" .previous \n" \
: "=r" (__gu_err), "=&r" (__gu_val) \
: "0" (__gu_err), "o" (__m(__gu_addr)), \
"o" (__m(__gu_addr + 4)), "i" (-EFAULT)); \
})
: "0" (0), "r" (addr), "i" (-EFAULT)); \
}
extern
void
__get_user_unknown
(
void
);
...
...
@@ -298,25 +290,23 @@ extern void __get_user_unknown(void);
* for 32 bit mode and old iron.
*/
#ifdef __mips64
#define __PUT_USER_DW(
__pu_val) __put_user_asm("sd", __pu_val
)
#define __PUT_USER_DW(
ptr) __put_user_asm("sd", ptr
)
#else
#define __PUT_USER_DW(
__pu_val) __put_user_asm_ll32(__pu_val
)
#define __PUT_USER_DW(
ptr) __put_user_asm_ll32(ptr
)
#endif
#define __put_user_nocheck(x,ptr,size) \
({ \
__typeof__(*(ptr)) __pu_val; \
long __pu_addr; \
long __pu_err = 0; \
\
might_sleep(); \
__pu_val = (x); \
__pu_addr = (long) (ptr); \
switch (size) { \
case 1: __put_user_asm("sb",
__pu_val
); break; \
case 2: __put_user_asm("sh",
__pu_val
); break; \
case 4: __put_user_asm("sw",
__pu_val
); break; \
case 8: __PUT_USER_DW(
__pu_val
); break; \
case 1: __put_user_asm("sb",
ptr
); break; \
case 2: __put_user_asm("sh",
ptr
); break; \
case 4: __put_user_asm("sw",
ptr
); break; \
case 8: __PUT_USER_DW(
ptr
); break; \
default: __put_user_unknown(); break; \
} \
__pu_err; \
...
...
@@ -324,30 +314,24 @@ extern void __get_user_unknown(void);
#define __put_user_check(x,ptr,size) \
({ \
__typeof__(*(ptr)) __
pu_val;
\
long __pu_addr;
\
long __pu_err
;
\
__typeof__(*(ptr)) __
user *__pu_addr = (ptr);
\
__typeof__(*(ptr)) __pu_val = (x);
\
long __pu_err
= -EFAULT;
\
\
might_sleep(); \
__pu_val = (x); \
__pu_addr = (long) (ptr); \
__pu_err = access_ok(VERIFY_WRITE, (void *) __pu_addr, size) \
? 0 : -EFAULT; \
\
if (likely(!__pu_err)) { \
if (likely(access_ok(VERIFY_WRITE, __pu_addr, size))) { \
switch (size) { \
case 1: __put_user_asm("sb", __pu_
val
); break; \
case 2: __put_user_asm("sh", __pu_
val
); break; \
case 4: __put_user_asm("sw", __pu_
val
); break; \
case 8: __PUT_USER_DW(__pu_
val); break;
\
case 1: __put_user_asm("sb", __pu_
addr
); break; \
case 2: __put_user_asm("sh", __pu_
addr
); break; \
case 4: __put_user_asm("sw", __pu_
addr
); break; \
case 8: __PUT_USER_DW(__pu_
addr); break;
\
default: __put_user_unknown(); break; \
} \
} \
__pu_err; \
})
#define __put_user_asm(insn,
__pu_val
) \
(
{ \
#define __put_user_asm(insn,
ptr
) \
{ \
__asm__ __volatile__( \
"1: " insn " %z2, %3 # __put_user_asm\n" \
"2: \n" \
...
...
@@ -359,18 +343,18 @@ extern void __get_user_unknown(void);
" " __UA_ADDR " 1b, 3b \n" \
" .previous \n" \
: "=r" (__pu_err) \
: "0" (
__pu_err), "Jr" (__pu_val), "o" (__m(__pu_addr)),
\
: "0" (
0), "Jr" (__pu_val), "o" (__m(ptr)),
\
"i" (-EFAULT)); \
}
)
}
#define __put_user_asm_ll32(
__pu_val
) \
(
{ \
#define __put_user_asm_ll32(
ptr
) \
{ \
__asm__ __volatile__( \
"1: sw %2,
%3
# __put_user_asm_ll32 \n" \
"2: sw %D2,
%4
\n" \
"1: sw %2,
(%3)
# __put_user_asm_ll32 \n" \
"2: sw %D2,
4(%3)
\n" \
"3: \n" \
" .section .fixup,\"ax\" \n" \
"4: li %0, %
5
\n" \
"4: li %0, %
4
\n" \
" j 3b \n" \
" .previous \n" \
" .section __ex_table,\"a\" \n" \
...
...
@@ -378,9 +362,9 @@ extern void __get_user_unknown(void);
" " __UA_ADDR " 2b, 4b \n" \
" .previous" \
: "=r" (__pu_err) \
: "0" (
__pu_err), "r" (__pu_val), "o" (__m(__pu_addr)),
\
"
o" (__m(__pu_addr + 4)), "i" (-EFAULT));
\
}
)
: "0" (
0), "r" (__pu_val), "r" (ptr),
\
"
i" (-EFAULT));
\
}
extern
void
__put_user_unknown
(
void
);
...
...
@@ -403,7 +387,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
#define __invoke_copy_to_user(to,from,n) \
({ \
register void *__cu_to_r __asm__ ("$4"); \
register void
__user
*__cu_to_r __asm__ ("$4"); \
register const void *__cu_from_r __asm__ ("$5"); \
register long __cu_len_r __asm__ ("$6"); \
\
...
...
@@ -435,7 +419,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
*/
#define __copy_to_user(to,from,n) \
({ \
void
*__cu_to;
\
void
__user *__cu_to;
\
const void *__cu_from; \
long __cu_len; \
\
...
...
@@ -465,7 +449,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
*/
#define copy_to_user(to,from,n) \
({ \
void
*__cu_to;
\
void
__user *__cu_to;
\
const void *__cu_from; \
long __cu_len; \
\
...
...
@@ -482,7 +466,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
#define __invoke_copy_from_user(to,from,n) \
({ \
register void *__cu_to_r __asm__ ("$4"); \
register const void *__cu_from_r __asm__ ("$5"); \
register const void
__user
*__cu_from_r __asm__ ("$5"); \
register long __cu_len_r __asm__ ("$6"); \
\
__cu_to_r = (to); \
...
...
@@ -521,7 +505,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
#define __copy_from_user(to,from,n) \
({ \
void *__cu_to; \
const void
*__cu_from;
\
const void
__user *__cu_from;
\
long __cu_len; \
\
might_sleep(); \
...
...
@@ -552,7 +536,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
#define copy_from_user(to,from,n) \
({ \
void *__cu_to; \
const void
*__cu_from;
\
const void
__user *__cu_from;
\
long __cu_len; \
\
might_sleep(); \
...
...
@@ -569,8 +553,8 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
#define copy_in_user(to,from,n) \
({ \
void
*__cu_to;
\
const void
*__cu_from;
\
void
__user *__cu_to;
\
const void
__user *__cu_from;
\
long __cu_len; \
\
might_sleep(); \
...
...
@@ -596,7 +580,7 @@ extern size_t __copy_user(void *__to, const void *__from, size_t __n);
* On success, this will be zero.
*/
static
inline
__kernel_size_t
__clear_user
(
void
*
addr
,
__kernel_size_t
size
)
__clear_user
(
void
__user
*
addr
,
__kernel_size_t
size
)
{
__kernel_size_t
res
;
...
...
@@ -616,7 +600,7 @@ __clear_user(void *addr, __kernel_size_t size)
#define clear_user(addr,n) \
({ \
void
* __cl_addr = (addr);
\
void
__user * __cl_addr = (addr);
\
unsigned long __cl_size = (n); \
if (__cl_size && access_ok(VERIFY_WRITE, \
((unsigned long)(__cl_addr)), __cl_size)) \
...
...
@@ -645,7 +629,7 @@ __clear_user(void *addr, __kernel_size_t size)
* and returns @count.
*/
static
inline
long
__strncpy_from_user
(
char
*
__to
,
const
char
*
__from
,
long
__len
)
__strncpy_from_user
(
char
*
__to
,
const
char
__user
*
__from
,
long
__len
)
{
long
res
;
...
...
@@ -682,7 +666,7 @@ __strncpy_from_user(char *__to, const char *__from, long __len)
* and returns @count.
*/
static
inline
long
strncpy_from_user
(
char
*
__to
,
const
char
*
__from
,
long
__len
)
strncpy_from_user
(
char
*
__to
,
const
char
__user
*
__from
,
long
__len
)
{
long
res
;
...
...
@@ -701,7 +685,7 @@ strncpy_from_user(char *__to, const char *__from, long __len)
}
/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
static
inline
long
__strlen_user
(
const
char
*
s
)
static
inline
long
__strlen_user
(
const
char
__user
*
s
)
{
long
res
;
...
...
@@ -731,7 +715,7 @@ static inline long __strlen_user(const char *s)
* If there is a limit on the length of a valid string, you may wish to
* consider using strnlen_user() instead.
*/
static
inline
long
strlen_user
(
const
char
*
s
)
static
inline
long
strlen_user
(
const
char
__user
*
s
)
{
long
res
;
...
...
@@ -748,7 +732,7 @@ static inline long strlen_user(const char *s)
}
/* Returns: 0 if bad, string length+1 (memory size) of string if ok */
static
inline
long
__strnlen_user
(
const
char
*
s
,
long
n
)
static
inline
long
__strnlen_user
(
const
char
__user
*
s
,
long
n
)
{
long
res
;
...
...
@@ -779,7 +763,7 @@ static inline long __strnlen_user(const char *s, long n)
* If there is a limit on the length of a valid string, you may wish to
* consider using strnlen_user() instead.
*/
static
inline
long
strnlen_user
(
const
char
*
s
,
long
n
)
static
inline
long
strnlen_user
(
const
char
__user
*
s
,
long
n
)
{
long
res
;
...
...
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