m68k: Wire up sys_restart_syscall
Make restart blocks working, required for proper syscall restarting. Signed-off-by: Andreas Schwab <schwab@suse.de> Signed-off-by: Geert Uytterhoeven <geert@linux-m68k.org>
This commit is contained in:
parent
1fa0b29f3a
commit
c162564ebf
@ -424,7 +424,7 @@ resume:
|
|||||||
.data
|
.data
|
||||||
ALIGN
|
ALIGN
|
||||||
sys_call_table:
|
sys_call_table:
|
||||||
.long sys_ni_syscall /* 0 - old "setup()" system call*/
|
.long sys_restart_syscall /* 0 - old "setup()" system call, used for restarting */
|
||||||
.long sys_exit
|
.long sys_exit
|
||||||
.long sys_fork
|
.long sys_fork
|
||||||
.long sys_read
|
.long sys_read
|
||||||
|
@ -326,6 +326,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *usc, void __u
|
|||||||
struct sigcontext context;
|
struct sigcontext context;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
|
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||||
|
|
||||||
/* get previous context */
|
/* get previous context */
|
||||||
if (copy_from_user(&context, usc, sizeof(context)))
|
if (copy_from_user(&context, usc, sizeof(context)))
|
||||||
goto badframe;
|
goto badframe;
|
||||||
@ -411,6 +414,9 @@ rt_restore_ucontext(struct pt_regs *regs, struct switch_stack *sw,
|
|||||||
unsigned long usp;
|
unsigned long usp;
|
||||||
int err;
|
int err;
|
||||||
|
|
||||||
|
/* Always make any pending restarted system calls return -EINTR */
|
||||||
|
current_thread_info()->restart_block.fn = do_no_restart_syscall;
|
||||||
|
|
||||||
err = __get_user(temp, &uc->uc_mcontext.version);
|
err = __get_user(temp, &uc->uc_mcontext.version);
|
||||||
if (temp != MCONTEXT_VERSION)
|
if (temp != MCONTEXT_VERSION)
|
||||||
goto badframe;
|
goto badframe;
|
||||||
@ -937,6 +943,15 @@ handle_restart(struct pt_regs *regs, struct k_sigaction *ka, int has_handler)
|
|||||||
regs->d0 = -EINTR;
|
regs->d0 = -EINTR;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
|
case -ERESTART_RESTARTBLOCK:
|
||||||
|
if (!has_handler) {
|
||||||
|
regs->d0 = __NR_restart_syscall;
|
||||||
|
regs->pc -= 2;
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
regs->d0 = -EINTR;
|
||||||
|
break;
|
||||||
|
|
||||||
case -ERESTARTSYS:
|
case -ERESTARTSYS:
|
||||||
if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
|
if (has_handler && !(ka->sa.sa_flags & SA_RESTART)) {
|
||||||
regs->d0 = -EINTR;
|
regs->d0 = -EINTR;
|
||||||
|
@ -5,6 +5,7 @@
|
|||||||
* This file contains the system call numbers.
|
* This file contains the system call numbers.
|
||||||
*/
|
*/
|
||||||
|
|
||||||
|
#define __NR_restart_syscall 0
|
||||||
#define __NR_exit 1
|
#define __NR_exit 1
|
||||||
#define __NR_fork 2
|
#define __NR_fork 2
|
||||||
#define __NR_read 3
|
#define __NR_read 3
|
||||||
@ -359,9 +360,6 @@
|
|||||||
#define __ARCH_WANT_SYS_SIGPROCMASK
|
#define __ARCH_WANT_SYS_SIGPROCMASK
|
||||||
#define __ARCH_WANT_SYS_RT_SIGACTION
|
#define __ARCH_WANT_SYS_RT_SIGACTION
|
||||||
|
|
||||||
/* whitelist for checksyscalls */
|
|
||||||
#define __IGNORE_restart_syscall
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* "Conditional" syscalls
|
* "Conditional" syscalls
|
||||||
*
|
*
|
||||||
|
Loading…
Reference in New Issue
Block a user