syscall_get_arch: add "struct task_struct *" argument
Subsystems (24)
PATCH v2 13/13 syscall_get_arch: add "struct task_struct *" argument
This argument is required to extend the generic ptrace API with PTRACE_GET_SYSCALL_INFO request: syscall_get_arch() is going to be called from ptrace_request() along with syscall_get_nr(), syscall_get_arguments(), syscall_get_error(), and syscall_get_return_value() functions with a tracee as their argument.
The primary intent is that the triple (audit_arch, syscall_nr, arg1..arg6) should describe what system call is being called and what its arguments are.
Reverts: 5e937a9ae913 ("syscall_get_arch: remove useless function arguments")
Reverts: 1002d94d3076 ("syscall.h: fix doc text for syscall_get_arch()")
---
Notes:
v2: unchanged
arch/alpha/include/asm/syscall.h | 2 +- arch/arc/include/asm/syscall.h | 2 +- arch/arm/include/asm/syscall.h | 2 +- arch/arm64/include/asm/syscall.h | 4 ++-- arch/c6x/include/asm/syscall.h | 2 +- arch/csky/include/asm/syscall.h | 2 +- arch/h8300/include/asm/syscall.h | 2 +- arch/hexagon/include/asm/syscall.h | 2 +- arch/ia64/include/asm/syscall.h | 2 +- arch/m68k/include/asm/syscall.h | 2 +- arch/microblaze/include/asm/syscall.h | 2 +- arch/mips/include/asm/syscall.h | 6 +++--- arch/mips/kernel/ptrace.c | 2 +- arch/nds32/include/asm/syscall.h | 2 +- arch/nios2/include/asm/syscall.h | 2 +- arch/openrisc/include/asm/syscall.h | 2 +- arch/parisc/include/asm/syscall.h | 4 ++-- arch/powerpc/include/asm/syscall.h | 10 ++++++++-- arch/riscv/include/asm/syscall.h | 2 +- arch/s390/include/asm/syscall.h | 4 ++-- arch/sh/include/asm/syscall_32.h | 2 +- arch/sh/include/asm/syscall_64.h | 2 +- arch/sparc/include/asm/syscall.h | 5 +++-- arch/unicore32/include/asm/syscall.h | 2 +- arch/x86/include/asm/syscall.h | 8 +++++--- arch/x86/um/asm/syscall.h | 2 +- arch/xtensa/include/asm/syscall.h | 2 +- include/asm-generic/syscall.h | 5 +++-- kernel/auditsc.c | 4 ++-- kernel/seccomp.c | 4 ++-- 30 files changed, 52 insertions(+), 42 deletions(-)
arch/alpha/include/asm/syscall.h +1 -1
@@ -4,7 +4,7 @@#include <uapi/linux/audit.h> -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_ALPHA ; }
arch/arc/include/asm/syscall.h +1 -1
@@ -70,7 +70,7 @@ syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, }static inline int -syscall_get_arch (void ) +syscall_get_arch (struct task_struct *task) {return IS_ENABLED (CONFIG_ISA_ARCOMPACT ) ? (IS_ENABLED(CONFIG_CPU_BIG_ENDIAN)
arch/arm/include/asm/syscall.h +1 -1
@@ -104,7 +104,7 @@ static inline void syscall_set_arguments(struct task_struct *task,memcpy (®s->ARM_r0 + i, args, n *sizeof (args[0 ])); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {/* ARM tasks don't change audit architectures on the fly. */ return AUDIT_ARCH_ARM ;
arch/arm64/include/asm/syscall.h +2 -2
@@ -117,9 +117,9 @@ static inline void syscall_set_arguments(struct task_struct *task,* We don't care about endianness (__AUDIT_ARCH_LE bit) here because * AArch64 has the same system calls both on little- and big- endian. */ -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) { -if (is_compat_task ()) +if (is_compat_thread (task_thread_info (task)))return AUDIT_ARCH_ARM ;return AUDIT_ARCH_AARCH64 ;
arch/c6x/include/asm/syscall.h +1 -1
@@ -121,7 +121,7 @@ static inline void syscall_set_arguments(struct task_struct *task, } } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return IS_ENABLED (CONFIG_CPU_BIG_ENDIAN ) ?AUDIT_ARCH_C6XBE :AUDIT_ARCH_C6X ;
arch/csky/include/asm/syscall.h +1 -1
@@ -70,7 +70,7 @@ syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, }static inline int -syscall_get_arch (void ) +syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_CSKY ; }
arch/h8300/include/asm/syscall.h +1 -1
@@ -49,7 +49,7 @@ syscall_get_arguments(struct task_struct *task, struct pt_regs *regs, }static inline int -syscall_get_arch (void ) +syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_H8300 ; }
arch/hexagon/include/asm/syscall.h +1 -1
@@ -46,7 +46,7 @@ static inline void syscall_get_arguments(struct task_struct *task,memcpy (args, &(®s->r00)[i], n *sizeof (args[0 ])); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_HEXAGON ; }
arch/ia64/include/asm/syscall.h +1 -1
@@ -81,7 +81,7 @@ static inline void syscall_set_arguments(struct task_struct *task,ia64_syscall_get_set_arguments (task, regs, i, n, args,1 ); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_IA64 ; }
arch/m68k/include/asm/syscall.h +1 -1
@@ -4,7 +4,7 @@#include <uapi/linux/audit.h> -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_M68K ; }
arch/microblaze/include/asm/syscall.h +1 -1
@@ -101,7 +101,7 @@ static inline void syscall_set_arguments(struct task_struct *task,asmlinkage unsigned long do_syscall_trace_enter (struct pt_regs *regs); asmlinkage void do_syscall_trace_leave(struct pt_regs *regs); -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_MICROBLAZE ; }
arch/mips/include/asm/syscall.h +3 -3
@@ -140,14 +140,14 @@ extern const unsigned long sys_call_table[];extern const unsigned long sys32_call_table[];extern const unsigned long sysn32_call_table[]; -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {int arch =AUDIT_ARCH_MIPS ;#ifdef CONFIG_64BIT -if (!test_thread_flag (TIF_32BIT_REGS )) { +if (!test_tsk_thread_flag (task,TIF_32BIT_REGS )) { arch |= __AUDIT_ARCH_64BIT;/* N32 sets only TIF_32BIT_ADDR */ -if (test_thread_flag (TIF_32BIT_ADDR )) +if (test_tsk_thread_flag (task,TIF_32BIT_ADDR )) arch |= __AUDIT_ARCH_CONVENTION_MIPS64_N32; }#endif
arch/mips/kernel/ptrace.c +1 -1
@@ -1418,7 +1418,7 @@ asmlinkage long syscall_trace_enter(struct pt_regs *regs, long syscall)unsigned long args[6 ]; sd.nr = syscall; - sd.arch =syscall_get_arch (); + sd.arch =syscall_get_arch (current);syscall_get_arguments (current, regs,0 ,6 , args);for (i =0 ; i <6 ; i++) sd.args[i] = args[i];
arch/nds32/include/asm/syscall.h +1 -1
@@ -188,7 +188,7 @@ void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs, }static inline int -syscall_get_arch (void ) +syscall_get_arch (struct task_struct *task) {return IS_ENABLED (CONFIG_CPU_BIG_ENDIAN ) ?AUDIT_ARCH_NDS32BE :AUDIT_ARCH_NDS32 ;
arch/nios2/include/asm/syscall.h +1 -1
@@ -136,7 +136,7 @@ static inline void syscall_set_arguments(struct task_struct *task, } } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_NIOS2 ; }
arch/openrisc/include/asm/syscall.h +1 -1
@@ -72,7 +72,7 @@ syscall_set_arguments(struct task_struct *task, struct pt_regs *regs,memcpy (®s->gpr[3 + i], args, n *sizeof (args[0 ])); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_OPENRISC ; }
arch/parisc/include/asm/syscall.h +2 -2
@@ -62,11 +62,11 @@ static inline void syscall_rollback(struct task_struct *task,/* do nothing */ } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {int arch =AUDIT_ARCH_PARISC ;#ifdef CONFIG_64BIT -if (!is_compat_task ()) +if (!__is_compat_task (task)) arch =AUDIT_ARCH_PARISC64 ;#endif return arch;
arch/powerpc/include/asm/syscall.h +8 -2
@@ -99,9 +99,15 @@ static inline void syscall_set_arguments(struct task_struct *task, regs->orig_gpr3 = args[0 ]; } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) { -int arch =is_32bit_task () ?AUDIT_ARCH_PPC :AUDIT_ARCH_PPC64 ; +int arch; + +if (IS_ENABLED (CONFIG_PPC64 ) && !test_tsk_thread_flag (task,TIF_32BIT )) + arch =AUDIT_ARCH_PPC64 ; +else + arch =AUDIT_ARCH_PPC ; +#ifdef __LITTLE_ENDIAN__ arch |= __AUDIT_ARCH_LE;#endif
arch/riscv/include/asm/syscall.h +1 -1
@@ -100,7 +100,7 @@ static inline void syscall_set_arguments(struct task_struct *task,memcpy (®s->a1 + i *sizeof (regs->a1), args, n *sizeof (regs->a0)); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {#ifdef CONFIG_64BIT return AUDIT_ARCH_RISCV64 ;
arch/s390/include/asm/syscall.h +2 -2
@@ -92,10 +92,10 @@ static inline void syscall_set_arguments(struct task_struct *task, regs->orig_gpr2 = args[0 ]; } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {#ifdef CONFIG_COMPAT -if (test_tsk_thread_flag (current,TIF_31BIT )) +if (test_tsk_thread_flag (task,TIF_31BIT ))return AUDIT_ARCH_S390 ;#endif return AUDIT_ARCH_S390X ;
arch/sh/include/asm/syscall_32.h +1 -1
@@ -95,7 +95,7 @@ static inline void syscall_set_arguments(struct task_struct *task, } } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {int arch =AUDIT_ARCH_SH ;
arch/sh/include/asm/syscall_64.h +1 -1
@@ -63,7 +63,7 @@ static inline void syscall_set_arguments(struct task_struct *task,memcpy (®s->regs[2 + i], args, n *sizeof (args[0 ])); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {int arch =AUDIT_ARCH_SH ;
arch/sparc/include/asm/syscall.h +3 -2
@@ -128,10 +128,11 @@ static inline void syscall_set_arguments(struct task_struct *task, regs->u_regs[UREG_I0 + i + j] = args[j]; } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {#if defined(CONFIG_SPARC64 ) && defined(CONFIG_COMPAT ) -return in_compat_syscall () ?AUDIT_ARCH_SPARC :AUDIT_ARCH_SPARC64 ; +return test_tsk_thread_flag (task,TIF_32BIT ) + ?AUDIT_ARCH_SPARC :AUDIT_ARCH_SPARC64 ;#elif defined(CONFIG_SPARC64 )return AUDIT_ARCH_SPARC64 ;#else
arch/unicore32/include/asm/syscall.h +1 -1
@@ -4,7 +4,7 @@#include <uapi/linux/audit.h> -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_UNICORE ; }
arch/x86/include/asm/syscall.h +5 -3
@@ -107,7 +107,7 @@ static inline void syscall_set_arguments(struct task_struct *task,memcpy (®s->bx + i, args, n *sizeof (args[0 ])); } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_I386 ; }
@@ -236,10 +236,12 @@ static inline void syscall_set_arguments(struct task_struct *task, } } -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {/* x32 tasks should be considered AUDIT_ARCH_X86_64. */ -return in_ia32_syscall () ?AUDIT_ARCH_I386 :AUDIT_ARCH_X86_64 ; +return (IS_ENABLED (CONFIG_IA32_EMULATION ) && + task->thread_info.status &TS_COMPAT ) + ?AUDIT_ARCH_I386 :AUDIT_ARCH_X86_64 ; }#endif /* CONFIG_X86_32 */
arch/x86/um/asm/syscall.h +1 -1
@@ -9,7 +9,7 @@ typedef asmlinkage long (*sys_call_ptr_t)(unsigned long, unsigned long, unsigned long, unsigned long, unsigned long, unsigned long); -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {#ifdef CONFIG_X86_32 return AUDIT_ARCH_I386 ;
arch/xtensa/include/asm/syscall.h +1 -1
@@ -14,7 +14,7 @@#include <asm/ptrace.h> #include <uapi/linux/audit.h> -static inline int syscall_get_arch (void ) +static inline int syscall_get_arch (struct task_struct *task) {return AUDIT_ARCH_XTENSA ; }
include/asm-generic/syscall.h +3 -2
@@ -144,14 +144,15 @@ void syscall_set_arguments(struct task_struct *task, struct pt_regs *regs,/** * syscall_get_arch - return the AUDIT_ARCH for the current system call +* @task: task of interest, must be blocked * * Returns the AUDIT_ARCH_* based on the system call convention in use. * -* It's only valid to call this when current is stopped on entry to a system +* It's only valid to call this when @task is stopped on entry to a system * call, due to %TIF_SYSCALL_TRACE, %TIF_SYSCALL_AUDIT, or %TIF_SECCOMP. * * Architectures which permit CONFIG_HAVE_ARCH_SECCOMP_FILTER must * provide an implementation of this. */ -int syscall_get_arch (void ); +int syscall_get_arch (struct task_struct *task);#endif /* _ASM_SYSCALL_H */
kernel/auditsc.c +2 -2
@@ -1628,7 +1628,7 @@ void __audit_syscall_entry(int major, unsigned long a1, unsigned long a2,return ; } - context->arch =syscall_get_arch (); + context->arch =syscall_get_arch (current); context->major = major; context->argv[0 ] = a1; context->argv[1 ] = a2;
@@ -2580,7 +2580,7 @@ void audit_seccomp(unsigned long syscall, long signr, int code)return ;audit_log_task (ab);audit_log_format (ab," sig=%ld arch=%x syscall=%ld compat=%d ip=0x%lx code=0x%x" , - signr,syscall_get_arch (), syscall, + signr,syscall_get_arch (current), syscall,in_compat_syscall (),KSTK_EIP (current), code);audit_log_end (ab); }
kernel/seccomp.c +2 -2
@@ -148,7 +148,7 @@ static void populate_seccomp_data(struct seccomp_data *sd)unsigned long args[6 ]; sd->nr =syscall_get_nr (task, regs); - sd->arch =syscall_get_arch (); + sd->arch =syscall_get_arch (task);syscall_get_arguments (task, regs,0 ,6 , args); sd->args[0 ] = args[0 ]; sd->args[1 ] = args[1 ];
@@ -591,7 +591,7 @@ static void seccomp_init_siginfo(kernel_siginfo_t *info, int syscall, int reason info->si_code =SYS_SECCOMP ; info->si_call_addr = (void __user *)KSTK_EIP (current); info->si_errno = reason; - info->si_arch =syscall_get_arch (); + info->si_arch =syscall_get_arch (current); info->si_syscall = syscall; }
Signature · 1 line
ldv
Quoted 74 lines · Dmitry V. Levin
This argument is required to extend the generic ptrace API with
PTRACE_GET_SYSCALL_INFOrequest:syscall_get_arch()is going to be called fromptrace_request()along withsyscall_get_nr(),syscall_get_arguments(),syscall_get_error(), andsyscall_get_return_value()functions with a tracee as their argument.The primary intent is that the triple (
audit_arch,syscall_nr, arg1..arg6) should describe what system call is being called and what its arguments are.Reverts:
5e937a9ae913("syscall_get_arch: remove useless function arguments")
Reverts:1002d94d3076("syscall.h: fix doc text forsyscall_get_arch()")Reviewed-by Andy Lutomirski <[email protected]> # for x86Reviewed-by Palmer Dabbelt <[email protected]>Acked-by Paul Moore <[email protected]>Cc Elvira Khabirova <[email protected]>Cc Eugene Syromyatnikov <[email protected]>Cc Oleg Nesterov <[email protected]>Signed-off-by Dmitry V. Levin <[email protected]>---
Notes:
v2: unchangedarch/alpha/include/asm/syscall.h | 2 +- arch/arc/include/asm/syscall.h | 2 +- arch/arm/include/asm/syscall.h | 2 +- arch/arm64/include/asm/syscall.h | 4 ++-- arch/c6x/include/asm/syscall.h | 2 +- arch/csky/include/asm/syscall.h | 2 +- arch/h8300/include/asm/syscall.h | 2 +- arch/hexagon/include/asm/syscall.h | 2 +- arch/ia64/include/asm/syscall.h | 2 +- arch/m68k/include/asm/syscall.h | 2 +- arch/microblaze/include/asm/syscall.h | 2 +- arch/mips/include/asm/syscall.h | 6 +++--- arch/mips/kernel/ptrace.c | 2 +- arch/nds32/include/asm/syscall.h | 2 +- arch/nios2/include/asm/syscall.h | 2 +- arch/openrisc/include/asm/syscall.h | 2 +- arch/parisc/include/asm/syscall.h | 4 ++-- arch/powerpc/include/asm/syscall.h | 10 ++++++++-- arch/riscv/include/asm/syscall.h | 2 +- arch/s390/include/asm/syscall.h | 4 ++-- arch/sh/include/asm/syscall_32.h | 2 +- arch/sh/include/asm/syscall_64.h | 2 +- arch/sparc/include/asm/syscall.h | 5 +++--
Quoted 8 lines
arch/unicore32/include/asm/syscall.h | 2 +- arch/x86/include/asm/syscall.h | 8 +++++--- arch/x86/um/asm/syscall.h | 2 +- arch/xtensa/include/asm/syscall.h | 2 +- include/asm-generic/syscall.h | 5 +++-- kernel/auditsc.c | 4 ++-- kernel/seccomp.c | 4 ++-- 30 files changed, 52 insertions(+), 42 deletions(-)
Merged into audit/next, thanks everyone.
Signature · 2 lines
paul moore www.paul-moore.com