Merge branch 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus
Pull MIPS fixes from Ralf Baechle: "The two indirect syscall fixes have sat in linux-next for a few days. I did check back with a hardware designer to ensure a SYNC is really what's required for the GIC fix and so the GIC fix didn't make it into to linux-next in time for this final pull request. It builds in local build tests and passes Imagination's test system" * 'upstream' of git://git.linux-mips.org/pub/scm/ralf/upstream-linus: irqchip: mips-gic: SYNC after enabling GIC region MIPS: Remove pt_regs adjustments in indirect syscall handler MIPS: seccomp: Fix indirect syscall args
This commit is contained in:
commit
5e3b19d816
@ -872,15 +872,13 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall)
|
||||
if (unlikely(test_thread_flag(TIF_SECCOMP))) {
|
||||
int ret, i;
|
||||
struct seccomp_data sd;
|
||||
unsigned long args[6];
|
||||
|
||||
sd.nr = syscall;
|
||||
sd.arch = syscall_get_arch();
|
||||
for (i = 0; i < 6; i++) {
|
||||
unsigned long v, r;
|
||||
|
||||
r = mips_get_syscall_arg(&v, current, regs, i);
|
||||
sd.args[i] = r ? 0 : v;
|
||||
}
|
||||
syscall_get_arguments(current, regs, 0, 6, args);
|
||||
for (i = 0; i < 6; i++)
|
||||
sd.args[i] = args[i];
|
||||
sd.instruction_pointer = KSTK_EIP(current);
|
||||
|
||||
ret = __secure_computing(&sd);
|
||||
|
@ -190,12 +190,6 @@ illegal_syscall:
|
||||
sll t1, t0, 2
|
||||
beqz v0, einval
|
||||
lw t2, sys_call_table(t1) # syscall routine
|
||||
sw a0, PT_R2(sp) # call routine directly on restart
|
||||
|
||||
/* Some syscalls like execve get their arguments from struct pt_regs
|
||||
and claim zero arguments in the syscall table. Thus we have to
|
||||
assume the worst case and shuffle around all potential arguments.
|
||||
If you want performance, don't use indirect syscalls. */
|
||||
|
||||
move a0, a1 # shift argument registers
|
||||
move a1, a2
|
||||
@ -207,11 +201,6 @@ illegal_syscall:
|
||||
sw t4, 16(sp)
|
||||
sw t5, 20(sp)
|
||||
sw t6, 24(sp)
|
||||
sw a0, PT_R4(sp) # .. and push back a0 - a3, some
|
||||
sw a1, PT_R5(sp) # syscalls expect them there
|
||||
sw a2, PT_R6(sp)
|
||||
sw a3, PT_R7(sp)
|
||||
sw a3, PT_R26(sp) # update a3 for syscall restarting
|
||||
jr t2
|
||||
/* Unreached */
|
||||
|
||||
|
@ -198,7 +198,6 @@ LEAF(sys32_syscall)
|
||||
dsll t1, t0, 3
|
||||
beqz v0, einval
|
||||
ld t2, sys32_call_table(t1) # syscall routine
|
||||
sd a0, PT_R2(sp) # call routine directly on restart
|
||||
|
||||
move a0, a1 # shift argument registers
|
||||
move a1, a2
|
||||
@ -207,11 +206,6 @@ LEAF(sys32_syscall)
|
||||
move a4, a5
|
||||
move a5, a6
|
||||
move a6, a7
|
||||
sd a0, PT_R4(sp) # ... and push back a0 - a3, some
|
||||
sd a1, PT_R5(sp) # syscalls expect them there
|
||||
sd a2, PT_R6(sp)
|
||||
sd a3, PT_R7(sp)
|
||||
sd a3, PT_R26(sp) # update a3 for syscall restarting
|
||||
jr t2
|
||||
/* Unreached */
|
||||
|
||||
|
@ -1020,8 +1020,11 @@ static int __init gic_of_init(struct device_node *node,
|
||||
gic_len = resource_size(&res);
|
||||
}
|
||||
|
||||
if (mips_cm_present())
|
||||
if (mips_cm_present()) {
|
||||
write_gcr_gic_base(gic_base | CM_GCR_GIC_BASE_GICEN_MSK);
|
||||
/* Ensure GIC region is enabled before trying to access it */
|
||||
__sync();
|
||||
}
|
||||
gic_present = true;
|
||||
|
||||
__gic_init(gic_base, gic_len, cpu_vec, 0, node);
|
||||
|
Loading…
Reference in New Issue
Block a user