Commit 8f6e29c0 authored by Steve French's avatar Steve French

Merge bk://linux.bkbits.net/linux-2.5

into hostme.bitkeeper.com:/repos/c/cifs/linux-2.5cifs
parents 10fafa39 5ada03a9
...@@ -132,6 +132,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax ...@@ -132,6 +132,9 @@ restore_sigcontext(struct pt_regs *regs, struct sigcontext __user *sc, int *peax
{ {
unsigned int err = 0; unsigned int err = 0;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
#define COPY(x) err |= __get_user(regs->x, &sc->x) #define COPY(x) err |= __get_user(regs->x, &sc->x)
#define COPY_SEG(seg) \ #define COPY_SEG(seg) \
...@@ -504,9 +507,6 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset, ...@@ -504,9 +507,6 @@ handle_signal(unsigned long sig, siginfo_t *info, sigset_t *oldset,
{ {
struct k_sigaction *ka = &current->sighand->action[sig-1]; struct k_sigaction *ka = &current->sighand->action[sig-1];
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
/* Are we from a system call? */ /* Are we from a system call? */
if (regs->orig_eax >= 0) { if (regs->orig_eax >= 0) {
/* If so, check system call restarting.. */ /* If so, check system call restarting.. */
......
...@@ -416,10 +416,10 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set ...@@ -416,10 +416,10 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
;; ;;
ld8 r18=[r18] // r18 <- current->pending.signal ld8 r18=[r18] // r18 <- current->pending.signal
.pred.rel.mutex p6,p7,p8 .pred.rel.mutex p6,p7,p8
(p6) or r3=r3,r14 // SIG_BLOCK (p6) or r14=r3,r14 // SIG_BLOCK
(p7) andcm r3=r3,r14 // SIG_UNBLOCK (p7) andcm r14=r3,r14 // SIG_UNBLOCK
(p8) mov r3=r14 // SIG_SETMASK (p8) mov r14=r14 // SIG_SETMASK
(p6) mov r8=0 // clear error code (p6) mov r8=0 // clear error code
// recalc_sigpending() // recalc_sigpending()
add r17=IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,r19 add r17=IA64_SIGNAL_GROUP_STOP_COUNT_OFFSET,r19
...@@ -437,7 +437,7 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set ...@@ -437,7 +437,7 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
or r18=r18,r19 // r18 <- current->pending | current->signal->shared_pending or r18=r18,r19 // r18 <- current->pending | current->signal->shared_pending
;; ;;
// r18 <- (current->pending | current->signal->shared_pending) & ~current->blocked: // r18 <- (current->pending | current->signal->shared_pending) & ~current->blocked:
andcm r18=r18,r3 andcm r18=r18,r14
add r9=TI_FLAGS+IA64_TASK_SIZE,r16 add r9=TI_FLAGS+IA64_TASK_SIZE,r16
;; ;;
...@@ -452,7 +452,7 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set ...@@ -452,7 +452,7 @@ EX(.fail_efault, ld8 r14=[r33]) // r14 <- *set
and r18=~_TIF_SIGPENDING,r17 // r18 <- r17 & ~(1 << TIF_SIGPENDING) and r18=~_TIF_SIGPENDING,r17 // r18 <- r17 & ~(1 << TIF_SIGPENDING)
;; ;;
st8 [r2]=r3 // update current->blocked with new mask st8 [r2]=r14 // update current->blocked with new mask
cmpxchg4.acq r14=[r9],r18,ar.ccv // current->thread_info->flags <- r18 cmpxchg4.acq r14=[r9],r18,ar.ccv // current->thread_info->flags <- r18
;; ;;
cmp.ne p6,p0=r17,r14 // update failed? cmp.ne p6,p0=r17,r14 // update failed?
......
...@@ -170,8 +170,6 @@ _GLOBAL(DoSyscall) ...@@ -170,8 +170,6 @@ _GLOBAL(DoSyscall)
#ifdef SHOW_SYSCALLS #ifdef SHOW_SYSCALLS
bl do_show_syscall bl do_show_syscall
#endif /* SHOW_SYSCALLS */ #endif /* SHOW_SYSCALLS */
cmpli 0,r0,NR_syscalls
bge- 66f
rlwinm r10,r1,0,0,18 /* current_thread_info() */ rlwinm r10,r1,0,0,18 /* current_thread_info() */
lwz r11,TI_FLAGS(r10) lwz r11,TI_FLAGS(r10)
rlwinm r11,r11,0,~_TIF_FORCE_NOERROR rlwinm r11,r11,0,~_TIF_FORCE_NOERROR
...@@ -179,9 +177,11 @@ _GLOBAL(DoSyscall) ...@@ -179,9 +177,11 @@ _GLOBAL(DoSyscall)
andi. r11,r11,_TIF_SYSCALL_TRACE andi. r11,r11,_TIF_SYSCALL_TRACE
bne- syscall_dotrace bne- syscall_dotrace
syscall_dotrace_cont: syscall_dotrace_cont:
cmpli 0,r0,NR_syscalls
lis r10,sys_call_table@h lis r10,sys_call_table@h
ori r10,r10,sys_call_table@l ori r10,r10,sys_call_table@l
slwi r0,r0,2 slwi r0,r0,2
bge- 66f
lwzx r10,r10,r0 /* Fetch system call handler [ptr] */ lwzx r10,r10,r0 /* Fetch system call handler [ptr] */
mtlr r10 mtlr r10
addi r9,r1,STACK_FRAME_OVERHEAD addi r9,r1,STACK_FRAME_OVERHEAD
...@@ -200,7 +200,7 @@ ret_from_syscall: ...@@ -200,7 +200,7 @@ ret_from_syscall:
andi. r11,r11,_TIF_FORCE_NOERROR andi. r11,r11,_TIF_FORCE_NOERROR
bne 30f bne 30f
neg r3,r3 neg r3,r3
22: lwz r10,_CCR(r1) /* Set SO bit in CR */ lwz r10,_CCR(r1) /* Set SO bit in CR */
oris r10,r10,0x1000 oris r10,r10,0x1000
stw r10,_CCR(r1) stw r10,_CCR(r1)
...@@ -233,8 +233,8 @@ syscall_exit_cont: ...@@ -233,8 +233,8 @@ syscall_exit_cont:
SYNC SYNC
RFI RFI
66: li r3,ENOSYS 66: li r3,-ENOSYS
b 22b b ret_from_syscall
.globl ret_from_fork .globl ret_from_fork
ret_from_fork: ret_from_fork:
......
...@@ -418,6 +418,9 @@ int sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, ...@@ -418,6 +418,9 @@ int sys_rt_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
{ {
struct rt_sigframe __user *rt_sf; struct rt_sigframe __user *rt_sf;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
rt_sf = (struct rt_sigframe __user *) rt_sf = (struct rt_sigframe __user *)
(regs->gpr[1] + __SIGNAL_FRAMESIZE + 16); (regs->gpr[1] + __SIGNAL_FRAMESIZE + 16);
if (verify_area(VERIFY_READ, rt_sf, sizeof(struct rt_sigframe))) if (verify_area(VERIFY_READ, rt_sf, sizeof(struct rt_sigframe)))
...@@ -513,6 +516,9 @@ int sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8, ...@@ -513,6 +516,9 @@ int sys_sigreturn(int r3, int r4, int r5, int r6, int r7, int r8,
struct mcontext __user *sr; struct mcontext __user *sr;
sigset_t set; sigset_t set;
/* Always make any pending restarted system calls return -EINTR */
current_thread_info()->restart_block.fn = do_no_restart_syscall;
sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE); sc = (struct sigcontext __user *)(regs->gpr[1] + __SIGNAL_FRAMESIZE);
if (copy_from_user(&sigctx, sc, sizeof(sigctx))) if (copy_from_user(&sigctx, sc, sizeof(sigctx)))
goto badframe; goto badframe;
...@@ -569,10 +575,6 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs) ...@@ -569,10 +575,6 @@ int do_signal(sigset_t *oldset, struct pt_regs *regs)
regs->result = -EINTR; regs->result = -EINTR;
regs->gpr[3] = EINTR; regs->gpr[3] = EINTR;
/* note that the cr0.SO bit is already set */ /* note that the cr0.SO bit is already set */
/* clear any restart function that was set */
if (ret == ERESTART_RESTARTBLOCK)
current_thread_info()->restart_block.fn
= do_no_restart_syscall;
} else { } else {
regs->nip -= 4; /* Back up & retry system call */ regs->nip -= 4; /* Back up & retry system call */
regs->result = 0; regs->result = 0;
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment