Skip to content

Commit

Permalink
---
Browse files Browse the repository at this point in the history
yaml
---
r: 211544
b: refs/heads/master
c: 8f5a00e
h: refs/heads/master
v: v3
  • Loading branch information
Al Viro authored and Ralf Baechle committed Oct 18, 2010
1 parent 3b4a69c commit 38f165c
Show file tree
Hide file tree
Showing 8 changed files with 35 additions and 36 deletions.
2 changes: 1 addition & 1 deletion [refs]
Original file line number Diff line number Diff line change
@@ -1,2 +1,2 @@
---
refs/heads/master: e5b377a8fb7b05f27647698ac739a0504cb2bf80
refs/heads/master: 8f5a00eb422ed86e77bb8f67e08b9fe6d30f679a
1 change: 0 additions & 1 deletion trunk/arch/mips/kernel/branch.c
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@ int __compute_return_epc(struct pt_regs *regs)
return -EFAULT;
}

regs->regs[0] = 0;
switch (insn.i_format.opcode) {
/*
* jr and jalr are in r_format format.
Expand Down
9 changes: 4 additions & 5 deletions trunk/arch/mips/kernel/scall32-o32.S
Original file line number Diff line number Diff line change
Expand Up @@ -63,9 +63,9 @@ stack_done:
sw t0, PT_R7(sp) # set error flag
beqz t0, 1f

lw t1, PT_R2(sp) # syscall number
negu v0 # error
sw v0, PT_R0(sp) # set flag for syscall
# restarting
sw t1, PT_R0(sp) # save it for syscall restarting
1: sw v0, PT_R2(sp) # result

o32_syscall_exit:
Expand Down Expand Up @@ -104,9 +104,9 @@ syscall_trace_entry:
sw t0, PT_R7(sp) # set error flag
beqz t0, 1f

lw t1, PT_R2(sp) # syscall number
negu v0 # error
sw v0, PT_R0(sp) # set flag for syscall
# restarting
sw t1, PT_R0(sp) # save it for syscall restarting
1: sw v0, PT_R2(sp) # result

j syscall_exit
Expand Down Expand Up @@ -170,7 +170,6 @@ stackargs:
*/
bad_stack:
negu v0 # error
sw v0, PT_R0(sp)
sw v0, PT_R2(sp)
li t0, 1 # set error flag
sw t0, PT_R7(sp)
Expand Down
7 changes: 4 additions & 3 deletions trunk/arch/mips/kernel/scall64-64.S
Original file line number Diff line number Diff line change
Expand Up @@ -66,9 +66,9 @@ NESTED(handle_sys64, PT_SIZE, sp)
sd t0, PT_R7(sp) # set error flag
beqz t0, 1f

ld t1, PT_R2(sp) # syscall number
dnegu v0 # error
sd v0, PT_R0(sp) # set flag for syscall
# restarting
sd t1, PT_R0(sp) # save it for syscall restarting
1: sd v0, PT_R2(sp) # result

n64_syscall_exit:
Expand Down Expand Up @@ -109,8 +109,9 @@ syscall_trace_entry:
sd t0, PT_R7(sp) # set error flag
beqz t0, 1f

ld t1, PT_R2(sp) # syscall number
dnegu v0 # error
sd v0, PT_R0(sp) # set flag for syscall restarting
sd t1, PT_R0(sp) # save it for syscall restarting
1: sd v0, PT_R2(sp) # result

j syscall_exit
Expand Down
6 changes: 4 additions & 2 deletions trunk/arch/mips/kernel/scall64-n32.S
Original file line number Diff line number Diff line change
Expand Up @@ -65,8 +65,9 @@ NESTED(handle_sysn32, PT_SIZE, sp)
sd t0, PT_R7(sp) # set error flag
beqz t0, 1f

ld t1, PT_R2(sp) # syscall number
dnegu v0 # error
sd v0, PT_R0(sp) # set flag for syscall restarting
sd t1, PT_R0(sp) # save it for syscall restarting
1: sd v0, PT_R2(sp) # result

local_irq_disable # make sure need_resched and
Expand Down Expand Up @@ -106,8 +107,9 @@ n32_syscall_trace_entry:
sd t0, PT_R7(sp) # set error flag
beqz t0, 1f

ld t1, PT_R2(sp) # syscall number
dnegu v0 # error
sd v0, PT_R0(sp) # set flag for syscall restarting
sd t1, PT_R0(sp) # save it for syscall restarting
1: sd v0, PT_R2(sp) # result

j syscall_exit
Expand Down
7 changes: 4 additions & 3 deletions trunk/arch/mips/kernel/scall64-o32.S
Original file line number Diff line number Diff line change
Expand Up @@ -93,8 +93,9 @@ NESTED(handle_sys, PT_SIZE, sp)
sd t0, PT_R7(sp) # set error flag
beqz t0, 1f

ld t1, PT_R2(sp) # syscall number
dnegu v0 # error
sd v0, PT_R0(sp) # flag for syscall restarting
sd t1, PT_R0(sp) # save it for syscall restarting
1: sd v0, PT_R2(sp) # result

o32_syscall_exit:
Expand Down Expand Up @@ -142,8 +143,9 @@ trace_a_syscall:
sd t0, PT_R7(sp) # set error flag
beqz t0, 1f

ld t1, PT_R2(sp) # syscall number
dnegu v0 # error
sd v0, PT_R0(sp) # set flag for syscall restarting
sd t1, PT_R0(sp) # save it for syscall restarting
1: sd v0, PT_R2(sp) # result

j syscall_exit
Expand All @@ -155,7 +157,6 @@ trace_a_syscall:
*/
bad_stack:
dnegu v0 # error
sd v0, PT_R0(sp)
sd v0, PT_R2(sp)
li t0, 1 # set error flag
sd t0, PT_R7(sp)
Expand Down
37 changes: 18 additions & 19 deletions trunk/arch/mips/kernel/signal.c
Original file line number Diff line number Diff line change
Expand Up @@ -550,23 +550,26 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
struct mips_abi *abi = current->thread.abi;
void *vdso = current->mm->context.vdso;

switch(regs->regs[0]) {
case ERESTART_RESTARTBLOCK:
case ERESTARTNOHAND:
regs->regs[2] = EINTR;
break;
case ERESTARTSYS:
if (!(ka->sa.sa_flags & SA_RESTART)) {
if (regs->regs[0]) {
switch(regs->regs[2]) {
case ERESTART_RESTARTBLOCK:
case ERESTARTNOHAND:
regs->regs[2] = EINTR;
break;
case ERESTARTSYS:
if (!(ka->sa.sa_flags & SA_RESTART)) {
regs->regs[2] = EINTR;
break;
}
/* fallthrough */
case ERESTARTNOINTR:
regs->regs[7] = regs->regs[26];
regs->regs[2] = regs->regs[0];
regs->cp0_epc -= 4;
}
/* fallthrough */
case ERESTARTNOINTR: /* Userland will reload $v0. */
regs->regs[7] = regs->regs[26];
regs->cp0_epc -= 8;
}

regs->regs[0] = 0; /* Don't deal with this again. */
regs->regs[0] = 0; /* Don't deal with this again. */
}

if (sig_uses_siginfo(ka))
ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset,
Expand Down Expand Up @@ -625,17 +628,13 @@ static void do_signal(struct pt_regs *regs)
return;
}

/*
* Who's code doesn't conform to the restartable syscall convention
* dies here!!! The li instruction, a single machine instruction,
* must directly be followed by the syscall instruction.
*/
if (regs->regs[0]) {
if (regs->regs[2] == ERESTARTNOHAND ||
regs->regs[2] == ERESTARTSYS ||
regs->regs[2] == ERESTARTNOINTR) {
regs->regs[2] = regs->regs[0];
regs->regs[7] = regs->regs[26];
regs->cp0_epc -= 8;
regs->cp0_epc -= 4;
}
if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
regs->regs[2] = current->thread.abi->restart;
Expand Down
2 changes: 0 additions & 2 deletions trunk/arch/mips/kernel/unaligned.c
Original file line number Diff line number Diff line change
Expand Up @@ -109,8 +109,6 @@ static void emulate_load_store_insn(struct pt_regs *regs,
unsigned long value;
unsigned int res;

regs->regs[0] = 0;

/*
* This load never faults.
*/
Expand Down

0 comments on commit 38f165c

Please sign in to comment.