if (TRAP(regs) == 0x0C00 /* System Call! */
&& ((int)regs->result == -ERESTARTNOHAND ||
+ (int)regs->result == -ERESTART_RESTARTBLOCK ||
((int)regs->result == -ERESTARTSYS &&
!(ka->sa.sa_flags & SA_RESTART)))) {
+ if ((int)regs->result == -ERESTART_RESTARTBLOCK)
+ current_thread_info()->restart_block.fn
+ = do_no_restart_syscall;
regs->result = -EINTR;
regs->gpr[3] = EINTR;
regs->ccr |= 0x10000000;
handle_signal(signr, &info, oldset, regs, &newsp, frame);
}
- if (TRAP(regs) == 0x0C00 /* System Call! */ &&
- ((int)regs->result == -ERESTARTNOHAND ||
- (int)regs->result == -ERESTARTSYS ||
- (int)regs->result == -ERESTARTNOINTR)) {
- regs->gpr[3] = regs->orig_gpr3;
- regs->nip -= 4; /* Back up & retry system call */
- regs->result = 0;
+ if (TRAP(regs) == 0x0C00) { /* System Call! */
+ if ((int)regs->result == -ERESTARTNOHAND ||
+ (int)regs->result == -ERESTARTSYS ||
+ (int)regs->result == -ERESTARTNOINTR) {
+ regs->gpr[3] = regs->orig_gpr3;
+ regs->nip -= 4; /* Back up & retry system call */
+ regs->result = 0;
+ } else if ((int)regs->result == -ERESTART_RESTARTBLOCK) {
+ regs->gpr[0] = __NR_restart_syscall;
+ regs->nip -= 4;
+ regs->result = 0;
+ }
}
if (newsp == frame)
#undef EDEADLOCK
#define EDEADLOCK 58 /* File locking deadlock error */
-/* Should never be seen by user programs */
-#define ERESTARTSYS 512
-#define ERESTARTNOINTR 513
-#define ERESTARTNOHAND 514 /* restart if no handler.. */
-#define ENOIOCTLCMD 515 /* No ioctl command */
-
-#define _LAST_ERRNO 515
+#define _LAST_ERRNO 516
#endif
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) \
.exec_domain = &default_exec_domain, \
.flags = 0, \
.cpu = 0, \
- .preempt_count = 1 \
+ .preempt_count = 1, \
+ .restart_block = { \
+ .fn = do_no_restart_syscall, \
+ }, \
}
#define init_thread_info (init_thread_union.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