Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus

* 'upstream' of git://git.linux-mips.org/pub/scm/upstream-linus:
  MIPS: Enable ISA_DMA_API config to fix build failure
  MIPS: 32-bit: Fix build failure in asm/fcntl.h
  MIPS: Remove all generated vmlinuz* files on "make clean"
  MIPS: do_sigaltstack() expects userland pointers
  MIPS: Fix error values in case of bad_stack
  MIPS: Sanitize restart logics
  MIPS: secure_computing, syscall audit: syscall number should in r2, not r0.
  MIPS: Don't block signals if we'd failed to setup a sigframe
This commit is contained in:
Linus Torvalds 2010-10-18 13:10:36 -07:00
commit 547af560dd
12 changed files with 53 additions and 44 deletions

View File

@ -881,11 +881,15 @@ config NO_IOPORT
config GENERIC_ISA_DMA config GENERIC_ISA_DMA
bool bool
select ZONE_DMA if GENERIC_ISA_DMA_SUPPORT_BROKEN=n select ZONE_DMA if GENERIC_ISA_DMA_SUPPORT_BROKEN=n
select ISA_DMA_API
config GENERIC_ISA_DMA_SUPPORT_BROKEN config GENERIC_ISA_DMA_SUPPORT_BROKEN
bool bool
select GENERIC_ISA_DMA select GENERIC_ISA_DMA
config ISA_DMA_API
bool
config GENERIC_GPIO config GENERIC_GPIO
bool bool

View File

@ -105,4 +105,4 @@ OBJCOPYFLAGS_vmlinuz.srec := $(OBJCOPYFLAGS) -S -O srec
vmlinuz.srec: vmlinuz vmlinuz.srec: vmlinuz
$(call cmd,objcopy) $(call cmd,objcopy)
clean-files := $(objtree)/vmlinuz.* clean-files := $(objtree)/vmlinuz $(objtree)/vmlinuz.{32,ecoff,bin,srec}

View File

@ -56,6 +56,7 @@
*/ */
#ifdef CONFIG_32BIT #ifdef CONFIG_32BIT
#include <linux/types.h>
struct flock { struct flock {
short l_type; short l_type;

View File

@ -40,7 +40,6 @@ int __compute_return_epc(struct pt_regs *regs)
return -EFAULT; return -EFAULT;
} }
regs->regs[0] = 0;
switch (insn.i_format.opcode) { switch (insn.i_format.opcode) {
/* /*
* jr and jalr are in r_format format. * jr and jalr are in r_format format.

View File

@ -536,7 +536,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
{ {
/* do the secure computing check first */ /* do the secure computing check first */
if (!entryexit) if (!entryexit)
secure_computing(regs->regs[0]); secure_computing(regs->regs[2]);
if (unlikely(current->audit_context) && entryexit) if (unlikely(current->audit_context) && entryexit)
audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]), audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]),
@ -565,7 +565,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
out: out:
if (unlikely(current->audit_context) && !entryexit) if (unlikely(current->audit_context) && !entryexit)
audit_syscall_entry(audit_arch(), regs->regs[0], audit_syscall_entry(audit_arch(), regs->regs[2],
regs->regs[4], regs->regs[5], regs->regs[4], regs->regs[5],
regs->regs[6], regs->regs[7]); regs->regs[6], regs->regs[7]);
} }

View File

@ -63,9 +63,9 @@ stack_done:
sw t0, PT_R7(sp) # set error flag sw t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
lw t1, PT_R2(sp) # syscall number
negu v0 # error negu v0 # error
sw v0, PT_R0(sp) # set flag for syscall sw t1, PT_R0(sp) # save it for syscall restarting
# restarting
1: sw v0, PT_R2(sp) # result 1: sw v0, PT_R2(sp) # result
o32_syscall_exit: o32_syscall_exit:
@ -104,9 +104,9 @@ syscall_trace_entry:
sw t0, PT_R7(sp) # set error flag sw t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
lw t1, PT_R2(sp) # syscall number
negu v0 # error negu v0 # error
sw v0, PT_R0(sp) # set flag for syscall sw t1, PT_R0(sp) # save it for syscall restarting
# restarting
1: sw v0, PT_R2(sp) # result 1: sw v0, PT_R2(sp) # result
j syscall_exit j syscall_exit
@ -169,8 +169,7 @@ stackargs:
* We probably should handle this case a bit more drastic. * We probably should handle this case a bit more drastic.
*/ */
bad_stack: bad_stack:
negu v0 # error li v0, EFAULT
sw v0, PT_R0(sp)
sw v0, PT_R2(sp) sw v0, PT_R2(sp)
li t0, 1 # set error flag li t0, 1 # set error flag
sw t0, PT_R7(sp) sw t0, PT_R7(sp)

View File

@ -66,9 +66,9 @@ NESTED(handle_sys64, PT_SIZE, sp)
sd t0, PT_R7(sp) # set error flag sd t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
ld t1, PT_R2(sp) # syscall number
dnegu v0 # error dnegu v0 # error
sd v0, PT_R0(sp) # set flag for syscall sd t1, PT_R0(sp) # save it for syscall restarting
# restarting
1: sd v0, PT_R2(sp) # result 1: sd v0, PT_R2(sp) # result
n64_syscall_exit: n64_syscall_exit:
@ -109,8 +109,9 @@ syscall_trace_entry:
sd t0, PT_R7(sp) # set error flag sd t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
ld t1, PT_R2(sp) # syscall number
dnegu v0 # error 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 1: sd v0, PT_R2(sp) # result
j syscall_exit j syscall_exit

View File

