Merge branch 'upstream' of git://ftp.linux-mips.org/pub/scm/upstream-linus
This commit is contained in:
commit
f564c5fe29
13 changed files with 215 additions and 78 deletions
|
@ -4,6 +4,7 @@
|
||||||
* for more details.
|
* for more details.
|
||||||
*
|
*
|
||||||
* Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others.
|
* Copyright (C) 1994 - 1999, 2000 by Ralf Baechle and others.
|
||||||
|
* Copyright (C) 2005, 2006 by Ralf Baechle (ralf@linux-mips.org)
|
||||||
* Copyright (C) 1999, 2000 Silicon Graphics, Inc.
|
* Copyright (C) 1999, 2000 Silicon Graphics, Inc.
|
||||||
* Copyright (C) 2004 Thiemo Seufer
|
* Copyright (C) 2004 Thiemo Seufer
|
||||||
*/
|
*/
|
||||||
|
@ -58,8 +59,8 @@ ATTRIB_NORET void cpu_idle(void)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
extern int do_signal(sigset_t *oldset, struct pt_regs *regs);
|
extern void do_signal(struct pt_regs *regs);
|
||||||
extern int do_signal32(sigset_t *oldset, struct pt_regs *regs);
|
extern void do_signal32(struct pt_regs *regs);
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Native o32 and N64 ABI without DSP ASE
|
* Native o32 and N64 ABI without DSP ASE
|
||||||
|
|
|
@ -617,6 +617,23 @@ einval: li v0, -EINVAL
|
||||||
sys sys_inotify_init 0
|
sys sys_inotify_init 0
|
||||||
sys sys_inotify_add_watch 3 /* 4285 */
|
sys sys_inotify_add_watch 3 /* 4285 */
|
||||||
sys sys_inotify_rm_watch 2
|
sys sys_inotify_rm_watch 2
|
||||||
|
sys sys_migrate_pages 4
|
||||||
|
sys sys_openat 4
|
||||||
|
sys sys_mkdirat 3
|
||||||
|
sys sys_mknodat 4 /* 4290 */
|
||||||
|
sys sys_fchownat 5
|
||||||
|
sys sys_futimesat 3
|
||||||
|
sys sys_newfstatat 4
|
||||||
|
sys sys_unlinkat 3
|
||||||
|
sys sys_renameat 4 /* 4295 */
|
||||||
|
sys sys_linkat 4
|
||||||
|
sys sys_symlinkat 3
|
||||||
|
sys sys_readlinkat 4
|
||||||
|
sys sys_fchmodat 3
|
||||||
|
sys sys_faccessat 3 /* 4300 */
|
||||||
|
sys sys_pselect6 6
|
||||||
|
sys sys_ppoll 5
|
||||||
|
sys sys_unshare 1
|
||||||
.endm
|
.endm
|
||||||
|
|
||||||
/* We pre-compute the number of _instruction_ bytes needed to
|
/* We pre-compute the number of _instruction_ bytes needed to
|
||||||
|
|
|
@ -443,3 +443,20 @@ sys_call_table:
|
||||||
PTR sys_inotify_init
|
PTR sys_inotify_init
|
||||||
PTR sys_inotify_add_watch
|
PTR sys_inotify_add_watch
|
||||||
PTR sys_inotify_rm_watch /* 5245 */
|
PTR sys_inotify_rm_watch /* 5245 */
|
||||||
|
PTR sys_migrate_pages
|
||||||
|
PTR sys_openat
|
||||||
|
PTR sys_mkdirat
|
||||||
|
PTR sys_mknodat
|
||||||
|
PTR sys_fchownat /* 5250 */
|
||||||
|
PTR sys_futimesat
|
||||||
|
PTR sys_newfstatat
|
||||||
|
PTR sys_unlinkat
|
||||||
|
PTR sys_renameat
|
||||||
|
PTR sys_linkat /* 5255 */
|
||||||
|
PTR sys_symlinkat
|
||||||
|
PTR sys_readlinkat
|
||||||
|
PTR sys_fchmodat
|
||||||
|
PTR sys_faccessat
|
||||||
|
PTR sys_pselect6 /* 5260 */
|
||||||
|
PTR sys_ppoll
|
||||||
|
PTR sys_unshare
|
||||||
|
|
|
@ -369,3 +369,20 @@ EXPORT(sysn32_call_table)
|
||||||
PTR sys_inotify_init
|
PTR sys_inotify_init
|
||||||
PTR sys_inotify_add_watch
|
PTR sys_inotify_add_watch
|
||||||
PTR sys_inotify_rm_watch
|
PTR sys_inotify_rm_watch
|
||||||
|
PTR sys_migrate_pages /* 6250 */
|
||||||
|
PTR sys_openat
|
||||||
|
PTR sys_mkdirat
|
||||||
|
PTR sys_mknodat
|
||||||
|
PTR sys_fchownat
|
||||||
|
PTR sys_futimesat /* 6255 */
|
||||||
|
PTR sys_newfstatat
|
||||||
|
PTR sys_unlinkat
|
||||||
|
PTR sys_renameat
|
||||||
|
PTR sys_linkat
|
||||||
|
PTR sys_symlinkat /* 6260 */
|
||||||
|
PTR sys_readlinkat
|
||||||
|
PTR sys_fchmodat
|
||||||
|
PTR sys_faccessat
|
||||||
|
PTR sys_pselect6
|
||||||
|
PTR sys_ppoll /* 6265 */
|
||||||
|
PTR sys_unshare
|
||||||
|
|
|
@ -491,4 +491,21 @@ sys_call_table:
|
||||||
PTR sys_inotify_init
|
PTR sys_inotify_init
|
||||||
PTR sys_inotify_add_watch /* 4285 */
|
PTR sys_inotify_add_watch /* 4285 */
|
||||||
PTR sys_inotify_rm_watch
|
PTR sys_inotify_rm_watch
|
||||||
|
PTR sys_migrate_pages
|
||||||
|
PTR compat_sys_openat
|
||||||
|
PTR sys_mkdirat
|
||||||
|
PTR sys_mknodat /* 4290 */
|
||||||
|
PTR sys_fchownat
|
||||||
|
PTR compat_sys_futimesat
|
||||||
|
PTR compat_sys_newfstatat
|
||||||
|
PTR sys_unlinkat
|
||||||
|
PTR sys_renameat /* 4295 */
|
||||||
|
PTR sys_linkat
|
||||||
|
PTR sys_symlinkat
|
||||||
|
PTR sys_readlinkat
|
||||||
|
PTR sys_fchmodat
|
||||||
|
PTR sys_faccessat /* 4300 */
|
||||||
|
PTR sys_pselect6
|
||||||
|
PTR sys_ppoll
|
||||||
|
PTR sys_unshare
|
||||||
.size sys_call_table,.-sys_call_table
|
.size sys_call_table,.-sys_call_table
|
||||||
|
|
|
@ -39,8 +39,6 @@
|
||||||
|
|
||||||
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
#define _BLOCKABLE (~(sigmask(SIGKILL) | sigmask(SIGSTOP)))
|
||||||
|
|
||||||
int do_signal(sigset_t *oldset, struct pt_regs *regs);
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Atomically swap in the new signal mask, and wait for a signal.
|
* Atomically swap in the new signal mask, and wait for a signal.
|
||||||
*/
|
*/
|
||||||
|
@ -50,7 +48,7 @@ save_static_function(sys_sigsuspend);
|
||||||
__attribute_used__ noinline static int
|
__attribute_used__ noinline static int
|
||||||
_sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
_sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
||||||
{
|
{
|
||||||
sigset_t saveset, newset;
|
sigset_t newset;
|
||||||
sigset_t __user *uset;
|
sigset_t __user *uset;
|
||||||
|
|
||||||
uset = (sigset_t __user *) regs.regs[4];
|
uset = (sigset_t __user *) regs.regs[4];
|
||||||
|
@ -59,19 +57,15 @@ _sys_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
||||||
sigdelsetmask(&newset, ~_BLOCKABLE);
|
sigdelsetmask(&newset, ~_BLOCKABLE);
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
saveset = current->blocked;
|
current->saved_sigmask = current->blocked;
|
||||||
current->blocked = newset;
|
current->blocked = newset;
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
|
||||||
regs.regs[2] = EINTR;
|
current->state = TASK_INTERRUPTIBLE;
|
||||||
regs.regs[7] = 1;
|
schedule();
|
||||||
while (1) {
|
set_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
return -ERESTARTNOHAND;
|
||||||
schedule();
|
|
||||||
if (do_signal(&saveset, ®s))
|
|
||||||
return -EINTR;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -79,7 +73,7 @@ save_static_function(sys_rt_sigsuspend);
|
||||||
__attribute_used__ noinline static int
|
__attribute_used__ noinline static int
|
||||||
_sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
_sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
||||||
{
|
{
|
||||||
sigset_t saveset, newset;
|
sigset_t newset;
|
||||||
sigset_t __user *unewset;
|
sigset_t __user *unewset;
|
||||||
size_t sigsetsize;
|
size_t sigsetsize;
|
||||||
|
|
||||||
|
@ -94,19 +88,15 @@ _sys_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
|
||||||
sigdelsetmask(&newset, ~_BLOCKABLE);
|
sigdelsetmask(&newset, ~_BLOCKABLE);
|
||||||
|
|
||||||
spin_lock_irq(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
saveset = current->blocked;
|
current->saved_sigmask = current->blocked;
|
||||||
current->blocked = newset;
|
current->blocked = newset;
|
||||||
recalc_sigpending();
|
recalc_sigpending();
|
||||||
spin_unlock_irq(¤t->sighand->siglock);
|
spin_unlock_irq(¤t->sighand->siglock);
|
||||||
|
|
||||||
regs.regs[2] = EINTR;
|
current->state = TASK_INTERRUPTIBLE;
|
||||||
regs.regs[7] = 1;
|
schedule();
|
||||||
while (1) {
|
set_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
current->state = TASK_INTERRUPTIBLE;
|
return -ERESTARTNOHAND;
|
||||||
schedule();
|
|
||||||
if (do_signal(&saveset, ®s))
|
|
||||||
return -EINTR;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_TRAD_SIGNALS
|
#ifdef CONFIG_TRAD_SIGNALS
|
||||||
|
@ -315,11 +305,11 @@ int setup_frame(struct k_sigaction * ka, struct pt_regs *regs,
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
frame, regs->cp0_epc, frame->regs[31]);
|
frame, regs->cp0_epc, frame->regs[31]);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(signr, current);
|
force_sigsegv(signr, current);
|
||||||
return 0;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
@ -375,11 +365,11 @@ int setup_rt_frame(struct k_sigaction * ka, struct pt_regs *regs,
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
frame, regs->cp0_epc, regs->regs[31]);
|
frame, regs->cp0_epc, regs->regs[31]);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(signr, current);
|
force_sigsegv(signr, current);
|
||||||
return 0;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int handle_signal(unsigned long sig, siginfo_t *info,
|
static inline int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
|
@ -393,7 +383,7 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
regs->regs[2] = EINTR;
|
regs->regs[2] = EINTR;
|
||||||
break;
|
break;
|
||||||
case ERESTARTSYS:
|
case ERESTARTSYS:
|
||||||
if(!(ka->sa.sa_flags & SA_RESTART)) {
|
if (!(ka->sa.sa_flags & SA_RESTART)) {
|
||||||
regs->regs[2] = EINTR;
|
regs->regs[2] = EINTR;
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
@ -420,9 +410,10 @@ static inline int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
return ret;
|
return ret;
|
||||||
}
|
}
|
||||||
|
|
||||||
int do_signal(sigset_t *oldset, struct pt_regs *regs)
|
void do_signal(struct pt_regs *regs)
|
||||||
{
|
{
|
||||||
struct k_sigaction ka;
|
struct k_sigaction ka;
|
||||||
|
sigset_t *oldset;
|
||||||
siginfo_t info;
|
siginfo_t info;
|
||||||
int signr;
|
int signr;
|
||||||
|
|
||||||
|
@ -432,17 +423,31 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
|
||||||
* if so.
|
* if so.
|
||||||
*/
|
*/
|
||||||
if (!user_mode(regs))
|
if (!user_mode(regs))
|
||||||
return 1;
|
return;
|
||||||
|
|
||||||
if (try_to_freeze())
|
if (try_to_freeze())
|
||||||
goto no_signal;
|
goto no_signal;
|
||||||
|
|
||||||
if (!oldset)
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
|
oldset = ¤t->saved_sigmask;
|
||||||
|
else
|
||||||
oldset = ¤t->blocked;
|
oldset = ¤t->blocked;
|
||||||
|
|
||||||
|
|
||||||
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
signr = get_signal_to_deliver(&info, &ka, regs, NULL);
|
||||||
if (signr > 0)
|
if (signr > 0) {
|
||||||
return handle_signal(signr, &info, &ka, oldset, regs);
|
/* Whee! Actually deliver the signal. */
|
||||||
|
if (handle_signal(signr, &info, &ka, oldset, regs) == 0) {
|
||||||
|
/*
|
||||||
|
* A signal was successfully delivered; the saved
|
||||||
|
* sigmask will have been stored in the signal frame,
|
||||||
|
* and will be restored by sigreturn, so we can simply
|
||||||
|
* clear the TIF_RESTORE_SIGMASK flag.
|
||||||
|
*/
|
||||||
|
if (test_thread_flag(TIF_RESTORE_SIGMASK))
|
||||||
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
no_signal:
|
no_signal:
|
||||||
/*
|
/*
|
||||||
|
@ -463,18 +468,25 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
|
||||||
regs->cp0_epc -= 4;
|
regs->cp0_epc -= 4;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return 0;
|
|
||||||
|
/*
|
||||||
|
* If there's no signal to deliver, we just put the saved sigmask
|
||||||
|
* back
|
||||||
|
*/
|
||||||
|
if (test_thread_flag(TIF_RESTORE_SIGMASK)) {
|
||||||
|
clear_thread_flag(TIF_RESTORE_SIGMASK);
|
||||||
|
sigprocmask(SIG_SETMASK, ¤t->saved_sigmask, NULL);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* notification of userspace execution resumption
|
* notification of userspace execution resumption
|
||||||
* - triggered by current->work.notify_resume
|
* - triggered by the TIF_WORK_MASK flags
|
||||||
*/
|
*/
|
||||||
asmlinkage void do_notify_resume(struct pt_regs *regs, sigset_t *oldset,
|
asmlinkage void do_notify_resume(struct pt_regs *regs, void *unused,
|
||||||
__u32 thread_info_flags)
|
__u32 thread_info_flags)
|
||||||
{
|
{
|
||||||
/* deal with pending signal delivery */
|
/* deal with pending signal delivery */
|
||||||
if (thread_info_flags & _TIF_SIGPENDING) {
|
if (thread_info_flags & (_TIF_SIGPENDING | _TIF_RESTORE_SIGMASK))
|
||||||
current->thread.abi->do_signal(oldset, regs);
|
current->thread.abi->do_signal(regs);
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -694,11 +694,11 @@ int setup_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
frame, regs->cp0_epc, frame->sf_code);
|
frame, regs->cp0_epc, frame->sf_code);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(signr, current);
|
force_sigsegv(signr, current);
|
||||||
return 0;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
|
int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
|
||||||
|
@ -765,11 +765,11 @@ int setup_rt_frame_32(struct k_sigaction * ka, struct pt_regs *regs,
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
frame, regs->cp0_epc, frame->rs_code);
|
frame, regs->cp0_epc, frame->rs_code);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(signr, current);
|
force_sigsegv(signr, current);
|
||||||
return 0;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
||||||
static inline int handle_signal(unsigned long sig, siginfo_t *info,
|
static inline int handle_signal(unsigned long sig, siginfo_t *info,
|
||||||
|
|
|
@ -186,9 +186,9 @@ int setup_rt_frame_n32(struct k_sigaction * ka,
|
||||||
current->comm, current->pid,
|
current->comm, current->pid,
|
||||||
frame, regs->cp0_epc, regs->regs[31]);
|
frame, regs->cp0_epc, regs->regs[31]);
|
||||||
#endif
|
#endif
|
||||||
return 1;
|
return 0;
|
||||||
|
|
||||||
give_sigsegv:
|
give_sigsegv:
|
||||||
force_sigsegv(signr, current);
|
force_sigsegv(signr, current);
|
||||||
return 0;
|
return -EFAULT;
|
||||||
}
|
}
|
||||||
|
|
|
@ -212,12 +212,12 @@ asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs)
|
||||||
int error;
|
int error;
|
||||||
char * filename;
|
char * filename;
|
||||||
|
|
||||||
filename = getname((char *) (long)regs.regs[4]);
|
filename = getname((char __user *) (long)regs.regs[4]);
|
||||||
error = PTR_ERR(filename);
|
error = PTR_ERR(filename);
|
||||||
if (IS_ERR(filename))
|
if (IS_ERR(filename))
|
||||||
goto out;
|
goto out;
|
||||||
error = do_execve(filename, (char **) (long)regs.regs[5],
|
error = do_execve(filename, (char __user *__user *) (long)regs.regs[5],
|
||||||
(char **) (long)regs.regs[6], ®s);
|
(char __user *__user *) (long)regs.regs[6], ®s);
|
||||||
putname(filename);
|
putname(filename);
|
||||||
|
|
||||||
out:
|
out:
|
||||||
|
@ -227,7 +227,7 @@ asmlinkage int sys_execve(nabi_no_regargs struct pt_regs regs)
|
||||||
/*
|
/*
|
||||||
* Compacrapability ...
|
* Compacrapability ...
|
||||||
*/
|
*/
|
||||||
asmlinkage int sys_uname(struct old_utsname * name)
|
asmlinkage int sys_uname(struct old_utsname __user * name)
|
||||||
{
|
{
|
||||||
if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
|
if (name && !copy_to_user(name, &system_utsname, sizeof (*name)))
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -237,7 +237,7 @@ asmlinkage int sys_uname(struct old_utsname * name)
|
||||||
/*
|
/*
|
||||||
* Compacrapability ...
|
* Compacrapability ...
|
||||||
*/
|
*/
|
||||||
asmlinkage int sys_olduname(struct oldold_utsname * name)
|
asmlinkage int sys_olduname(struct oldold_utsname __user * name)
|
||||||
{
|
{
|
||||||
int error;
|
int error;
|
||||||
|
|
||||||
|
@ -274,7 +274,7 @@ void sys_set_thread_area(unsigned long addr)
|
||||||
asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
||||||
{
|
{
|
||||||
int tmp, len;
|
int tmp, len;
|
||||||
char *name;
|
char __user *name;
|
||||||
|
|
||||||
switch(cmd) {
|
switch(cmd) {
|
||||||
case SETNAME: {
|
case SETNAME: {
|
||||||
|
@ -283,7 +283,7 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
||||||
if (!capable(CAP_SYS_ADMIN))
|
if (!capable(CAP_SYS_ADMIN))
|
||||||
return -EPERM;
|
return -EPERM;
|
||||||
|
|
||||||
name = (char *) arg1;
|
name = (char __user *) arg1;
|
||||||
|
|
||||||
len = strncpy_from_user(nodename, name, __NEW_UTS_LEN);
|
len = strncpy_from_user(nodename, name, __NEW_UTS_LEN);
|
||||||
if (len < 0)
|
if (len < 0)
|
||||||
|
@ -324,7 +324,7 @@ asmlinkage int _sys_sysmips(int cmd, long arg1, int arg2, int arg3)
|
||||||
* This is really horribly ugly.
|
* This is really horribly ugly.
|
||||||
*/
|
*/
|
||||||
asmlinkage int sys_ipc (uint call, int first, int second,
|
asmlinkage int sys_ipc (uint call, int first, int second,
|
||||||
unsigned long third, void *ptr, long fifth)
|
unsigned long third, void __user *ptr, long fifth)
|
||||||
{
|
{
|
||||||
int version, ret;
|
int version, ret;
|
||||||
|
|
||||||
|
@ -333,24 +333,25 @@ asmlinkage int sys_ipc (uint call, int first, int second,
|
||||||
|
|
||||||
switch (call) {
|
switch (call) {
|
||||||
case SEMOP:
|
case SEMOP:
|
||||||
return sys_semtimedop (first, (struct sembuf *)ptr, second,
|
return sys_semtimedop (first, (struct sembuf __user *)ptr,
|
||||||
NULL);
|
second, NULL);
|
||||||
case SEMTIMEDOP:
|
case SEMTIMEDOP:
|
||||||
return sys_semtimedop (first, (struct sembuf *)ptr, second,
|
return sys_semtimedop (first, (struct sembuf __user *)ptr,
|
||||||
(const struct timespec __user *)fifth);
|
second,
|
||||||
|
(const struct timespec __user *)fifth);
|
||||||
case SEMGET:
|
case SEMGET:
|
||||||
return sys_semget (first, second, third);
|
return sys_semget (first, second, third);
|
||||||
case SEMCTL: {
|
case SEMCTL: {
|
||||||
union semun fourth;
|
union semun fourth;
|
||||||
if (!ptr)
|
if (!ptr)
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
if (get_user(fourth.__pad, (void **) ptr))
|
if (get_user(fourth.__pad, (void *__user *) ptr))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return sys_semctl (first, second, third, fourth);
|
return sys_semctl (first, second, third, fourth);
|
||||||
}
|
}
|
||||||
|
|
||||||
case MSGSND:
|
case MSGSND:
|
||||||
return sys_msgsnd (first, (struct msgbuf *) ptr,
|
return sys_msgsnd (first, (struct msgbuf __user *) ptr,
|
||||||
second, third);
|
second, third);
|
||||||
case MSGRCV:
|
case MSGRCV:
|
||||||
switch (version) {
|
switch (version) {
|
||||||
|
@ -360,7 +361,7 @@ asmlinkage int sys_ipc (uint call, int first, int second,
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
|
|
||||||
if (copy_from_user(&tmp,
|
if (copy_from_user(&tmp,
|
||||||
(struct ipc_kludge *) ptr,
|
(struct ipc_kludge __user *) ptr,
|
||||||
sizeof (tmp)))
|
sizeof (tmp)))
|
||||||
return -EFAULT;
|
return -EFAULT;
|
||||||
return sys_msgrcv (first, tmp.msgp, second,
|
return sys_msgrcv (first, tmp.msgp, second,
|
||||||
|
@ -368,35 +369,38 @@ asmlinkage int sys_ipc (uint call, int first, int second,
|
||||||
}
|
}
|
||||||
default:
|
default:
|
||||||
return sys_msgrcv (first,
|
return sys_msgrcv (first,
|
||||||
(struct msgbuf *) ptr,
|
(struct msgbuf __user *) ptr,
|
||||||
second, fifth, third);
|
second, fifth, third);
|
||||||
}
|
}
|
||||||
case MSGGET:
|
case MSGGET:
|
||||||
return sys_msgget ((key_t) first, second);
|
return sys_msgget ((key_t) first, second);
|
||||||
case MSGCTL:
|
case MSGCTL:
|
||||||
return sys_msgctl (first, second, (struct msqid_ds *) ptr);
|
return sys_msgctl (first, second,
|
||||||
|
(struct msqid_ds __user *) ptr);
|
||||||
|
|
||||||
case SHMAT:
|
case SHMAT:
|
||||||
switch (version) {
|
switch (version) {
|
||||||
default: {
|
default: {
|
||||||
ulong raddr;
|
ulong raddr;
|
||||||
ret = do_shmat (first, (char *) ptr, second, &raddr);
|
ret = do_shmat (first, (char __user *) ptr, second,
|
||||||
|
&raddr);
|
||||||
if (ret)
|
if (ret)
|
||||||
return ret;
|
return ret;
|
||||||
return put_user (raddr, (ulong *) third);
|
return put_user (raddr, (ulong __user *) third);
|
||||||
}
|
}
|
||||||
case 1: /* iBCS2 emulator entry point */
|
case 1: /* iBCS2 emulator entry point */
|
||||||
if (!segment_eq(get_fs(), get_ds()))
|
if (!segment_eq(get_fs(), get_ds()))
|
||||||
return -EINVAL;
|
return -EINVAL;
|
||||||
return do_shmat (first, (char *) ptr, second, (ulong *) third);
|
return do_shmat (first, (char __user *) ptr, second,
|
||||||
|
(ulong *) third);
|
||||||
}
|
}
|
||||||
case SHMDT:
|
case SHMDT:
|
||||||
return sys_shmdt ((char *)ptr);
|
return sys_shmdt ((char __user *)ptr);
|
||||||
case SHMGET:
|
case SHMGET:
|
||||||
return sys_shmget (first, second, third);
|
return sys_shmget (first, second, third);
|
||||||
case SHMCTL:
|
case SHMCTL:
|
||||||
return sys_shmctl (first, second,
|
return sys_shmctl (first, second,
|
||||||
(struct shmid_ds *) ptr);
|
(struct shmid_ds __user *) ptr);
|
||||||
default:
|
default:
|
||||||
return -ENOSYS;
|
return -ENOSYS;
|
||||||
}
|
}
|
||||||
|
|
|
@ -3,7 +3,7 @@
|
||||||
* License. See the file "COPYING" in the main directory of this archive
|
* License. See the file "COPYING" in the main directory of this archive
|
||||||
* for more details.
|
* for more details.
|
||||||
*
|
*
|
||||||
* Copyright (C) 2005 by Ralf Baechle
|
* Copyright (C) 2005, 06 by Ralf Baechle (ralf@linux-mips.org)
|
||||||
* Copyright (C) 2005 MIPS Technologies, Inc.
|
* Copyright (C) 2005 MIPS Technologies, Inc.
|
||||||
*/
|
*/
|
||||||
#ifndef _ASM_ABI_H
|
#ifndef _ASM_ABI_H
|
||||||
|
@ -13,7 +13,7 @@
|
||||||
#include <asm/siginfo.h>
|
#include <asm/siginfo.h>
|
||||||
|
|
||||||
struct mips_abi {
|
struct mips_abi {
|
||||||
int (* const do_signal)(sigset_t *oldset, struct pt_regs *regs);
|
void (* const do_signal)(struct pt_regs *regs);
|
||||||
int (* const setup_frame)(struct k_sigaction * ka,
|
int (* const setup_frame)(struct k_sigaction * ka,
|
||||||
struct pt_regs *regs, int signr,
|
struct pt_regs *regs, int signr,
|
||||||
sigset_t *set);
|
sigset_t *set);
|
||||||
|
|
|
@ -342,7 +342,7 @@ static inline void pfx##write##bwlq(type val, \
|
||||||
BUG(); \
|
BUG(); \
|
||||||
} \
|
} \
|
||||||
\
|
\
|
||||||
static inline type pfx##read##bwlq(volatile void __iomem *mem) \
|
static inline type pfx##read##bwlq(const volatile void __iomem *mem) \
|
||||||
{ \
|
{ \
|
||||||
volatile type *__mem; \
|
volatile type *__mem; \
|
||||||
type __val; \
|
type __val; \
|
||||||
|
|
|
@ -114,6 +114,7 @@ register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
#define TIF_NEED_RESCHED 3 /* rescheduling necessary */
|
||||||
#define TIF_SYSCALL_AUDIT 4 /* syscall auditing active */
|
#define TIF_SYSCALL_AUDIT 4 /* syscall auditing active */
|
||||||
#define TIF_SECCOMP 5 /* secure computing */
|
#define TIF_SECCOMP 5 /* secure computing */
|
||||||
|
#define TIF_RESTORE_SIGMASK 9 /* restore signal mask in do_signal() */
|
||||||
#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
|
#define TIF_USEDFPU 16 /* FPU was used by this task this quantum (SMP) */
|
||||||
#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
|
#define TIF_POLLING_NRFLAG 17 /* true if poll_idle() is polling TIF_NEED_RESCHED */
|
||||||
#define TIF_MEMDIE 18
|
#define TIF_MEMDIE 18
|
||||||
|
@ -125,6 +126,7 @@ register struct thread_info *__current_thread_info __asm__("$28");
|
||||||
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
#define _TIF_NEED_RESCHED (1<<TIF_NEED_RESCHED)
|
||||||
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
|
#define _TIF_SYSCALL_AUDIT (1<<TIF_SYSCALL_AUDIT)
|
||||||
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
#define _TIF_SECCOMP (1<<TIF_SECCOMP)
|
||||||
|
#define _TIF_RESTORE_SIGMASK (1<<TIF_RESTORE_SIGMASK)
|
||||||
#define _TIF_USEDFPU (1<<TIF_USEDFPU)
|
#define _TIF_USEDFPU (1<<TIF_USEDFPU)
|
||||||
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
#define _TIF_POLLING_NRFLAG (1<<TIF_POLLING_NRFLAG)
|
||||||
|
|
||||||
|
|
|
@ -307,17 +307,33 @@
|
||||||
#define __NR_inotify_init (__NR_Linux + 284)
|
#define __NR_inotify_init (__NR_Linux + 284)
|
||||||
#define __NR_inotify_add_watch (__NR_Linux + 285)
|
#define __NR_inotify_add_watch (__NR_Linux + 285)
|
||||||
#define __NR_inotify_rm_watch (__NR_Linux + 286)
|
#define __NR_inotify_rm_watch (__NR_Linux + 286)
|
||||||
|
#define __NR_migrate_pages (__NR_Linux + 287)
|
||||||
|
#define __NR_openat (__NR_Linux + 288)
|
||||||
|
#define __NR_mkdirat (__NR_Linux + 289)
|
||||||
|
#define __NR_mknodat (__NR_Linux + 290)
|
||||||
|
#define __NR_fchownat (__NR_Linux + 291)
|
||||||
|
#define __NR_futimesat (__NR_Linux + 292)
|
||||||
|
#define __NR_newfstatat (__NR_Linux + 293)
|
||||||
|
#define __NR_unlinkat (__NR_Linux + 294)
|
||||||
|
#define __NR_renameat (__NR_Linux + 295)
|
||||||
|
#define __NR_linkat (__NR_Linux + 296)
|
||||||
|
#define __NR_symlinkat (__NR_Linux + 297)
|
||||||
|
#define __NR_readlinkat (__NR_Linux + 298)
|
||||||
|
#define __NR_fchmodat (__NR_Linux + 299)
|
||||||
|
#define __NR_faccessat (__NR_Linux + 300)
|
||||||
|
#define __NR_pselect6 (__NR_Linux + 301)
|
||||||
|
#define __NR_ppoll (__NR_Linux + 302)
|
||||||
|
#define __NR_unshare (__NR_Linux + 303)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux o32 flavoured syscall
|
* Offset of the last Linux o32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 286
|
#define __NR_Linux_syscalls 303
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI32 */
|
||||||
|
|
||||||
#define __NR_O32_Linux 4000
|
#define __NR_O32_Linux 4000
|
||||||
#define __NR_O32_Linux_syscalls 283
|
#define __NR_O32_Linux_syscalls 303
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
#if _MIPS_SIM == _MIPS_SIM_ABI64
|
||||||
|
|
||||||
|
@ -571,16 +587,33 @@
|
||||||
#define __NR_inotify_init (__NR_Linux + 243)
|
#define __NR_inotify_init (__NR_Linux + 243)
|
||||||
#define __NR_inotify_add_watch (__NR_Linux + 244)
|
#define __NR_inotify_add_watch (__NR_Linux + 244)
|
||||||
#define __NR_inotify_rm_watch (__NR_Linux + 245)
|
#define __NR_inotify_rm_watch (__NR_Linux + 245)
|
||||||
|
#define __NR_migrate_pages (__NR_Linux + 246)
|
||||||
|
#define __NR_openat (__NR_Linux + 247)
|
||||||
|
#define __NR_mkdirat (__NR_Linux + 248)
|
||||||
|
#define __NR_mknodat (__NR_Linux + 249)
|
||||||
|
#define __NR_fchownat (__NR_Linux + 250)
|
||||||
|
#define __NR_futimesat (__NR_Linux + 251)
|
||||||
|
#define __NR_newfstatat (__NR_Linux + 252)
|
||||||
|
#define __NR_unlinkat (__NR_Linux + 253)
|
||||||
|
#define __NR_renameat (__NR_Linux + 254)
|
||||||
|
#define __NR_linkat (__NR_Linux + 255)
|
||||||
|
#define __NR_symlinkat (__NR_Linux + 256)
|
||||||
|
#define __NR_readlinkat (__NR_Linux + 257)
|
||||||
|
#define __NR_fchmodat (__NR_Linux + 258)
|
||||||
|
#define __NR_faccessat (__NR_Linux + 259)
|
||||||
|
#define __NR_pselect6 (__NR_Linux + 260)
|
||||||
|
#define __NR_ppoll (__NR_Linux + 261)
|
||||||
|
#define __NR_unshare (__NR_Linux + 262)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last Linux 64-bit flavoured syscall
|
* Offset of the last Linux 64-bit flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 245
|
#define __NR_Linux_syscalls 262
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_ABI64 */
|
||||||
|
|
||||||
#define __NR_64_Linux 5000
|
#define __NR_64_Linux 5000
|
||||||
#define __NR_64_Linux_syscalls 242
|
#define __NR_64_Linux_syscalls 262
|
||||||
|
|
||||||
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
#if _MIPS_SIM == _MIPS_SIM_NABI32
|
||||||
|
|
||||||
|
@ -838,16 +871,33 @@
|
||||||
#define __NR_inotify_init (__NR_Linux + 247)
|
#define __NR_inotify_init (__NR_Linux + 247)
|
||||||
#define __NR_inotify_add_watch (__NR_Linux + 248)
|
#define __NR_inotify_add_watch (__NR_Linux + 248)
|
||||||
#define __NR_inotify_rm_watch (__NR_Linux + 249)
|
#define __NR_inotify_rm_watch (__NR_Linux + 249)
|
||||||
|
#define __NR_migrate_pages (__NR_Linux + 250)
|
||||||
|
#define __NR_openat (__NR_Linux + 251)
|
||||||
|
#define __NR_mkdirat (__NR_Linux + 252)
|
||||||
|
#define __NR_mknodat (__NR_Linux + 253)
|
||||||
|
#define __NR_fchownat (__NR_Linux + 254)
|
||||||
|
#define __NR_futimesat (__NR_Linux + 255)
|
||||||
|
#define __NR_newfstatat (__NR_Linux + 256)
|
||||||
|
#define __NR_unlinkat (__NR_Linux + 257)
|
||||||
|
#define __NR_renameat (__NR_Linux + 258)
|
||||||
|
#define __NR_linkat (__NR_Linux + 259)
|
||||||
|
#define __NR_symlinkat (__NR_Linux + 260)
|
||||||
|
#define __NR_readlinkat (__NR_Linux + 261)
|
||||||
|
#define __NR_fchmodat (__NR_Linux + 262)
|
||||||
|
#define __NR_faccessat (__NR_Linux + 263)
|
||||||
|
#define __NR_pselect6 (__NR_Linux + 264)
|
||||||
|
#define __NR_ppoll (__NR_Linux + 265)
|
||||||
|
#define __NR_unshare (__NR_Linux + 266)
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* Offset of the last N32 flavoured syscall
|
* Offset of the last N32 flavoured syscall
|
||||||
*/
|
*/
|
||||||
#define __NR_Linux_syscalls 249
|
#define __NR_Linux_syscalls 266
|
||||||
|
|
||||||
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
#endif /* _MIPS_SIM == _MIPS_SIM_NABI32 */
|
||||||
|
|
||||||
#define __NR_N32_Linux 6000
|
#define __NR_N32_Linux 6000
|
||||||
#define __NR_N32_Linux_syscalls 246
|
#define __NR_N32_Linux_syscalls 266
|
||||||
|
|
||||||
#ifndef __ASSEMBLY__
|
#ifndef __ASSEMBLY__
|
||||||
|
|
||||||
|
|
Loading…
Reference in a new issue