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:
commit
547af560dd
|
@ -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
|
||||||
|
|
||||||
|
|
|
@ -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}
|
||||||
|
|
|
@ -56,6 +56,7 @@
|
||||||
*/
|
*/
|
||||||
|
|
||||||
#ifdef CONFIG_32BIT
|
#ifdef CONFIG_32BIT
|
||||||
|
#include <linux/types.h>
|
||||||
|
|
||||||
struct flock {
|
struct flock {
|
||||||
short l_type;
|
short l_type;
|
||||||
|
|
|
@ -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.
|
||||||
|
|
|
@ -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]);
|
||||||
}
|
}
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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
|
||||||
|
|
|
@ -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)
|
||||||
|
|
|
@ -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(¤t->sighand->siglock);
|
spin_lock_irq(¤t->sighand->siglock);
|
||||||
sigorsets(¤t->blocked, ¤t->blocked, &ka->sa.sa_mask);
|
sigorsets(¤t->blocked, ¤t->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;
|
||||||
|
|
|
@ -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 ...
|
||||||
|
|
|
@ -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.
|
||||||
*/
|
*/
|
||||||
|
|
Loading…
Reference in New Issue