@ -65,8 +65,9 @@ NESTED(handle_sysn32, PT_SIZE, sp)
sd t0, PT_R7(sp) # set error flag sd t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
ld t1, PT_R2(sp) # syscall number
dnegu v0 # error 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 1: sd v0, PT_R2(sp) # result
local_irq_disable # make sure need_resched and local_irq_disable # make sure need_resched and
@ -106,8 +107,9 @@ n32_syscall_trace_entry:
sd t0, PT_R7(sp) # set error flag sd t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
ld t1, PT_R2(sp) # syscall number
dnegu v0 # error 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 1: sd v0, PT_R2(sp) # result
j syscall_exit j syscall_exit

View File

@ -93,8 +93,9 @@ NESTED(handle_sys, PT_SIZE, sp)
sd t0, PT_R7(sp) # set error flag sd t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
ld t1, PT_R2(sp) # syscall number
dnegu v0 # error 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 1: sd v0, PT_R2(sp) # result
o32_syscall_exit: o32_syscall_exit:
@ -142,8 +143,9 @@ trace_a_syscall:
sd t0, PT_R7(sp) # set error flag sd t0, PT_R7(sp) # set error flag
beqz t0, 1f beqz t0, 1f
ld t1, PT_R2(sp) # syscall number
dnegu v0 # error 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 1: sd v0, PT_R2(sp) # result
j syscall_exit j syscall_exit
@ -154,8 +156,7 @@ trace_a_syscall:
* The stackpointer for a call with more than 4 arguments is bad. * The stackpointer for a call with more than 4 arguments is bad.
*/ */
bad_stack: bad_stack:
dnegu v0 # error li v0, EFAULT
sd v0, PT_R0(sp)
sd v0, PT_R2(sp) sd v0, PT_R2(sp)
li t0, 1 # set error flag li t0, 1 # set error flag
sd t0, PT_R7(sp) sd t0, PT_R7(sp)

View File

@ -390,7 +390,6 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe __user *frame; struct rt_sigframe __user *frame;
sigset_t set; sigset_t set;
stack_t st;
int sig; int sig;
frame = (struct rt_sigframe __user *) regs.regs[29]; frame = (struct rt_sigframe __user *) regs.regs[29];
@ -411,11 +410,9 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
else if (sig) else if (sig)
force_sig(sig, current); force_sig(sig, current);
if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
goto badframe;
/* It is more difficult to avoid calling this function than to /* It is more difficult to avoid calling this function than to
call it and ignore errors. */ call it and ignore errors. */
do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs.regs[29]);
/* /*
* Don't let your children do this ... * Don't let your children do this ...
@ -550,7 +547,8 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
struct mips_abi *abi = current->thread.abi; struct mips_abi *abi = current->thread.abi;
void *vdso = current->mm->context.vdso; void *vdso = current->mm->context.vdso;
switch(regs->regs[0]) { if (regs->regs[0]) {
switch(regs->regs[2]) {
case ERESTART_RESTARTBLOCK: case ERESTART_RESTARTBLOCK:
case ERESTARTNOHAND: case ERESTARTNOHAND:
regs->regs[2] = EINTR; regs->regs[2] = EINTR;
@ -561,12 +559,14 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
break; break;
} }
/* fallthrough */ /* fallthrough */
case ERESTARTNOINTR: /* Userland will reload $v0. */ case ERESTARTNOINTR:
regs->regs[7] = regs->regs[26]; regs->regs[7] = regs->regs[26];
regs->cp0_epc -= 8; regs->regs[2] = regs->regs[0];
regs->cp0_epc -= 4;
} }
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)) if (sig_uses_siginfo(ka))
ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset, ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset,
@ -575,6 +575,9 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
ret = abi->setup_frame(vdso + abi->signal_return_offset, ret = abi->setup_frame(vdso + abi->signal_return_offset,
ka, regs, sig, oldset); ka, regs, sig, oldset);
if (ret)
return ret;
spin_lock_irq(&current->sighand->siglock); spin_lock_irq(&current->sighand->siglock);
sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask); sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
if (!(ka->sa.sa_flags & SA_NODEFER)) if (!(ka->sa.sa_flags & SA_NODEFER))
@ -622,17 +625,13 @@ static void do_signal(struct pt_regs *regs)
return; 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[0]) {
if (regs->regs[2] == ERESTARTNOHAND || if (regs->regs[2] == ERESTARTNOHAND ||
regs->regs[2] == ERESTARTSYS || regs->regs[2] == ERESTARTSYS ||
regs->regs[2] == ERESTARTNOINTR) { regs->regs[2] == ERESTARTNOINTR) {
regs->regs[2] = regs->regs[0];
regs->regs[7] = regs->regs[26]; regs->regs[7] = regs->regs[26];
regs->cp0_epc -= 8; regs->cp0_epc -= 4;
} }
if (regs->regs[2] == ERESTART_RESTARTBLOCK) { if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
regs->regs[2] = current->thread.abi->restart; regs->regs[2] = current->thread.abi->restart;

View File

@ -109,6 +109,7 @@ asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs) asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
{ {
struct rt_sigframe_n32 __user *frame; struct rt_sigframe_n32 __user *frame;
mm_segment_t old_fs;
sigset_t set; sigset_t set;
stack_t st; stack_t st;
s32 sp; s32 sp;
@ -143,7 +144,11 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
/* It is more difficult to avoid calling this function than to /* It is more difficult to avoid calling this function than to
call it and ignore errors. */ call it and ignore errors. */
old_fs = get_fs();
set_fs(KERNEL_DS);
do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]); do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
set_fs(old_fs);
/* /*
* Don't let your children do this ... * Don't let your children do this ...

View File

@ -109,8 +109,6 @@ static void emulate_load_store_insn(struct pt_regs *regs,
unsigned long value; unsigned long value;
unsigned int res; unsigned int res;
regs->regs[0] = 0;
/* /*
* This load never faults. * This load never faults.
*/ */