Commit 547af560ddbfe469ada2cad3009cbcfde313d73c

Authored by Linus Torvalds

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

Showing 12 changed files Side-by-side Diff

... ... @@ -881,10 +881,14 @@
881 881 config GENERIC_ISA_DMA
882 882 bool
883 883 select ZONE_DMA if GENERIC_ISA_DMA_SUPPORT_BROKEN=n
  884 + select ISA_DMA_API
884 885  
885 886 config GENERIC_ISA_DMA_SUPPORT_BROKEN
886 887 bool
887 888 select GENERIC_ISA_DMA
  889 +
  890 +config ISA_DMA_API
  891 + bool
888 892  
889 893 config GENERIC_GPIO
890 894 bool
arch/mips/boot/compressed/Makefile
... ... @@ -105,5 +105,5 @@
105 105 vmlinuz.srec: vmlinuz
106 106 $(call cmd,objcopy)
107 107  
108   -clean-files := $(objtree)/vmlinuz.*
  108 +clean-files := $(objtree)/vmlinuz $(objtree)/vmlinuz.{32,ecoff,bin,srec}
arch/mips/include/asm/fcntl.h
... ... @@ -56,6 +56,7 @@
56 56 */
57 57  
58 58 #ifdef CONFIG_32BIT
  59 +#include <linux/types.h>
59 60  
60 61 struct flock {
61 62 short l_type;
arch/mips/kernel/branch.c
... ... @@ -40,7 +40,6 @@
40 40 return -EFAULT;
41 41 }
42 42  
43   - regs->regs[0] = 0;
44 43 switch (insn.i_format.opcode) {
45 44 /*
46 45 * jr and jalr are in r_format format.
arch/mips/kernel/ptrace.c
... ... @@ -536,7 +536,7 @@
536 536 {
537 537 /* do the secure computing check first */
538 538 if (!entryexit)
539   - secure_computing(regs->regs[0]);
  539 + secure_computing(regs->regs[2]);
540 540  
541 541 if (unlikely(current->audit_context) && entryexit)
542 542 audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]),
... ... @@ -565,7 +565,7 @@
565 565  
566 566 out:
567 567 if (unlikely(current->audit_context) && !entryexit)
568   - audit_syscall_entry(audit_arch(), regs->regs[0],
  568 + audit_syscall_entry(audit_arch(), regs->regs[2],
569 569 regs->regs[4], regs->regs[5],
570 570 regs->regs[6], regs->regs[7]);
571 571 }
arch/mips/kernel/scall32-o32.S
... ... @@ -63,9 +63,9 @@
63 63 sw t0, PT_R7(sp) # set error flag
64 64 beqz t0, 1f
65 65  
  66 + lw t1, PT_R2(sp) # syscall number
66 67 negu v0 # error
67   - sw v0, PT_R0(sp) # set flag for syscall
68   - # restarting
  68 + sw t1, PT_R0(sp) # save it for syscall restarting
69 69 1: sw v0, PT_R2(sp) # result
70 70  
71 71 o32_syscall_exit:
72 72  
... ... @@ -104,9 +104,9 @@
104 104 sw t0, PT_R7(sp) # set error flag
105 105 beqz t0, 1f
106 106  
  107 + lw t1, PT_R2(sp) # syscall number
107 108 negu v0 # error
108   - sw v0, PT_R0(sp) # set flag for syscall
109   - # restarting
  109 + sw t1, PT_R0(sp) # save it for syscall restarting
110 110 1: sw v0, PT_R2(sp) # result
111 111  
112 112 j syscall_exit
... ... @@ -169,8 +169,7 @@
169 169 * We probably should handle this case a bit more drastic.
170 170 */
171 171 bad_stack:
172   - negu v0 # error
173   - sw v0, PT_R0(sp)
  172 + li v0, EFAULT
174 173 sw v0, PT_R2(sp)
175 174 li t0, 1 # set error flag
176 175 sw t0, PT_R7(sp)
arch/mips/kernel/scall64-64.S
... ... @@ -66,9 +66,9 @@
66 66 sd t0, PT_R7(sp) # set error flag
67 67 beqz t0, 1f
68 68  
  69 + ld t1, PT_R2(sp) # syscall number
69 70 dnegu v0 # error
70   - sd v0, PT_R0(sp) # set flag for syscall
71   - # restarting
  71 + sd t1, PT_R0(sp) # save it for syscall restarting
72 72 1: sd v0, PT_R2(sp) # result
73 73  
74 74 n64_syscall_exit:
75 75  
... ... @@ -109,8 +109,9 @@
109 109 sd t0, PT_R7(sp) # set error flag
110 110 beqz t0, 1f
111 111  
  112 + ld t1, PT_R2(sp) # syscall number
112 113 dnegu v0 # error
113   - sd v0, PT_R0(sp) # set flag for syscall restarting
  114 + sd t1, PT_R0(sp) # save it for syscall restarting
114 115 1: sd v0, PT_R2(sp) # result
115 116  
116 117 j syscall_exit
arch/mips/kernel/scall64-n32.S
... ... @@ -65,8 +65,9 @@
65 65 sd t0, PT_R7(sp) # set error flag
66 66 beqz t0, 1f
67 67  
  68 + ld t1, PT_R2(sp) # syscall number
68 69 dnegu v0 # error
69   - sd v0, PT_R0(sp) # set flag for syscall restarting
  70 + sd t1, PT_R0(sp) # save it for syscall restarting
70 71 1: sd v0, PT_R2(sp) # result
71 72  
72 73 local_irq_disable # make sure need_resched and
73 74  
... ... @@ -106,8 +107,9 @@
106 107 sd t0, PT_R7(sp) # set error flag
107 108 beqz t0, 1f
108 109  
  110 + ld t1, PT_R2(sp) # syscall number
109 111 dnegu v0 # error
110   - sd v0, PT_R0(sp) # set flag for syscall restarting
  112 + sd t1, PT_R0(sp) # save it for syscall restarting
111 113 1: sd v0, PT_R2(sp) # result
112 114  
113 115 j syscall_exit
arch/mips/kernel/scall64-o32.S
... ... @@ -93,8 +93,9 @@
93 93 sd t0, PT_R7(sp) # set error flag
94 94 beqz t0, 1f
95 95  
  96 + ld t1, PT_R2(sp) # syscall number
96 97 dnegu v0 # error
97   - sd v0, PT_R0(sp) # flag for syscall restarting
  98 + sd t1, PT_R0(sp) # save it for syscall restarting
98 99 1: sd v0, PT_R2(sp) # result
99 100  
100 101 o32_syscall_exit:
101 102  
... ... @@ -142,8 +143,9 @@
142 143 sd t0, PT_R7(sp) # set error flag
143 144 beqz t0, 1f
144 145  
  146 + ld t1, PT_R2(sp) # syscall number
145 147 dnegu v0 # error
146   - sd v0, PT_R0(sp) # set flag for syscall restarting
  148 + sd t1, PT_R0(sp) # save it for syscall restarting
147 149 1: sd v0, PT_R2(sp) # result
148 150  
149 151 j syscall_exit
... ... @@ -154,8 +156,7 @@
154 156 * The stackpointer for a call with more than 4 arguments is bad.
155 157 */
156 158 bad_stack:
157   - dnegu v0 # error
158   - sd v0, PT_R0(sp)
  159 + li v0, EFAULT
159 160 sd v0, PT_R2(sp)
160 161 li t0, 1 # set error flag
161 162 sd t0, PT_R7(sp)
arch/mips/kernel/signal.c
... ... @@ -390,7 +390,6 @@
390 390 {
391 391 struct rt_sigframe __user *frame;
392 392 sigset_t set;
393   - stack_t st;
394 393 int sig;
395 394  
396 395 frame = (struct rt_sigframe __user *) regs.regs[29];
397 396  
... ... @@ -411,11 +410,9 @@
411 410 else if (sig)
412 411 force_sig(sig, current);
413 412  
414   - if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
415   - goto badframe;
416 413 /* It is more difficult to avoid calling this function than to
417 414 call it and ignore errors. */
418   - do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
  415 + do_sigaltstack(&frame->rs_uc.uc_stack, NULL, regs.regs[29]);
419 416  
420 417 /*
421 418 * Don't let your children do this ...
422 419  
423 420  
424 421  
... ... @@ -550,24 +547,27 @@
550 547 struct mips_abi *abi = current->thread.abi;
551 548 void *vdso = current->mm->context.vdso;
552 549  
553   - switch(regs->regs[0]) {
554   - case ERESTART_RESTARTBLOCK:
555   - case ERESTARTNOHAND:
556   - regs->regs[2] = EINTR;
557   - break;
558   - case ERESTARTSYS:
559   - if (!(ka->sa.sa_flags & SA_RESTART)) {
  550 + if (regs->regs[0]) {
  551 + switch(regs->regs[2]) {
  552 + case ERESTART_RESTARTBLOCK:
  553 + case ERESTARTNOHAND:
560 554 regs->regs[2] = EINTR;
561 555 break;
  556 + case ERESTARTSYS:
  557 + if (!(ka->sa.sa_flags & SA_RESTART)) {
  558 + regs->regs[2] = EINTR;
  559 + break;
  560 + }
  561 + /* fallthrough */
  562 + case ERESTARTNOINTR:
  563 + regs->regs[7] = regs->regs[26];
  564 + regs->regs[2] = regs->regs[0];
  565 + regs->cp0_epc -= 4;
562 566 }
563   - /* fallthrough */
564   - case ERESTARTNOINTR: /* Userland will reload $v0. */
565   - regs->regs[7] = regs->regs[26];
566   - regs->cp0_epc -= 8;
  567 +
  568 + regs->regs[0] = 0; /* Don't deal with this again. */
567 569 }
568 570  
569   - regs->regs[0] = 0; /* Don't deal with this again. */
570   -
571 571 if (sig_uses_siginfo(ka))
572 572 ret = abi->setup_rt_frame(vdso + abi->rt_signal_return_offset,
573 573 ka, regs, sig, oldset, info);
... ... @@ -575,6 +575,9 @@
575 575 ret = abi->setup_frame(vdso + abi->signal_return_offset,
576 576 ka, regs, sig, oldset);
577 577  
  578 + if (ret)
  579 + return ret;
  580 +
578 581 spin_lock_irq(&current->sighand->siglock);
579 582 sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
580 583 if (!(ka->sa.sa_flags & SA_NODEFER))
581 584  
582 585  
... ... @@ -622,17 +625,13 @@
622 625 return;
623 626 }
624 627  
625   - /*
626   - * Who's code doesn't conform to the restartable syscall convention
627   - * dies here!!! The li instruction, a single machine instruction,
628   - * must directly be followed by the syscall instruction.
629   - */
630 628 if (regs->regs[0]) {
631 629 if (regs->regs[2] == ERESTARTNOHAND ||
632 630 regs->regs[2] == ERESTARTSYS ||
633 631 regs->regs[2] == ERESTARTNOINTR) {
  632 + regs->regs[2] = regs->regs[0];
634 633 regs->regs[7] = regs->regs[26];
635   - regs->cp0_epc -= 8;
  634 + regs->cp0_epc -= 4;
636 635 }
637 636 if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
638 637 regs->regs[2] = current->thread.abi->restart;
arch/mips/kernel/signal_n32.c
... ... @@ -109,6 +109,7 @@
109 109 asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
110 110 {
111 111 struct rt_sigframe_n32 __user *frame;
  112 + mm_segment_t old_fs;
112 113 sigset_t set;
113 114 stack_t st;
114 115 s32 sp;
115 116  
... ... @@ -143,7 +144,11 @@
143 144  
144 145 /* It is more difficult to avoid calling this function than to
145 146 call it and ignore errors. */
  147 + old_fs = get_fs();
  148 + set_fs(KERNEL_DS);
146 149 do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
  150 + set_fs(old_fs);
  151 +
147 152  
148 153 /*
149 154 * Don't let your children do this ...
arch/mips/kernel/unaligned.c
... ... @@ -109,8 +109,6 @@
109 109 unsigned long value;
110 110 unsigned int res;
111 111  
112   - regs->regs[0] = 0;
113   -
114 112 /*
115 113 * This load never faults.
116 114 */