From 285a7c9fc14aa124dd9996e323733b5a1dcdba48 Mon Sep 17 00:00:00 2001 From: Miles Bader Date: Fri, 20 Dec 2002 06:18:24 -0800 Subject: [PATCH] [PATCH] Add v850 support for `sys_restart_syscall' --- arch/v850/kernel/entry.S | 2 +- arch/v850/kernel/signal.c | 35 +++++++++++++++++++++------------- include/asm-v850/current.h | 5 ++++- include/asm-v850/processor.h | 4 +++- include/asm-v850/thread_info.h | 20 ++++++++++--------- include/asm-v850/unistd.h | 1 + 6 files changed, 42 insertions(+), 25 deletions(-) diff --git a/arch/v850/kernel/entry.S b/arch/v850/kernel/entry.S index e5442bde9a7a..b2d2ae5b33be 100644 --- a/arch/v850/kernel/entry.S +++ b/arch/v850/kernel/entry.S @@ -781,7 +781,7 @@ C_END(trap_table) .align 4 C_DATA(sys_call_table): - .long CSYM(sys_ni_syscall) // 0 - old "setup()" system call + .long CSYM(sys_restart_syscall) // 0 .long CSYM(sys_exit) .long sys_fork_wrapper .long CSYM(sys_read) diff --git a/arch/v850/kernel/signal.c b/arch/v850/kernel/signal.c index ff96dd9de7c4..8ea0130c589e 100644 --- a/arch/v850/kernel/signal.c +++ b/arch/v850/kernel/signal.c @@ -439,19 +439,23 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset, if (PT_REGS_SYSCALL (regs)) { /* If so, check system call restarting.. */ switch (regs->gpr[GPR_RVAL]) { - case -ERESTARTNOHAND: + case -ERESTART_RESTARTBLOCK: + current_thread_info()->restart_block.fn = + do_no_restart_syscall; + /* fall through */ + case -ERESTARTNOHAND: + regs->gpr[GPR_RVAL] = -EINTR; + break; + + case -ERESTARTSYS: + if (!(ka->sa.sa_flags & SA_RESTART)) { regs->gpr[GPR_RVAL] = -EINTR; break; - - case -ERESTARTSYS: - if (!(ka->sa.sa_flags & SA_RESTART)) { - regs->gpr[GPR_RVAL] = -EINTR; - break; - } + } /* fallthrough */ - case -ERESTARTNOINTR: - regs->gpr[12] = PT_REGS_SYSCALL (regs); - regs->pc -= 4; /* Size of `trap 0' insn. */ + case -ERESTARTNOINTR: + regs->gpr[12] = PT_REGS_SYSCALL (regs); + regs->pc -= 4; /* Size of `trap 0' insn. */ } PT_REGS_SET_SYSCALL (regs, 0); @@ -510,14 +514,19 @@ int do_signal(struct pt_regs *regs, sigset_t *oldset) /* Did we come from a system call? */ if (PT_REGS_SYSCALL (regs)) { + int rval = (int)regs->gpr[GPR_RVAL]; /* Restart the system call - no handlers present */ - if (regs->gpr[GPR_RVAL] == (v850_reg_t)-ERESTARTNOHAND || - regs->gpr[GPR_RVAL] == (v850_reg_t)-ERESTARTSYS || - regs->gpr[GPR_RVAL] == (v850_reg_t)-ERESTARTNOINTR) + if (rval == -ERESTARTNOHAND + || rval == -ERESTARTSYS + || rval == -ERESTARTNOINTR) { regs->gpr[12] = PT_REGS_SYSCALL (regs); regs->pc -= 4; /* Size of `trap 0' insn. */ } + else if (rval == -ERESTART_RESTARTBLOCK) { + regs->gpr[12] = __NR_restart_syscall; + regs->pc -= 4; /* Size of `trap 0' insn. */ + } } return 0; } diff --git a/include/asm-v850/current.h b/include/asm-v850/current.h index 1d470a9b0bbd..30aae5673770 100644 --- a/include/asm-v850/current.h +++ b/include/asm-v850/current.h @@ -14,8 +14,11 @@ #ifndef __V850_CURRENT_H__ #define __V850_CURRENT_H__ +#ifndef __ASSEMBLY__ /* is not asm-safe. */ +#include +#endif + #include -#include /* Register used to hold the current task pointer while in the kernel. diff --git a/include/asm-v850/processor.h b/include/asm-v850/processor.h index 714b384412c6..978a1e1720f2 100644 --- a/include/asm-v850/processor.h +++ b/include/asm-v850/processor.h @@ -15,9 +15,11 @@ #define __V850_PROCESSOR_H__ #include +#ifndef __ASSEMBLY__ /* is not asm-safe. */ +#include +#endif #include -#include #include /* Some code expects `segment' stuff to be defined here. */ diff --git a/include/asm-v850/thread_info.h b/include/asm-v850/thread_info.h index be925c583037..3e20d565d5bd 100644 --- a/include/asm-v850/thread_info.h +++ b/include/asm-v850/thread_info.h @@ -31,15 +31,19 @@ struct thread_info { unsigned long flags; /* low level flags */ int cpu; /* cpu we're on */ int preempt_count; + struct restart_block restart_block; }; -#define INIT_THREAD_INFO(tsk) \ -{ \ - .task = &tsk, \ - .exec_domain = &default_exec_domain, \ - .flags = 0, \ - .cpu = 0, \ - .preempt_count = 1 \ +#define INIT_THREAD_INFO(tsk) \ +{ \ + .task = &tsk, \ + .exec_domain = &default_exec_domain, \ + .flags = 0, \ + .cpu = 0, \ + .preempt_count = 1, \ + .restart_block = { \ + .fn = do_no_restart_syscall, \ + }, \ } #define init_thread_info (init_thread_union.thread_info) @@ -67,8 +71,6 @@ struct thread_info { #define TI_FLAGS 8 #define TI_CPU 12 #define TI_PREEMPT 16 -#define TI_SOFTIRQ 20 -#define TI_HARDIRQ 24 #define PREEMPT_ACTIVE 0x4000000 diff --git a/include/asm-v850/unistd.h b/include/asm-v850/unistd.h index 93939f4124d9..8eb57aef6db5 100644 --- a/include/asm-v850/unistd.h +++ b/include/asm-v850/unistd.h @@ -16,6 +16,7 @@ #include +#define __NR_restart_syscall 0 #define __NR_exit 1 #define __NR_fork 2 #define __NR_read 3 -- 2.39.5