Skip to content

Commit 547af56

Browse files
committed
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
2 parents b0579fc + a35bee8 commit 547af56

File tree

12 files changed

+53
-44
lines changed

12 files changed

+53
-44
lines changed

arch/mips/Kconfig

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -881,11 +881,15 @@ config NO_IOPORT
881881
config GENERIC_ISA_DMA
882882
bool
883883
select ZONE_DMA if GENERIC_ISA_DMA_SUPPORT_BROKEN=n
884+
select ISA_DMA_API
884885

885886
config GENERIC_ISA_DMA_SUPPORT_BROKEN
886887
bool
887888
select GENERIC_ISA_DMA
888889

890+
config ISA_DMA_API
891+
bool
892+
889893
config GENERIC_GPIO
890894
bool
891895

arch/mips/boot/compressed/Makefile

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -105,4 +105,4 @@ OBJCOPYFLAGS_vmlinuz.srec := $(OBJCOPYFLAGS) -S -O srec
105105
vmlinuz.srec: vmlinuz
106106
$(call cmd,objcopy)
107107

108-
clean-files := $(objtree)/vmlinuz.*
108+
clean-files := $(objtree)/vmlinuz $(objtree)/vmlinuz.{32,ecoff,bin,srec}

arch/mips/include/asm/fcntl.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,6 +56,7 @@
5656
*/
5757

5858
#ifdef CONFIG_32BIT
59+
#include <linux/types.h>
5960

6061
struct flock {
6162
short l_type;

arch/mips/kernel/branch.c

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@ int __compute_return_epc(struct pt_regs *regs)
4040
return -EFAULT;
4141
}
4242

