Skip to content

Commit b878a1c

Browse files
committed
Merge tag 'mips-fixes_6.14_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux
Pull MIPS fixes from Thomas Bogendoerfer: "Fix for o32 ptrace/get_syscall_info" * tag 'mips-fixes_6.14_1' of git://git.kernel.org/pub/scm/linux/kernel/git/mips/linux: MIPS: fix mips_get_syscall_arg() for o32 MIPS: Export syscall stack arguments properly for remote use
2 parents ad1b832 + 733a905 commit b878a1c

File tree

4 files changed

+20
-30
lines changed

4 files changed

+20
-30
lines changed

arch/mips/include/asm/ptrace.h

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,8 +27,8 @@
2727
*/
2828
struct pt_regs {
2929
#ifdef CONFIG_32BIT
30-
/* Pad bytes for argument save space on the stack. */
31-
unsigned long pad0[8];
30+
/* Saved syscall stack arguments; entries 0-3 unused. */
31+
unsigned long args[8];
3232
#endif
3333

3434
/* Saved main processor registers. */

arch/mips/include/asm/syscall.h

Lines changed: 8 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -57,37 +57,21 @@ static inline void mips_syscall_update_nr(struct task_struct *task,
5757
static inline void mips_get_syscall_arg(unsigned long *arg,
5858
struct task_struct *task, struct pt_regs *regs, unsigned int n)
5959
{
60-
unsigned long usp __maybe_unused = regs->regs[29];
61-
60+
#ifdef CONFIG_32BIT
6261
switch (n) {
6362
case 0: case 1: case 2: case 3:
6463
*arg = regs->regs[4 + n];
65-
66-
return;
67-
68-
#ifdef CONFIG_32BIT
69-
case 4: case 5: case 6: case 7:
70-
get_user(*arg, (int *)usp + n);
7164
return;
72-
#endif
73-
74-
#ifdef CONFIG_64BIT
7565
case 4: case 5: case 6: case 7:
76-
#ifdef CONFIG_MIPS32_O32
77-
if (test_tsk_thread_flag(task, TIF_32BIT_REGS))
78-
get_user(*arg, (int *)usp + n);
79-
else
80-
#endif
81-
*arg = regs->regs[4 + n];
82-
66+
*arg = regs->args[n];
8367
return;
84-
#endif
85-
86-
default:
87-
BUG();
8868
}
89-
90-
unreachable();
69+
#else
70+
*arg = regs->regs[4 + n];
71+
if ((IS_ENABLED(CONFIG_MIPS32_O32) &&
72+
test_tsk_thread_flag(task, TIF_32BIT_REGS)))
73+
*arg = (unsigned int)*arg;
74+
#endif
9175
}
9276

9377
static inline long syscall_get_error(struct task_struct *task,

arch/mips/kernel/asm-offsets.c

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,12 @@ void output_ptreg_defines(void);
2727
void output_ptreg_defines(void)
2828
{
2929
COMMENT("MIPS pt_regs offsets.");
30+
#ifdef CONFIG_32BIT
31+
OFFSET(PT_ARG4, pt_regs, args[4]);
32+
OFFSET(PT_ARG5, pt_regs, args[5]);
33+
OFFSET(PT_ARG6, pt_regs, args[6]);
34+
OFFSET(PT_ARG7, pt_regs, args[7]);
35+
#endif
3036
OFFSET(PT_R0, pt_regs, regs[0]);
3137
OFFSET(PT_R1, pt_regs, regs[1]);
3238
OFFSET(PT_R2, pt_regs, regs[2]);

arch/mips/kernel/scall32-o32.S

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -64,10 +64,10 @@ load_a6: user_lw(t7, 24(t0)) # argument #7 from usp
6464
load_a7: user_lw(t8, 28(t0)) # argument #8 from usp
6565
loads_done:
6666

67-
sw t5, 16(sp) # argument #5 to ksp
68-
sw t6, 20(sp) # argument #6 to ksp
69-
sw t7, 24(sp) # argument #7 to ksp
70-
sw t8, 28(sp) # argument #8 to ksp
67+
sw t5, PT_ARG4(sp) # argument #5 to ksp
68+
sw t6, PT_ARG5(sp) # argument #6 to ksp
69+
sw t7, PT_ARG6(sp) # argument #7 to ksp
70+
sw t8, PT_ARG7(sp) # argument #8 to ksp
7171
.set pop
7272

7373
.section __ex_table,"a"

0 commit comments

Comments
 (0)