Commit 547af560ddbfe469ada2cad3009cbcfde313d73c
Exists in
master
and in
39 other branches
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
- arch/mips/Kconfig
- arch/mips/boot/compressed/Makefile
- arch/mips/include/asm/fcntl.h
- arch/mips/kernel/branch.c
- arch/mips/kernel/ptrace.c
- arch/mips/kernel/scall32-o32.S
- arch/mips/kernel/scall64-64.S
- arch/mips/kernel/scall64-n32.S
- arch/mips/kernel/scall64-o32.S
- arch/mips/kernel/signal.c
- arch/mips/kernel/signal_n32.c
- arch/mips/kernel/unaligned.c
arch/mips/Kconfig
... | ... | @@ -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
arch/mips/include/asm/fcntl.h
arch/mips/kernel/branch.c
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(¤t->sighand->siglock); |
579 | 582 | sigorsets(¤t->blocked, ¤t->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 ... |