43-
regs->regs[0] = 0;
4443
switch (insn.i_format.opcode) {
4544
/*
4645
* jr and jalr are in r_format format.

arch/mips/kernel/ptrace.c

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -536,7 +536,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
536536
{
537537
/* do the secure computing check first */
538538
if (!entryexit)
539-
secure_computing(regs->regs[0]);
539+
secure_computing(regs->regs[2]);
540540

541541
if (unlikely(current->audit_context) && entryexit)
542542
audit_syscall_exit(AUDITSC_RESULT(regs->regs[2]),
@@ -565,7 +565,7 @@ asmlinkage void do_syscall_trace(struct pt_regs *regs, int entryexit)
565565

566566
out:
567567
if (unlikely(current->audit_context) && !entryexit)
568-
audit_syscall_entry(audit_arch(), regs->regs[0],
568+
audit_syscall_entry(audit_arch(), regs->regs[2],
569569
regs->regs[4], regs->regs[5],
570570
regs->regs[6], regs->regs[7]);
571571
}

arch/mips/kernel/scall32-o32.S

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -63,9 +63,9 @@ stack_done:
6363
sw t0, PT_R7(sp) # set error flag
6464
beqz t0, 1f
6565

66+
lw t1, PT_R2(sp) # syscall number
6667
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
6969
1: sw v0, PT_R2(sp) # result
7070

7171
o32_syscall_exit:
@@ -104,9 +104,9 @@ syscall_trace_entry:
104104
sw t0, PT_R7(sp) # set error flag
105105
beqz t0, 1f
106106

107+
lw t1, PT_R2(sp) # syscall number
107108
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
110110
1: sw v0, PT_R2(sp) # result
111111

112112
j syscall_exit
@@ -169,8 +169,7 @@ stackargs:
169169
* We probably should handle this case a bit more drastic.
170170
*/
171171
bad_stack:
172-
negu v0 # error
173-
sw v0, PT_R0(sp)
172+
li v0, EFAULT
174173
sw v0, PT_R2(sp)
175174
li t0, 1 # set error flag
176175
sw t0, PT_R7(sp)

arch/mips/kernel/scall64-64.S

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -66,9 +66,9 @@ NESTED(handle_sys64, PT_SIZE, sp)
6666
sd t0, PT_R7(sp) # set error flag
6767
beqz t0, 1f
6868

69+
ld t1, PT_R2(sp) # syscall number
6970
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
7272
1: sd v0, PT_R2(sp) # result
7373

7474
n64_syscall_exit:
@@ -109,8 +109,9 @@ syscall_trace_entry:
109109
sd t0, PT_R7(sp) # set error flag
110110
beqz t0, 1f
111111

112+
ld t1, PT_R2(sp) # syscall number
112113
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
114115
1: sd v0, PT_R2(sp) # result
115116

116117
j syscall_exit

arch/mips/kernel/scall64-n32.S

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -65,8 +65,9 @@ NESTED(handle_sysn32, PT_SIZE, sp)
6565
sd t0, PT_R7(sp) # set error flag
6666
beqz t0, 1f
6767

68+
ld t1, PT_R2(sp) # syscall number
6869
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
7071
1: sd v0, PT_R2(sp) # result
7172

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

110+
ld t1, PT_R2(sp) # syscall number
109111
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
111113
1: sd v0, PT_R2(sp) # result
112114

113115
j syscall_exit

arch/mips/kernel/scall64-o32.S

Lines changed: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -93,8 +93,9 @@ NESTED(handle_sys, PT_SIZE, sp)
9393
sd t0, PT_R7(sp) # set error flag
9494
beqz t0, 1f
9595

96+
ld t1, PT_R2(sp) # syscall number
9697
dnegu v0 # error
97-
sd v0, PT_R0(sp) # flag for syscall restarting
98+
sd t1, PT_R0(sp) # save it for syscall restarting
9899
1: sd v0, PT_R2(sp) # result
99100

100101
o32_syscall_exit:
@@ -142,8 +143,9 @@ trace_a_syscall:
142143
sd t0, PT_R7(sp) # set error flag
143144
beqz t0, 1f
144145

146+
ld t1, PT_R2(sp) # syscall number
145147
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
147149
1: sd v0, PT_R2(sp) # result
148150

149151
j syscall_exit
@@ -154,8 +156,7 @@ trace_a_syscall:
154156
* The stackpointer for a call with more than 4 arguments is bad.
155157
*/
156158
bad_stack:
157-
dnegu v0 # error
158-
sd v0, PT_R0(sp)
159+
li v0, EFAULT
159160
sd v0, PT_R2(sp)
160161
li t0, 1 # set error flag
161162
sd t0, PT_R7(sp)

arch/mips/kernel/signal.c

Lines changed: 22 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -390,7 +390,6 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
390390
{
391391
struct rt_sigframe __user *frame;
392392
sigset_t set;
393-
stack_t st;
394393
int sig;
395394

396395
frame = (struct rt_sigframe __user *) regs.regs[29];
@@ -411,11 +410,9 @@ asmlinkage void sys_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
411410
else if (sig)
412411
force_sig(sig, current);
413412

414-
if (__copy_from_user(&st, &frame->rs_uc.uc_stack, sizeof(st)))
415-
goto badframe;
416413
/* It is more difficult to avoid calling this function than to
417414
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]);
419416

420417
/*
421418
* Don't let your children do this ...
@@ -550,23 +547,26 @@ static int handle_signal(unsigned long sig, siginfo_t *info,
550547
struct mips_abi *abi = current->thread.abi;
551548
void *vdso = current->mm->context.vdso;
552549

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:
560554
regs->regs[2] = EINTR;
561555
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;
562566
}
563-
/* fallthrough */
564-
case ERESTARTNOINTR: /* Userland will reload $v0. */
565-
regs->regs[7] = regs->regs[26];
566-
regs->cp0_epc -= 8;
567-
}
568567

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

571571
if (sig_uses_siginfo(ka))
572572
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,
575575
ret = abi->setup_frame(vdso + abi->signal_return_offset,
576576
ka, regs, sig, oldset);
577577

578+
if (ret)
579+
return ret;
580+
578581
spin_lock_irq(&current->sighand->siglock);
579582
sigorsets(&current->blocked, &current->blocked, &ka->sa.sa_mask);
580583
if (!(ka->sa.sa_flags & SA_NODEFER))
@@ -622,17 +625,13 @@ static void do_signal(struct pt_regs *regs)
622625
return;
623626
}
624627

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-
*/
630628
if (regs->regs[0]) {
631629
if (regs->regs[2] == ERESTARTNOHAND ||
632630
regs->regs[2] == ERESTARTSYS ||
633631
regs->regs[2] == ERESTARTNOINTR) {
632+
regs->regs[2] = regs->regs[0];
634633
regs->regs[7] = regs->regs[26];
635-
regs->cp0_epc -= 8;
634+
regs->cp0_epc -= 4;
636635
}
637636
if (regs->regs[2] == ERESTART_RESTARTBLOCK) {
638637
regs->regs[2] = current->thread.abi->restart;

arch/mips/kernel/signal_n32.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,7 @@ asmlinkage int sysn32_rt_sigsuspend(nabi_no_regargs struct pt_regs regs)
109109
asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
110110
{
111111
struct rt_sigframe_n32 __user *frame;
112+
mm_segment_t old_fs;
112113
sigset_t set;
113114
stack_t st;
114115
s32 sp;
@@ -143,7 +144,11 @@ asmlinkage void sysn32_rt_sigreturn(nabi_no_regargs struct pt_regs regs)
143144

144145
/* It is more difficult to avoid calling this function than to
145146
call it and ignore errors. */
147+
old_fs = get_fs();
148+
set_fs(KERNEL_DS);
146149
do_sigaltstack((stack_t __user *)&st, NULL, regs.regs[29]);
150+
set_fs(old_fs);
151+
147152

148153
/*
149154
* Don't let your children do this ...

arch/mips/kernel/unaligned.c

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ static void emulate_load_store_insn(struct pt_regs *regs,
109109
unsigned long value;
110110
unsigned int res;
111111

112-
regs->regs[0] = 0;
113-
114112
/*
115113
* This load never faults.
116114
*/

0 commit comments

Comments
 (0)